• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "extensions/browser/renderer_startup_helper.h"
6 
7 #include "base/values.h"
8 #include "components/keyed_service/content/browser_context_dependency_manager.h"
9 #include "content/public/browser/notification_service.h"
10 #include "content/public/browser/notification_types.h"
11 #include "content/public/browser/render_process_host.h"
12 #include "extensions/browser/extension_function_dispatcher.h"
13 #include "extensions/browser/extension_registry.h"
14 #include "extensions/browser/extensions_browser_client.h"
15 #include "extensions/common/extension_messages.h"
16 #include "extensions/common/extension_set.h"
17 #include "extensions/common/extensions_client.h"
18 #include "ui/base/webui/web_ui_util.h"
19 
20 using content::BrowserContext;
21 
22 namespace extensions {
23 
RendererStartupHelper(BrowserContext * browser_context)24 RendererStartupHelper::RendererStartupHelper(BrowserContext* browser_context)
25     : browser_context_(browser_context) {
26   DCHECK(browser_context);
27   registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED,
28                  content::NotificationService::AllBrowserContextsAndSources());
29 }
30 
~RendererStartupHelper()31 RendererStartupHelper::~RendererStartupHelper() {}
32 
Observe(int type,const content::NotificationSource & source,const content::NotificationDetails & details)33 void RendererStartupHelper::Observe(
34     int type,
35     const content::NotificationSource& source,
36     const content::NotificationDetails& details) {
37   switch (type) {
38     case content::NOTIFICATION_RENDERER_PROCESS_CREATED: {
39       content::RenderProcessHost* process =
40           content::Source<content::RenderProcessHost>(source).ptr();
41       if (!ExtensionsBrowserClient::Get()->IsSameContext(
42                browser_context_, process->GetBrowserContext()))
43         break;
44 
45       // Platform apps need to know the system font.
46       scoped_ptr<base::DictionaryValue> fonts(new base::DictionaryValue);
47       webui::SetFontAndTextDirection(fonts.get());
48       std::string font_family, font_size;
49       fonts->GetString("fontfamily", &font_family);
50       fonts->GetString("fontsize", &font_size);
51       process->Send(new ExtensionMsg_SetSystemFont(
52           font_family, font_size));
53 
54       // Valid extension function names, used to setup bindings in renderer.
55       std::vector<std::string> function_names;
56       ExtensionFunctionDispatcher::GetAllFunctionNames(&function_names);
57       process->Send(new ExtensionMsg_SetFunctionNames(function_names));
58 
59       // Scripting whitelist. This is modified by tests and must be communicated
60       // to renderers.
61       process->Send(new ExtensionMsg_SetScriptingWhitelist(
62           extensions::ExtensionsClient::Get()->GetScriptingWhitelist()));
63 
64       // Loaded extensions.
65       std::vector<ExtensionMsg_Loaded_Params> loaded_extensions;
66       const ExtensionSet& extensions =
67           ExtensionRegistry::Get(browser_context_)->enabled_extensions();
68       for (ExtensionSet::const_iterator iter = extensions.begin();
69            iter != extensions.end(); ++iter) {
70         // Renderers don't need to know about themes.
71         if (!(*iter)->is_theme())
72           loaded_extensions.push_back(ExtensionMsg_Loaded_Params(iter->get()));
73       }
74       process->Send(new ExtensionMsg_Loaded(loaded_extensions));
75       break;
76     }
77     default:
78       NOTREACHED();
79       break;
80   }
81 }
82 
83 //////////////////////////////////////////////////////////////////////////////
84 
85 // static
GetForBrowserContext(BrowserContext * context)86 RendererStartupHelper* RendererStartupHelperFactory::GetForBrowserContext(
87     BrowserContext* context) {
88   return static_cast<RendererStartupHelper*>(
89       GetInstance()->GetServiceForBrowserContext(context, true));
90 }
91 
92 // static
GetInstance()93 RendererStartupHelperFactory* RendererStartupHelperFactory::GetInstance() {
94   return Singleton<RendererStartupHelperFactory>::get();
95 }
96 
RendererStartupHelperFactory()97 RendererStartupHelperFactory::RendererStartupHelperFactory()
98     : BrowserContextKeyedServiceFactory(
99           "RendererStartupHelper",
100           BrowserContextDependencyManager::GetInstance()) {
101   // No dependencies on other services.
102 }
103 
~RendererStartupHelperFactory()104 RendererStartupHelperFactory::~RendererStartupHelperFactory() {}
105 
BuildServiceInstanceFor(content::BrowserContext * context) const106 KeyedService* RendererStartupHelperFactory::BuildServiceInstanceFor(
107     content::BrowserContext* context) const {
108   return new RendererStartupHelper(context);
109 }
110 
GetBrowserContextToUse(BrowserContext * context) const111 BrowserContext* RendererStartupHelperFactory::GetBrowserContextToUse(
112     BrowserContext* context) const {
113   // Redirected in incognito.
114   return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
115 }
116 
ServiceIsCreatedWithBrowserContext() const117 bool RendererStartupHelperFactory::ServiceIsCreatedWithBrowserContext() const {
118   return true;
119 }
120 
121 }  // namespace extensions
122