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
20using content::BrowserContext;
21
22namespace extensions {
23
24RendererStartupHelper::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
31RendererStartupHelper::~RendererStartupHelper() {}
32
33void 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
86RendererStartupHelper* RendererStartupHelperFactory::GetForBrowserContext(
87    BrowserContext* context) {
88  return static_cast<RendererStartupHelper*>(
89      GetInstance()->GetServiceForBrowserContext(context, true));
90}
91
92// static
93RendererStartupHelperFactory* RendererStartupHelperFactory::GetInstance() {
94  return Singleton<RendererStartupHelperFactory>::get();
95}
96
97RendererStartupHelperFactory::RendererStartupHelperFactory()
98    : BrowserContextKeyedServiceFactory(
99          "RendererStartupHelper",
100          BrowserContextDependencyManager::GetInstance()) {
101  // No dependencies on other services.
102}
103
104RendererStartupHelperFactory::~RendererStartupHelperFactory() {}
105
106KeyedService* RendererStartupHelperFactory::BuildServiceInstanceFor(
107    content::BrowserContext* context) const {
108  return new RendererStartupHelper(context);
109}
110
111BrowserContext* RendererStartupHelperFactory::GetBrowserContextToUse(
112    BrowserContext* context) const {
113  // Redirected in incognito.
114  return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
115}
116
117bool RendererStartupHelperFactory::ServiceIsCreatedWithBrowserContext() const {
118  return true;
119}
120
121}  // namespace extensions
122