Home | History | Annotate | Download | only in browser
      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.
      4 
      5 #include "apps/shell/browser/shell_extensions_browser_client.h"
      6 
      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/pref_registry/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"
     23 
     24 using content::BrowserContext;
     25 
     26 namespace extensions {
     27 namespace {
     28 
     29 // See chrome::RegisterProfilePrefs() in chrome/browser/prefs/browser_prefs.cc
     30 void RegisterPrefs(user_prefs::PrefRegistrySyncable* registry) {
     31   ExtensionPrefs::RegisterProfilePrefs(registry);
     32 }
     33 
     34 // A minimal ExtensionHostDelegate.
     35 class ShellExtensionHostDelegate : public ExtensionHostDelegate {
     36  public:
     37   ShellExtensionHostDelegate() {}
     38   virtual ~ShellExtensionHostDelegate() {}
     39 
     40   // ExtensionHostDelegate implementation.
     41   virtual void OnExtensionHostCreated(content::WebContents* web_contents)
     42       OVERRIDE;
     43 
     44   virtual void OnRenderViewCreatedForBackgroundPage(ExtensionHost* host)
     45       OVERRIDE {}
     46 
     47   virtual content::JavaScriptDialogManager* GetJavaScriptDialogManager()
     48       OVERRIDE {
     49     // TODO(jamescook): Create a JavaScriptDialogManager or reuse the one from
     50     // content_shell.
     51     NOTREACHED();
     52     return NULL;
     53   }
     54 
     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?
     61     NOTREACHED();
     62   }
     63 
     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.
     70     NOTREACHED();
     71   }
     72 };
     73 
     74 void ShellExtensionHostDelegate::OnExtensionHostCreated(
     75     content::WebContents* web_contents) {
     76   ShellExtensionWebContentsObserver::CreateForWebContents(web_contents);
     77 }
     78 
     79 }  // namespace
     80 
     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());
     97 }
     98 
     99 ShellExtensionsBrowserClient::~ShellExtensionsBrowserClient() {}
    100 
    101 bool ShellExtensionsBrowserClient::IsShuttingDown() {
    102   return false;
    103 }
    104 
    105 bool ShellExtensionsBrowserClient::AreExtensionsDisabled(
    106     const base::CommandLine& command_line,
    107     BrowserContext* context) {
    108   return false;
    109 }
    110 
    111 bool ShellExtensionsBrowserClient::IsValidContext(BrowserContext* context) {
    112   return context == browser_context_;
    113 }
    114 
    115 bool ShellExtensionsBrowserClient::IsSameContext(BrowserContext* first,
    116                                                  BrowserContext* second) {
    117   return first == second;
    118 }
    119 
    120 bool ShellExtensionsBrowserClient::HasOffTheRecordContext(
    121     BrowserContext* context) {
    122   return false;
    123 }
    124 
    125 BrowserContext* ShellExtensionsBrowserClient::GetOffTheRecordContext(
    126     BrowserContext* context) {
    127   // app_shell only supports a single context.
    128   return NULL;
    129 }
    130 
    131 BrowserContext* ShellExtensionsBrowserClient::GetOriginalContext(
    132     BrowserContext* context) {
    133   return context;
    134 }
    135 
    136 bool ShellExtensionsBrowserClient::IsGuestSession(
    137     BrowserContext* context) const {
    138   return false;
    139 }
    140 
    141 bool ShellExtensionsBrowserClient::IsExtensionIncognitoEnabled(
    142     const std::string& extension_id,
    143     content::BrowserContext* context) const {
    144   return false;
    145 }
    146 
    147 bool ShellExtensionsBrowserClient::CanExtensionCrossIncognito(
    148     const extensions::Extension* extension,
    149     content::BrowserContext* context) const {
    150   return false;
    151 }
    152 
    153 bool ShellExtensionsBrowserClient::IsWebViewRequest(
    154     net::URLRequest* request) const {
    155   return false;
    156 }
    157 
    158 net::URLRequestJob*
    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) {
    165   return NULL;
    166 }
    167 
    168 bool ShellExtensionsBrowserClient::AllowCrossRendererResourceLoad(
    169     net::URLRequest* request,
    170     bool is_incognito,
    171     const Extension* extension,
    172     InfoMap* extension_info_map) {
    173   // Note: This may need to change if app_shell supports webview.
    174   return false;
    175 }
    176 
    177 PrefService* ShellExtensionsBrowserClient::GetPrefServiceForContext(
    178     BrowserContext* context) {
    179   return prefs_.get();
    180 }
    181 
    182 void ShellExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
    183     content::BrowserContext* context,
    184     std::vector<ExtensionPrefsObserver*>* observers) const {}
    185 
    186 bool ShellExtensionsBrowserClient::DeferLoadingBackgroundHosts(
    187     BrowserContext* context) const {
    188   return false;
    189 }
    190 
    191 bool ShellExtensionsBrowserClient::IsBackgroundPageAllowed(
    192     BrowserContext* context) const {
    193   return true;
    194 }
    195 
    196 scoped_ptr<ExtensionHostDelegate>
    197 ShellExtensionsBrowserClient::CreateExtensionHostDelegate() {
    198   return scoped_ptr<ExtensionHostDelegate>(new ShellExtensionHostDelegate);
    199 }
    200 
    201 bool ShellExtensionsBrowserClient::DidVersionUpdate(BrowserContext* context) {
    202   // TODO(jamescook): We might want to tell extensions when app_shell updates.
    203   return false;
    204 }
    205 
    206 void ShellExtensionsBrowserClient::PermitExternalProtocolHandler() {
    207 }
    208 
    209 scoped_ptr<AppSorting> ShellExtensionsBrowserClient::CreateAppSorting() {
    210   return scoped_ptr<AppSorting>(new apps::ShellAppSorting);
    211 }
    212 
    213 bool ShellExtensionsBrowserClient::IsRunningInForcedAppMode() {
    214   return false;
    215 }
    216 
    217 ApiActivityMonitor* ShellExtensionsBrowserClient::GetApiActivityMonitor(
    218     BrowserContext* context) {
    219   // app_shell doesn't monitor API function calls or events.
    220   return NULL;
    221 }
    222 
    223 ExtensionSystemProvider*
    224 ShellExtensionsBrowserClient::GetExtensionSystemFactory() {
    225   return ShellExtensionSystemFactory::GetInstance();
    226 }
    227 
    228 void ShellExtensionsBrowserClient::RegisterExtensionFunctions(
    229     ExtensionFunctionRegistry* registry) const {
    230   // Register core extension-system APIs.
    231   extensions::core_api::GeneratedFunctionRegistry::RegisterAll(registry);
    232 
    233   // Register chrome.shell APIs.
    234   apps::shell_api::GeneratedFunctionRegistry::RegisterAll(registry);
    235 }
    236 
    237 scoped_ptr<RuntimeAPIDelegate>
    238 ShellExtensionsBrowserClient::CreateRuntimeAPIDelegate(
    239     content::BrowserContext* context) const {
    240   return scoped_ptr<RuntimeAPIDelegate>(new apps::ShellRuntimeAPIDelegate());
    241 }
    242 
    243 ComponentExtensionResourceManager*
    244 ShellExtensionsBrowserClient::GetComponentExtensionResourceManager() {
    245   return NULL;
    246 }
    247 
    248 }  // namespace extensions
    249