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.
5 #include "extensions/shell/browser/shell_extensions_browser_client.h"
7 #include "base/prefs/pref_service.h"
8 #include "base/prefs/pref_service_factory.h"
9 #include "base/prefs/testing_pref_store.h"
10 #include "components/pref_registry/pref_registry_syncable.h"
11 #include "components/user_prefs/user_prefs.h"
12 #include "extensions/browser/app_sorting.h"
13 #include "extensions/browser/extension_function_registry.h"
14 #include "extensions/browser/extension_host_delegate.h"
15 #include "extensions/browser/extension_prefs.h"
16 #include "extensions/common/api/generated_api.h"
17 #include "extensions/shell/browser/api/shell_extensions_api_client.h"
18 #include "extensions/shell/browser/shell_app_sorting.h"
19 #include "extensions/shell/browser/shell_extension_system_factory.h"
20 #include "extensions/shell/browser/shell_extension_web_contents_observer.h"
21 #include "extensions/shell/browser/shell_runtime_api_delegate.h"
22 #include "extensions/shell/common/api/generated_api.h"
24 using content::BrowserContext;
26 namespace extensions {
29 // See chrome::RegisterProfilePrefs() in chrome/browser/prefs/browser_prefs.cc
30 void RegisterPrefs(user_prefs::PrefRegistrySyncable* registry) {
31 ExtensionPrefs::RegisterProfilePrefs(registry);
34 // A minimal ExtensionHostDelegate.
35 class ShellExtensionHostDelegate : public ExtensionHostDelegate {
37 ShellExtensionHostDelegate() {}
38 virtual ~ShellExtensionHostDelegate() {}
40 // ExtensionHostDelegate implementation.
41 virtual void OnExtensionHostCreated(
42 content::WebContents* web_contents) OVERRIDE;
44 virtual void OnRenderViewCreatedForBackgroundPage(
45 ExtensionHost* host) OVERRIDE {}
47 virtual content::JavaScriptDialogManager* GetJavaScriptDialogManager()
49 // TODO(jamescook): Create a JavaScriptDialogManager or reuse the one from
55 virtual void CreateTab(content::WebContents* web_contents,
56 const std::string& extension_id,
57 WindowOpenDisposition disposition,
58 const gfx::Rect& initial_pos,
59 bool user_gesture) OVERRIDE {
60 // TODO(jamescook): Should app_shell support opening popup windows?
64 virtual void ProcessMediaAccessRequest(
65 content::WebContents* web_contents,
66 const content::MediaStreamRequest& request,
67 const content::MediaResponseCallback& callback,
68 const Extension* extension) OVERRIDE {
69 // app_shell does not support media capture.
74 void ShellExtensionHostDelegate::OnExtensionHostCreated(
75 content::WebContents* web_contents) {
76 ShellExtensionWebContentsObserver::CreateForWebContents(web_contents);
81 ShellExtensionsBrowserClient::ShellExtensionsBrowserClient(
82 BrowserContext* context)
83 : browser_context_(context), api_client_(new ShellExtensionsAPIClient) {
84 // Set up the preferences service.
85 base::PrefServiceFactory factory;
86 factory.set_user_prefs(new TestingPrefStore);
87 factory.set_extension_prefs(new TestingPrefStore);
88 // app_shell should not require syncable preferences, but for now we need to
89 // recycle some of the RegisterProfilePrefs() code in Chrome.
90 // TODO(jamescook): Convert this to PrefRegistrySimple.
91 user_prefs::PrefRegistrySyncable* pref_registry =
92 new user_prefs::PrefRegistrySyncable;
93 // Prefs should be registered before the PrefService is created.
94 RegisterPrefs(pref_registry);
95 prefs_ = factory.Create(pref_registry).Pass();
96 user_prefs::UserPrefs::Set(browser_context_, prefs_.get());
99 ShellExtensionsBrowserClient::~ShellExtensionsBrowserClient() {
102 bool ShellExtensionsBrowserClient::IsShuttingDown() {
106 bool ShellExtensionsBrowserClient::AreExtensionsDisabled(
107 const base::CommandLine& command_line,
108 BrowserContext* context) {
112 bool ShellExtensionsBrowserClient::IsValidContext(BrowserContext* context) {
113 return context == browser_context_;
116 bool ShellExtensionsBrowserClient::IsSameContext(BrowserContext* first,
117 BrowserContext* second) {
118 return first == second;
121 bool ShellExtensionsBrowserClient::HasOffTheRecordContext(
122 BrowserContext* context) {
126 BrowserContext* ShellExtensionsBrowserClient::GetOffTheRecordContext(
127 BrowserContext* context) {
128 // app_shell only supports a single context.
132 BrowserContext* ShellExtensionsBrowserClient::GetOriginalContext(
133 BrowserContext* context) {
137 bool ShellExtensionsBrowserClient::IsGuestSession(
138 BrowserContext* context) const {
142 bool ShellExtensionsBrowserClient::IsExtensionIncognitoEnabled(
143 const std::string& extension_id,
144 content::BrowserContext* context) const {
148 bool ShellExtensionsBrowserClient::CanExtensionCrossIncognito(
149 const Extension* extension,
150 content::BrowserContext* context) const {
154 bool ShellExtensionsBrowserClient::IsWebViewRequest(
155 net::URLRequest* request) const {
160 ShellExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob(
161 net::URLRequest* request,
162 net::NetworkDelegate* network_delegate,
163 const base::FilePath& directory_path,
164 const std::string& content_security_policy,
165 bool send_cors_header) {
169 bool ShellExtensionsBrowserClient::AllowCrossRendererResourceLoad(
170 net::URLRequest* request,
172 const Extension* extension,
173 InfoMap* extension_info_map) {
174 // Note: This may need to change if app_shell supports webview.
178 PrefService* ShellExtensionsBrowserClient::GetPrefServiceForContext(
179 BrowserContext* context) {
183 void ShellExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
184 content::BrowserContext* context,
185 std::vector<ExtensionPrefsObserver*>* observers) const {
188 ProcessManagerDelegate*
189 ShellExtensionsBrowserClient::GetProcessManagerDelegate() const {
193 scoped_ptr<ExtensionHostDelegate>
194 ShellExtensionsBrowserClient::CreateExtensionHostDelegate() {
195 return scoped_ptr<ExtensionHostDelegate>(new ShellExtensionHostDelegate);
198 bool ShellExtensionsBrowserClient::DidVersionUpdate(BrowserContext* context) {
199 // TODO(jamescook): We might want to tell extensions when app_shell updates.
203 void ShellExtensionsBrowserClient::PermitExternalProtocolHandler() {
206 scoped_ptr<AppSorting> ShellExtensionsBrowserClient::CreateAppSorting() {
207 return scoped_ptr<AppSorting>(new ShellAppSorting);
210 bool ShellExtensionsBrowserClient::IsRunningInForcedAppMode() {
214 ApiActivityMonitor* ShellExtensionsBrowserClient::GetApiActivityMonitor(
215 BrowserContext* context) {
216 // app_shell doesn't monitor API function calls or events.
220 ExtensionSystemProvider*
221 ShellExtensionsBrowserClient::GetExtensionSystemFactory() {
222 return ShellExtensionSystemFactory::GetInstance();
225 void ShellExtensionsBrowserClient::RegisterExtensionFunctions(
226 ExtensionFunctionRegistry* registry) const {
227 // Register core extension-system APIs.
228 core_api::GeneratedFunctionRegistry::RegisterAll(registry);
230 // Register chrome.shell APIs.
231 shell_api::GeneratedFunctionRegistry::RegisterAll(registry);
234 scoped_ptr<RuntimeAPIDelegate>
235 ShellExtensionsBrowserClient::CreateRuntimeAPIDelegate(
236 content::BrowserContext* context) const {
237 return scoped_ptr<RuntimeAPIDelegate>(new ShellRuntimeAPIDelegate());
240 ComponentExtensionResourceManager*
241 ShellExtensionsBrowserClient::GetComponentExtensionResourceManager() {
245 net::NetLog* ShellExtensionsBrowserClient::GetNetLog() {
249 } // namespace extensions