11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/chrome_extensions_browser_client.h" 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 74ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "apps/common/api/generated_api.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h" 96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/path_service.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/version.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/browser_process.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/preference/chrome_direct_setting.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/preference/preference_api.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/chrome_app_sorting.h" 186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/extensions/chrome_component_extension_resource_manager.h" 1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/extensions/chrome_extension_host_delegate.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_system_factory.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_util.h" 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/extensions/url_request_util.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/external_protocol/external_protocol_handler.h" 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/chrome_version_info.h" 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/extensions/api/generated_api.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/extensions/features/feature_channel.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/pref_names.h" 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function_registry.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/pref_names.h" 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/api/generated_api.h" 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/chromeos_switches.h" 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/chrome_extensions_api_client.h" 44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace extensions { 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeExtensionsBrowserClient::ChromeExtensionsBrowserClient() { 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) api_client_.reset(new ChromeExtensionsAPIClient); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only set if it hasn't already been set (e.g. by a test). 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetCurrentChannel() == GetDefaultChannel()) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetCurrentChannel(chrome::VersionInfo::GetChannel()); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ChromeExtensionsBrowserClient::~ChromeExtensionsBrowserClient() {} 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsShuttingDown() { 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return g_browser_process->IsShuttingDown(); 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::AreExtensionsDisabled( 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const CommandLine& command_line, 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::BrowserContext* context) { 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return command_line.HasSwitch(switches::kDisableExtensions) || 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions); 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeExtensionsBrowserClient::IsValidContext( 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return g_browser_process->profile_manager()->IsValidProfile(profile); 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsSameContext( 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::BrowserContext* first, 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::BrowserContext* second) { 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return static_cast<Profile*>(first)->IsSameProfile( 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static_cast<Profile*>(second)); 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ChromeExtensionsBrowserClient::HasOffTheRecordContext( 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::BrowserContext* context) { 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return static_cast<Profile*>(context)->HasOffTheRecordProfile(); 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)content::BrowserContext* ChromeExtensionsBrowserClient::GetOffTheRecordContext( 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::BrowserContext* context) { 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return static_cast<Profile*>(context)->GetOffTheRecordProfile(); 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)content::BrowserContext* ChromeExtensionsBrowserClient::GetOriginalContext( 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return static_cast<Profile*>(context)->GetOriginalProfile(); 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsGuestSession( 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::BrowserContext* context) const { 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<Profile*>(context)->IsGuestSession(); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsExtensionIncognitoEnabled( 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& extension_id, 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* context) const { 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IsGuestSession(context) 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) || util::IsIncognitoEnabled(extension_id, context); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::CanExtensionCrossIncognito( 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::Extension* extension, 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* context) const { 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IsGuestSession(context) 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) || util::CanCrossIncognito(extension, context); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool ChromeExtensionsBrowserClient::IsWebViewRequest( 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch net::URLRequest* request) const { 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return url_request_util::IsWebViewRequest(request); 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnet::URLRequestJob* 125a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochChromeExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob( 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::URLRequest* request, 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::NetworkDelegate* network_delegate, 128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::FilePath& directory_path, 129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::string& content_security_policy, 130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool send_cors_header) { 131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return url_request_util::MaybeCreateURLRequestResourceBundleJob( 132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch request, 133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch network_delegate, 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch directory_path, 135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content_security_policy, 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch send_cors_header); 137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool ChromeExtensionsBrowserClient::AllowCrossRendererResourceLoad( 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::URLRequest* request, 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_incognito, 142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const Extension* extension, 143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoMap* extension_info_map) { 144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return url_request_util::AllowCrossRendererResourceLoad( 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch request, is_incognito, extension, extension_info_map); 146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrefService* ChromeExtensionsBrowserClient::GetPrefServiceForContext( 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::BrowserContext* context) { 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return static_cast<Profile*>(context)->GetPrefs(); 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 153e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid ChromeExtensionsBrowserClient::GetEarlyExtensionPrefsObservers( 154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch content::BrowserContext* context, 155e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<ExtensionPrefsObserver*>* observers) const { 156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if defined(ENABLE_EXTENSIONS) 157e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch observers->push_back(ContentSettingsService::Get(context)); 158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif 159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeExtensionsBrowserClient::DeferLoadingBackgroundHosts( 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) const { 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The profile may not be valid yet if it is still being initialized. 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // In that case, defer loading, since it depends on an initialized profile. 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // http://crbug.com/222473 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!g_browser_process->profile_manager()->IsValidProfile(profile)) 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_ANDROID) 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // There are no browser windows open and the browser process was 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // started to show the app launcher. 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return chrome::GetTotalBrowserCountForProfile(profile) == 0 && 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch(switches::kShowAppList); 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsBackgroundPageAllowed( 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* context) const { 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns true if current session is Guest mode session and current 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // browser context is *not* off-the-record. Such context is artificial and 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // background page shouldn't be created in it. 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !static_cast<Profile*>(context)->IsGuestSession() || 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context->IsOffTheRecord(); 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)scoped_ptr<ExtensionHostDelegate> 19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ChromeExtensionsBrowserClient::CreateExtensionHostDelegate() { 19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return scoped_ptr<ExtensionHostDelegate>(new ChromeExtensionHostDelegate); 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeExtensionsBrowserClient::DidVersionUpdate( 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Unit tests may not provide prefs; assume everything is up-to-date. 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile); 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!extension_prefs) 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If we're inside a browser test, then assume prefs are all up-to-date. 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefService* pref_service = extension_prefs->pref_service(); 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Version last_version; 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (pref_service->HasPrefPath(pref_names::kLastChromeVersion)) { 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string last_version_str = 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pref_service->GetString(pref_names::kLastChromeVersion); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) last_version = base::Version(last_version_str); 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::VersionInfo current_version_info; 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string current_version = current_version_info.Version(); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pref_service->SetString(pref_names::kLastChromeVersion, 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_version); 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If there was no version string in prefs, assume we're out of date. 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!last_version.IsValid()) 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return last_version.IsOlderThan(current_version); 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2289a3a4bc965704498ea9f22876627cda96ff9a77eBo Liuvoid ChromeExtensionsBrowserClient::PermitExternalProtocolHandler() { 2299a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu ExternalProtocolHandler::PermitLaunchUrl(); 2309a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu} 2319a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<AppSorting> ChromeExtensionsBrowserClient::CreateAppSorting() { 23323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return scoped_ptr<AppSorting>(new ChromeAppSorting()); 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeExtensionsBrowserClient::IsRunningInForcedAppMode() { 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return chrome::IsRunningInForcedAppMode(); 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ApiActivityMonitor* ChromeExtensionsBrowserClient::GetApiActivityMonitor( 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* context) { 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The ActivityLog monitors and records function calls and events. 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ActivityLog::GetInstance(context); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionSystemProvider* 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeExtensionsBrowserClient::GetExtensionSystemFactory() { 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ExtensionSystemFactory::GetInstance(); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeExtensionsBrowserClient::RegisterExtensionFunctions( 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExtensionFunctionRegistry* registry) const { 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(rockot): Figure out if and why Android really needs to build 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// ChromeExtensionsBrowserClient and refactor so this ifdef isn't necessary. 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// See http://crbug.com/349436 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Preferences. 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction<extensions::GetPreferenceFunction>(); 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction<extensions::SetPreferenceFunction>(); 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction<extensions::ClearPreferenceFunction>(); 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Direct Preference Access for Component Extensions. 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction< 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::chromedirectsetting::GetDirectSettingFunction>(); 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction< 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::chromedirectsetting::SetDirectSettingFunction>(); 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction< 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::chromedirectsetting::ClearDirectSettingFunction>(); 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Generated APIs from lower-level modules. 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::core_api::GeneratedFunctionRegistry::RegisterAll(registry); 2724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch apps::api::GeneratedFunctionRegistry::RegisterAll(registry); 2734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 2744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Generated APIs from Chrome. 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::api::GeneratedFunctionRegistry::RegisterAll(registry); 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ComponentExtensionResourceManager* 2806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ChromeExtensionsBrowserClient::GetComponentExtensionResourceManager() { 2816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!resource_manager_) 2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) resource_manager_.reset(new ChromeComponentExtensionResourceManager()); 2836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return resource_manager_.get(); 2846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_ptr<extensions::RuntimeAPIDelegate> 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ChromeExtensionsBrowserClient::CreateRuntimeAPIDelegate( 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserContext* context) const { 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return scoped_ptr<extensions::RuntimeAPIDelegate>( 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new ChromeRuntimeAPIDelegate(context)); 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace extensions 294