chrome_extensions_browser_client.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/version.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/browser_process.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/preference/chrome_direct_setting.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/preference/preference_api.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/web_request/web_request_api.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/chrome_app_sorting.h" 1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/extensions/chrome_extension_host_delegate.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_system_factory.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_util.h" 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/extensions/url_request_util.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/external_protocol/external_protocol_handler.h" 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/chrome_version_info.h" 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/extensions/api/generated_api.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/extensions/features/feature_channel.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/pref_names.h" 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function_registry.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/pref_names.h" 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/api/generated_api.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/chromeos_switches.h" 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/chrome_extensions_api_client.h" 41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace extensions { 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeExtensionsBrowserClient::ChromeExtensionsBrowserClient() { 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) api_client_.reset(new ChromeExtensionsAPIClient); 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only set if it hasn't already been set (e.g. by a test). 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetCurrentChannel() == GetDefaultChannel()) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetCurrentChannel(chrome::VersionInfo::GetChannel()); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ChromeExtensionsBrowserClient::~ChromeExtensionsBrowserClient() {} 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsShuttingDown() { 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return g_browser_process->IsShuttingDown(); 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::AreExtensionsDisabled( 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const CommandLine& command_line, 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::BrowserContext* context) { 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return command_line.HasSwitch(switches::kDisableExtensions) || 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions); 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeExtensionsBrowserClient::IsValidContext( 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return g_browser_process->profile_manager()->IsValidProfile(profile); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsSameContext( 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::BrowserContext* first, 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::BrowserContext* second) { 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return static_cast<Profile*>(first)->IsSameProfile( 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static_cast<Profile*>(second)); 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool ChromeExtensionsBrowserClient::HasOffTheRecordContext( 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::BrowserContext* context) { 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return static_cast<Profile*>(context)->HasOffTheRecordProfile(); 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)content::BrowserContext* ChromeExtensionsBrowserClient::GetOffTheRecordContext( 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::BrowserContext* context) { 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return static_cast<Profile*>(context)->GetOffTheRecordProfile(); 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)content::BrowserContext* ChromeExtensionsBrowserClient::GetOriginalContext( 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return static_cast<Profile*>(context)->GetOriginalProfile(); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsGuestSession( 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::BrowserContext* context) const { 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<Profile*>(context)->IsGuestSession(); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsExtensionIncognitoEnabled( 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& extension_id, 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* context) const { 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IsGuestSession(context) 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) || util::IsIncognitoEnabled(extension_id, context); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::CanExtensionCrossIncognito( 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::Extension* extension, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* context) const { 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IsGuestSession(context) 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) || util::CanCrossIncognito(extension, context); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnet::URLRequestJob* 117a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochChromeExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob( 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::URLRequest* request, 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::NetworkDelegate* network_delegate, 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::FilePath& directory_path, 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::string& content_security_policy, 122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool send_cors_header) { 123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return url_request_util::MaybeCreateURLRequestResourceBundleJob( 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch request, 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch network_delegate, 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch directory_path, 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content_security_policy, 128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch send_cors_header); 129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool ChromeExtensionsBrowserClient::AllowCrossRendererResourceLoad( 132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::URLRequest* request, 133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_incognito, 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const Extension* extension, 135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoMap* extension_info_map) { 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return url_request_util::AllowCrossRendererResourceLoad( 137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch request, is_incognito, extension, extension_info_map); 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrefService* ChromeExtensionsBrowserClient::GetPrefServiceForContext( 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::BrowserContext* context) { 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return static_cast<Profile*>(context)->GetPrefs(); 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid ChromeExtensionsBrowserClient::GetEarlyExtensionPrefsObservers( 146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch content::BrowserContext* context, 147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<ExtensionPrefsObserver*>* observers) const { 148e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if defined(ENABLE_EXTENSIONS) 149e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch observers->push_back(ContentSettingsService::Get(context)); 150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif 151e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeExtensionsBrowserClient::DeferLoadingBackgroundHosts( 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) const { 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The profile may not be valid yet if it is still being initialized. 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // In that case, defer loading, since it depends on an initialized profile. 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // http://crbug.com/222473 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!g_browser_process->profile_manager()->IsValidProfile(profile)) 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_ANDROID) 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // There are no browser windows open and the browser process was 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // started to show the app launcher. 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return chrome::GetTotalBrowserCountForProfile(profile) == 0 && 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch(switches::kShowAppList); 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeExtensionsBrowserClient::IsBackgroundPageAllowed( 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* context) const { 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns true if current session is Guest mode session and current 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // browser context is *not* off-the-record. Such context is artificial and 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // background page shouldn't be created in it. 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !static_cast<Profile*>(context)->IsGuestSession() || 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context->IsOffTheRecord(); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)scoped_ptr<ExtensionHostDelegate> 18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ChromeExtensionsBrowserClient::CreateExtensionHostDelegate() { 18423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return scoped_ptr<ExtensionHostDelegate>(new ChromeExtensionHostDelegate); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeExtensionsBrowserClient::DidVersionUpdate( 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Unit tests may not provide prefs; assume everything is up-to-date. 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile); 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!extension_prefs) 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If we're inside a browser test, then assume prefs are all up-to-date. 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefService* pref_service = extension_prefs->pref_service(); 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Version last_version; 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (pref_service->HasPrefPath(pref_names::kLastChromeVersion)) { 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string last_version_str = 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pref_service->GetString(pref_names::kLastChromeVersion); 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) last_version = base::Version(last_version_str); 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::VersionInfo current_version_info; 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string current_version = current_version_info.Version(); 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pref_service->SetString(pref_names::kLastChromeVersion, 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_version); 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If there was no version string in prefs, assume we're out of date. 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!last_version.IsValid()) 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return last_version.IsOlderThan(current_version); 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<AppSorting> ChromeExtensionsBrowserClient::CreateAppSorting() { 22123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return scoped_ptr<AppSorting>(new ChromeAppSorting()); 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeExtensionsBrowserClient::IsRunningInForcedAppMode() { 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return chrome::IsRunningInForcedAppMode(); 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ApiActivityMonitor* ChromeExtensionsBrowserClient::GetApiActivityMonitor( 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::BrowserContext* context) { 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The ActivityLog monitors and records function calls and events. 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ActivityLog::GetInstance(context); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionSystemProvider* 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeExtensionsBrowserClient::GetExtensionSystemFactory() { 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ExtensionSystemFactory::GetInstance(); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeExtensionsBrowserClient::RegisterExtensionFunctions( 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExtensionFunctionRegistry* registry) const { 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(rockot): Figure out if and why Android really needs to build 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// ChromeExtensionsBrowserClient and refactor so this ifdef isn't necessary. 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// See http://crbug.com/349436 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Preferences. 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction<extensions::GetPreferenceFunction>(); 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction<extensions::SetPreferenceFunction>(); 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction<extensions::ClearPreferenceFunction>(); 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Direct Preference Access for Component Extensions. 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction< 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::chromedirectsetting::GetDirectSettingFunction>(); 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction< 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::chromedirectsetting::SetDirectSettingFunction>(); 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registry->RegisterFunction< 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::chromedirectsetting::ClearDirectSettingFunction>(); 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Generated APIs from lower-level modules. 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::core_api::GeneratedFunctionRegistry::RegisterAll(registry); 2604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch apps::api::GeneratedFunctionRegistry::RegisterAll(registry); 2614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 2624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Generated APIs from Chrome. 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::api::GeneratedFunctionRegistry::RegisterAll(registry); 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace extensions 268