1 // Copyright 2013 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 "apps/shell/browser/shell_extensions_browser_client.h"
7 #include "apps/shell/browser/shell_app_sorting.h"
8 #include "apps/shell/browser/shell_extension_system_factory.h"
9 #include "apps/shell/browser/shell_extension_web_contents_observer.h"
10 #include "apps/shell/browser/shell_runtime_api_delegate.h"
11 #include "apps/shell/common/api/generated_api.h"
12 #include "base/prefs/pref_service.h"
13 #include "base/prefs/pref_service_factory.h"
14 #include "base/prefs/testing_pref_store.h"
15 #include "components/user_prefs/pref_registry_syncable.h"
16 #include "components/user_prefs/user_prefs.h"
17 #include "extensions/browser/api/extensions_api_client.h"
18 #include "extensions/browser/app_sorting.h"
19 #include "extensions/browser/extension_function_registry.h"
20 #include "extensions/browser/extension_host_delegate.h"
21 #include "extensions/browser/extension_prefs.h"
22 #include "extensions/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(content::WebContents* web_contents)
44 virtual void OnRenderViewCreatedForBackgroundPage(ExtensionHost* host)
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 ExtensionsAPIClient) {
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() {}
101 bool ShellExtensionsBrowserClient::IsShuttingDown() {
105 bool ShellExtensionsBrowserClient::AreExtensionsDisabled(
106 const base::CommandLine& command_line,
107 BrowserContext* context) {
111 bool ShellExtensionsBrowserClient::IsValidContext(BrowserContext* context) {
112 return context == browser_context_;
115 bool ShellExtensionsBrowserClient::IsSameContext(BrowserContext* first,
116 BrowserContext* second) {
117 return first == second;
120 bool ShellExtensionsBrowserClient::HasOffTheRecordContext(
121 BrowserContext* context) {
125 BrowserContext* ShellExtensionsBrowserClient::GetOffTheRecordContext(
126 BrowserContext* context) {
127 // app_shell only supports a single context.
131 BrowserContext* ShellExtensionsBrowserClient::GetOriginalContext(
132 BrowserContext* context) {
136 bool ShellExtensionsBrowserClient::IsGuestSession(
137 BrowserContext* context) const {
141 bool ShellExtensionsBrowserClient::IsExtensionIncognitoEnabled(
142 const std::string& extension_id,
143 content::BrowserContext* context) const {
147 bool ShellExtensionsBrowserClient::CanExtensionCrossIncognito(
148 const extensions::Extension* extension,
149 content::BrowserContext* context) const {
153 bool ShellExtensionsBrowserClient::IsWebViewRequest(
154 net::URLRequest* request) const {
159 ShellExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob(
160 net::URLRequest* request,
161 net::NetworkDelegate* network_delegate,
162 const base::FilePath& directory_path,
163 const std::string& content_security_policy,
164 bool send_cors_header) {
168 bool ShellExtensionsBrowserClient::AllowCrossRendererResourceLoad(
169 net::URLRequest* request,
171 const Extension* extension,
172 InfoMap* extension_info_map) {
173 // Note: This may need to change if app_shell supports webview.
177 PrefService* ShellExtensionsBrowserClient::GetPrefServiceForContext(
178 BrowserContext* context) {
182 void ShellExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
183 content::BrowserContext* context,
184 std::vector<ExtensionPrefsObserver*>* observers) const {}
186 bool ShellExtensionsBrowserClient::DeferLoadingBackgroundHosts(
187 BrowserContext* context) const {
191 bool ShellExtensionsBrowserClient::IsBackgroundPageAllowed(
192 BrowserContext* context) const {
196 scoped_ptr<ExtensionHostDelegate>
197 ShellExtensionsBrowserClient::CreateExtensionHostDelegate() {
198 return scoped_ptr<ExtensionHostDelegate>(new ShellExtensionHostDelegate);
201 bool ShellExtensionsBrowserClient::DidVersionUpdate(BrowserContext* context) {
202 // TODO(jamescook): We might want to tell extensions when app_shell updates.
206 scoped_ptr<AppSorting> ShellExtensionsBrowserClient::CreateAppSorting() {
207 return scoped_ptr<AppSorting>(new apps::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 extensions::core_api::GeneratedFunctionRegistry::RegisterAll(registry);
230 // Register chrome.shell APIs.
231 apps::shell_api::GeneratedFunctionRegistry::RegisterAll(registry);
234 scoped_ptr<RuntimeAPIDelegate>
235 ShellExtensionsBrowserClient::CreateRuntimeAPIDelegate(
236 content::BrowserContext* context) const {
237 return scoped_ptr<RuntimeAPIDelegate>(new apps::ShellRuntimeAPIDelegate());
240 } // namespace extensions