blob: adee7d44fe45e597863ee29137f350e8e3567531 [file] [log] [blame]
[email protected]9fe42042013-10-29 21:13:331// 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 "chrome/browser/extensions/chrome_extensions_browser_client.h"
6
dcheng1fc00f12015-12-26 22:18:037#include <utility>
8
[email protected]7f474212013-11-05 04:26:169#include "base/command_line.h"
[email protected]45fd94172013-11-13 03:29:5210#include "base/version.h"
avia2f4804a2015-12-24 23:11:1311#include "build/build_config.h"
[email protected]45928b682013-11-28 08:20:2712#include "chrome/browser/app_mode/app_mode_utils.h"
[email protected]9fe42042013-10-29 21:13:3313#include "chrome/browser/browser_process.h"
[email protected]13e062e2014-08-09 10:21:5514#include "chrome/browser/extensions/activity_log/activity_log.h"
15#include "chrome/browser/extensions/api/chrome_extensions_api_client.h"
16#include "chrome/browser/extensions/api/content_settings/content_settings_service.h"
yoz774dcda2d2014-08-27 03:32:5817#include "chrome/browser/extensions/api/generated_api_registration.h"
[email protected]21c6c432014-03-05 18:47:3118#include "chrome/browser/extensions/api/preference/preference_api.h"
[email protected]f0e9ac552014-05-07 14:26:5019#include "chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h"
[email protected]326e6f02014-06-20 04:53:3720#include "chrome/browser/extensions/chrome_component_extension_resource_manager.h"
rdevlin.cronin1790e822016-04-05 21:03:3521#include "chrome/browser/extensions/chrome_extension_api_frame_id_map_helper.h"
[email protected]6c0f179f2014-03-19 11:04:4122#include "chrome/browser/extensions/chrome_extension_host_delegate.h"
rdevlin.cronincb2ec659a2015-06-10 23:32:4123#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
Ben Goodgerb6169152017-07-22 04:09:4324#include "chrome/browser/extensions/chrome_extensions_interface_registration.h"
steelc8e6ede2016-09-29 00:56:2725#include "chrome/browser/extensions/chrome_kiosk_delegate.h"
[email protected]13e062e2014-08-09 10:21:5526#include "chrome/browser/extensions/chrome_process_manager_delegate.h"
lfg048201a2014-09-16 19:09:3627#include "chrome/browser/extensions/chrome_url_request_util.h"
wittmanb3ee0482015-06-24 17:47:4028#include "chrome/browser/extensions/error_console/error_console.h"
thiago.santos89e236b2014-09-05 13:29:4929#include "chrome/browser/extensions/event_router_forwarder.h"
Minh X. Nguyen3bfb32282017-11-09 17:11:1430#include "chrome/browser/extensions/extension_service.h"
[email protected]8172a9d2014-01-09 23:18:3031#include "chrome/browser/extensions/extension_system_factory.h"
[email protected]6a3d8ce42014-02-07 00:42:3732#include "chrome/browser/extensions/extension_util.h"
paulmeyered437262015-07-09 16:05:2933#include "chrome/browser/extensions/menu_manager.h"
asargent631a99a2015-10-15 21:51:4834#include "chrome/browser/extensions/updater/chrome_update_client_config.h"
[email protected]0b9de032014-03-15 05:47:0135#include "chrome/browser/external_protocol/external_protocol_handler.h"
[email protected]9fe42042013-10-29 21:13:3336#include "chrome/browser/profiles/profile.h"
[email protected]7f474212013-11-05 04:26:1637#include "chrome/browser/profiles/profile_manager.h"
jam059a6b42016-10-19 22:06:5438#include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
rdevlin.cronin9a62870f2016-02-11 23:25:5839#include "chrome/browser/sessions/session_tab_helper.h"
avi24d693f2016-08-06 18:03:5240#include "chrome/browser/task_manager/web_contents_tags.h"
juncai17fc8532016-06-02 06:45:5041#include "chrome/browser/ui/bluetooth/chrome_extension_bluetooth_chooser.h"
sdefresne9fb67692015-08-03 18:48:2242#include "chrome/common/channel_info.h"
[email protected]326e6f02014-06-20 04:53:3743#include "chrome/common/chrome_paths.h"
[email protected]7f474212013-11-05 04:26:1644#include "chrome/common/chrome_switches.h"
[email protected]45fd94172013-11-13 03:29:5245#include "chrome/common/pref_names.h"
drogerc690e8802015-09-21 14:29:1646#include "components/net_log/chrome_net_log.h"
asargent631a99a2015-10-15 21:51:4847#include "components/update_client/update_client.h"
sdefresne9fb67692015-08-03 18:48:2248#include "components/version_info/version_info.h"
paulmeyered437262015-07-09 16:05:2949#include "content/public/browser/render_process_host.h"
jam059a6b42016-10-19 22:06:5450#include "content/public/browser/resource_request_info.h"
brettw90e92602015-10-10 00:12:4051#include "content/public/common/content_switches.h"
yoz774dcda2d2014-08-27 03:32:5852#include "extensions/browser/api/generated_api_registration.h"
[email protected]21c6c432014-03-05 18:47:3153#include "extensions/browser/extension_function_registry.h"
[email protected]489db0842014-01-22 18:20:0354#include "extensions/browser/extension_prefs.h"
Minh X. Nguyen3bfb32282017-11-09 17:11:1455#include "extensions/browser/extension_system.h"
karandeepb810e33402017-04-05 23:41:2256#include "extensions/browser/extension_util.h"
Ben Goodgerb6169152017-07-22 04:09:4357#include "extensions/browser/mojo/interface_registration.h"
[email protected]234fc5ff2014-01-16 23:32:2858#include "extensions/browser/pref_names.h"
lfg048201a2014-09-16 19:09:3659#include "extensions/browser/url_request_util.h"
rdevlin.cronin41227532016-07-13 21:24:3460#include "extensions/common/features/feature_channel.h"
[email protected]9fe42042013-10-29 21:13:3361
[email protected]d0d1c052013-12-21 07:20:2262#if defined(OS_CHROMEOS)
stevenjbd194dd1362015-01-28 17:30:0863#include "chrome/browser/chromeos/profiles/profile_helper.h"
ginkage2179a15eb2015-03-18 13:55:5264#include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h"
rockotffa65b12014-10-14 17:19:0665#include "chrome/browser/extensions/updater/extension_cache_impl.h"
[email protected]d0d1c052013-12-21 07:20:2266#include "chromeos/chromeos_switches.h"
kelvinp1b80b8f2015-10-01 01:22:1367#include "components/user_manager/user_manager.h"
rockotffa65b12014-10-14 17:19:0668#else
69#include "extensions/browser/updater/null_extension_cache.h"
[email protected]d0d1c052013-12-21 07:20:2270#endif
71
[email protected]9fe42042013-10-29 21:13:3372namespace extensions {
73
rdevlin.cronin62018a12017-06-22 17:34:0674namespace {
75
76// If true, the extensions client will behave as though there is always a
77// new chrome update.
78bool g_did_chrome_update_for_testing = false;
79
80} // namespace
81
[email protected]be514c32014-03-17 23:30:4482ChromeExtensionsBrowserClient::ChromeExtensionsBrowserClient() {
[email protected]6b54fda2014-07-22 02:13:4783 process_manager_delegate_.reset(new ChromeProcessManagerDelegate);
[email protected]be514c32014-03-17 23:30:4484 api_client_.reset(new ChromeExtensionsAPIClient);
emaxx2ae3a0a2017-05-20 02:54:3685 SetCurrentChannel(chrome::GetChannel());
mukaiee458c92015-01-06 01:30:3386 resource_manager_.reset(new ChromeComponentExtensionResourceManager());
[email protected]59b0e602014-01-30 00:41:2487}
[email protected]9fe42042013-10-29 21:13:3388
89ChromeExtensionsBrowserClient::~ChromeExtensionsBrowserClient() {}
90
91bool ChromeExtensionsBrowserClient::IsShuttingDown() {
92 return g_browser_process->IsShuttingDown();
93}
94
[email protected]367d9b172013-12-03 00:31:0295bool ChromeExtensionsBrowserClient::AreExtensionsDisabled(
avi3ef9ec9e2014-12-22 22:50:1796 const base::CommandLine& command_line,
[email protected]367d9b172013-12-03 00:31:0297 content::BrowserContext* context) {
98 Profile* profile = static_cast<Profile*>(context);
catmullings98cd1942016-08-30 22:31:5999 return switches::ExtensionsDisabled(command_line) ||
100 profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions);
[email protected]367d9b172013-12-03 00:31:02101}
102
[email protected]45fd94172013-11-13 03:29:52103bool ChromeExtensionsBrowserClient::IsValidContext(
104 content::BrowserContext* context) {
105 Profile* profile = static_cast<Profile*>(context);
scheibc0792ff2015-01-13 00:17:43106 return g_browser_process->profile_manager() &&
107 g_browser_process->profile_manager()->IsValidProfile(profile);
[email protected]45fd94172013-11-13 03:29:52108}
109
[email protected]9fe42042013-10-29 21:13:33110bool ChromeExtensionsBrowserClient::IsSameContext(
111 content::BrowserContext* first,
112 content::BrowserContext* second) {
mark a. foltz06ff8102017-09-05 20:18:09113 Profile* first_profile = Profile::FromBrowserContext(first);
114 Profile* second_profile = Profile::FromBrowserContext(second);
115 // TODO(crbug.com/727487): We need to check both ways because of offscreen
116 // presentation profiles, which are not registered with the original profile.
117 // This can be reverted to check just first->IsSameProfile(second) when Bug
118 // 727487 is fixed and presentations have a proper profile type. See Bug
119 // 664351 for background.
120 return first_profile->IsSameProfile(second_profile) ||
121 second_profile->IsSameProfile(first_profile);
[email protected]9fe42042013-10-29 21:13:33122}
123
124bool ChromeExtensionsBrowserClient::HasOffTheRecordContext(
125 content::BrowserContext* context) {
126 return static_cast<Profile*>(context)->HasOffTheRecordProfile();
127}
128
129content::BrowserContext* ChromeExtensionsBrowserClient::GetOffTheRecordContext(
130 content::BrowserContext* context) {
131 return static_cast<Profile*>(context)->GetOffTheRecordProfile();
132}
133
[email protected]7f474212013-11-05 04:26:16134content::BrowserContext* ChromeExtensionsBrowserClient::GetOriginalContext(
135 content::BrowserContext* context) {
136 return static_cast<Profile*>(context)->GetOriginalProfile();
137}
138
stevenjbd194dd1362015-01-28 17:30:08139#if defined(OS_CHROMEOS)
140std::string ChromeExtensionsBrowserClient::GetUserIdHashFromContext(
141 content::BrowserContext* context) {
142 return chromeos::ProfileHelper::GetUserIdHashFromProfile(
143 static_cast<Profile*>(context));
144}
145#endif
146
[email protected]a5fc73e2014-02-13 20:26:47147bool ChromeExtensionsBrowserClient::IsGuestSession(
[email protected]d012be2b2014-03-03 17:02:47148 content::BrowserContext* context) const {
[email protected]a5fc73e2014-02-13 20:26:47149 return static_cast<Profile*>(context)->IsGuestSession();
150}
151
[email protected]6a3d8ce42014-02-07 00:42:37152bool ChromeExtensionsBrowserClient::IsExtensionIncognitoEnabled(
153 const std::string& extension_id,
154 content::BrowserContext* context) const {
[email protected]d012be2b2014-03-03 17:02:47155 return IsGuestSession(context)
156 || util::IsIncognitoEnabled(extension_id, context);
[email protected]6a3d8ce42014-02-07 00:42:37157}
158
159bool ChromeExtensionsBrowserClient::CanExtensionCrossIncognito(
kalmane58e62232015-07-23 18:27:22160 const Extension* extension,
[email protected]6a3d8ce42014-02-07 00:42:37161 content::BrowserContext* context) const {
[email protected]d012be2b2014-03-03 17:02:47162 return IsGuestSession(context)
163 || util::CanCrossIncognito(extension, context);
[email protected]6a3d8ce42014-02-07 00:42:37164}
165
[email protected]1791e6c92014-04-11 08:29:01166net::URLRequestJob*
167ChromeExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob(
168 net::URLRequest* request,
169 net::NetworkDelegate* network_delegate,
170 const base::FilePath& directory_path,
171 const std::string& content_security_policy,
172 bool send_cors_header) {
lfg048201a2014-09-16 19:09:36173 return chrome_url_request_util::MaybeCreateURLRequestResourceBundleJob(
[email protected]1791e6c92014-04-11 08:29:01174 request,
175 network_delegate,
176 directory_path,
177 content_security_policy,
178 send_cors_header);
179}
180
181bool ChromeExtensionsBrowserClient::AllowCrossRendererResourceLoad(
Ken Rockot6414c4d92017-11-08 19:58:32182 const GURL& url,
183 content::ResourceType resource_type,
184 ui::PageTransition page_transition,
185 int child_id,
[email protected]1791e6c92014-04-11 08:29:01186 bool is_incognito,
187 const Extension* extension,
Ken Rockot6414c4d92017-11-08 19:58:32188 const ExtensionSet& extensions,
189 const ProcessMap& process_map) {
lfg048201a2014-09-16 19:09:36190 bool allowed = false;
191 if (chrome_url_request_util::AllowCrossRendererResourceLoad(
Ken Rockot6414c4d92017-11-08 19:58:32192 url, resource_type, page_transition, child_id, is_incognito,
193 extension, extensions, process_map, &allowed)) {
lfg048201a2014-09-16 19:09:36194 return allowed;
Ken Rockot6414c4d92017-11-08 19:58:32195 }
lfg048201a2014-09-16 19:09:36196
197 // Couldn't determine if resource is allowed. Block the load.
198 return false;
[email protected]1791e6c92014-04-11 08:29:01199}
200
[email protected]367d9b172013-12-03 00:31:02201PrefService* ChromeExtensionsBrowserClient::GetPrefServiceForContext(
202 content::BrowserContext* context) {
203 return static_cast<Profile*>(context)->GetPrefs();
204}
205
[email protected]d31e2482014-04-02 22:52:20206void ChromeExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
207 content::BrowserContext* context,
208 std::vector<ExtensionPrefsObserver*>* observers) const {
[email protected]d31e2482014-04-02 22:52:20209 observers->push_back(ContentSettingsService::Get(context));
[email protected]d31e2482014-04-02 22:52:20210}
211
[email protected]6b54fda2014-07-22 02:13:47212ProcessManagerDelegate*
213ChromeExtensionsBrowserClient::GetProcessManagerDelegate() const {
[email protected]6b54fda2014-07-22 02:13:47214 return process_manager_delegate_.get();
[email protected]7f474212013-11-05 04:26:16215}
216
dchengc963c7142016-04-08 03:55:22217std::unique_ptr<ExtensionHostDelegate>
[email protected]6c0f179f2014-03-19 11:04:41218ChromeExtensionsBrowserClient::CreateExtensionHostDelegate() {
dchengc963c7142016-04-08 03:55:22219 return std::unique_ptr<ExtensionHostDelegate>(
220 new ChromeExtensionHostDelegate);
[email protected]a36b55602014-02-08 02:32:32221}
222
[email protected]45fd94172013-11-13 03:29:52223bool ChromeExtensionsBrowserClient::DidVersionUpdate(
[email protected]513b8032013-11-18 07:47:49224 content::BrowserContext* context) {
225 Profile* profile = static_cast<Profile*>(context);
226
thakis3e861de2016-06-14 14:24:01227 // Unit tests may not provide prefs; assume everything is up to date.
[email protected]513b8032013-11-18 07:47:49228 ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile);
[email protected]45fd94172013-11-13 03:29:52229 if (!extension_prefs)
230 return false;
231
rdevlin.cronin62018a12017-06-22 17:34:06232 if (g_did_chrome_update_for_testing)
233 return true;
234
thakis3e861de2016-06-14 14:24:01235 // If we're inside a browser test, then assume prefs are all up to date.
avi3ef9ec9e2014-12-22 22:50:17236 if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType))
[email protected]45fd94172013-11-13 03:29:52237 return false;
238
239 PrefService* pref_service = extension_prefs->pref_service();
240 base::Version last_version;
[email protected]234fc5ff2014-01-16 23:32:28241 if (pref_service->HasPrefPath(pref_names::kLastChromeVersion)) {
[email protected]45fd94172013-11-13 03:29:52242 std::string last_version_str =
[email protected]234fc5ff2014-01-16 23:32:28243 pref_service->GetString(pref_names::kLastChromeVersion);
[email protected]45fd94172013-11-13 03:29:52244 last_version = base::Version(last_version_str);
245 }
246
robpercivaldcd8b102016-01-25 19:39:00247 std::string current_version_str = version_info::GetVersionNumber();
248 base::Version current_version(current_version_str);
249 pref_service->SetString(pref_names::kLastChromeVersion, current_version_str);
[email protected]45fd94172013-11-13 03:29:52250
251 // If there was no version string in prefs, assume we're out of date.
252 if (!last_version.IsValid())
253 return true;
robpercivaldcd8b102016-01-25 19:39:00254 // If the current version string is invalid, assume we didn't update.
255 if (!current_version.IsValid())
256 return false;
[email protected]45fd94172013-11-13 03:29:52257
robpercivaldcd8b102016-01-25 19:39:00258 return last_version < current_version;
[email protected]45fd94172013-11-13 03:29:52259}
260
[email protected]86fad30d2014-07-29 21:39:27261void ChromeExtensionsBrowserClient::PermitExternalProtocolHandler() {
262 ExternalProtocolHandler::PermitLaunchUrl();
263}
264
[email protected]45928b682013-11-28 08:20:27265bool ChromeExtensionsBrowserClient::IsRunningInForcedAppMode() {
266 return chrome::IsRunningInForcedAppMode();
267}
268
Toni Barzicfc4a81a2018-01-31 01:48:59269bool ChromeExtensionsBrowserClient::IsAppModeForcedForApp(
270 const ExtensionId& extension_id) {
271 return chrome::IsRunningInForcedAppModeForApp(extension_id);
272}
273
kelvinp1b80b8f2015-10-01 01:22:13274bool ChromeExtensionsBrowserClient::IsLoggedInAsPublicAccount() {
275#if defined(OS_CHROMEOS)
276 return user_manager::UserManager::Get()->IsLoggedInAsPublicAccount();
277#else
278 return false;
279#endif
280}
281
[email protected]70489302014-02-13 15:15:48282ExtensionSystemProvider*
283ChromeExtensionsBrowserClient::GetExtensionSystemFactory() {
284 return ExtensionSystemFactory::GetInstance();
[email protected]8172a9d2014-01-09 23:18:30285}
286
[email protected]21c6c432014-03-05 18:47:31287void ChromeExtensionsBrowserClient::RegisterExtensionFunctions(
288 ExtensionFunctionRegistry* registry) const {
[email protected]21c6c432014-03-05 18:47:31289 // Preferences.
kalmane58e62232015-07-23 18:27:22290 registry->RegisterFunction<GetPreferenceFunction>();
291 registry->RegisterFunction<SetPreferenceFunction>();
292 registry->RegisterFunction<ClearPreferenceFunction>();
[email protected]21c6c432014-03-05 18:47:31293
[email protected]e3a8ebb92014-03-31 01:54:38294 // Generated APIs from lower-level modules.
kalmane58e62232015-07-23 18:27:22295 api::GeneratedFunctionRegistry::RegisterAll(registry);
[email protected]e3a8ebb92014-03-31 01:54:38296
297 // Generated APIs from Chrome.
kalmane58e62232015-07-23 18:27:22298 api::ChromeGeneratedFunctionRegistry::RegisterAll(registry);
[email protected]21c6c432014-03-05 18:47:31299}
300
Ben Goodgerb6169152017-07-22 04:09:43301void ChromeExtensionsBrowserClient::RegisterExtensionInterfaces(
302 service_manager::BinderRegistryWithArgs<content::RenderFrameHost*>*
303 registry,
kmarshall166e5b42015-04-03 22:29:43304 content::RenderFrameHost* render_frame_host,
305 const Extension* extension) const {
Ben Goodgerb6169152017-07-22 04:09:43306 RegisterInterfacesForExtension(registry, render_frame_host, extension);
307 RegisterChromeInterfacesForExtension(registry, render_frame_host, extension);
kmarshall166e5b42015-04-03 22:29:43308}
309
dchengc963c7142016-04-08 03:55:22310std::unique_ptr<RuntimeAPIDelegate>
rockotffa65b12014-10-14 17:19:06311ChromeExtensionsBrowserClient::CreateRuntimeAPIDelegate(
312 content::BrowserContext* context) const {
dchengc963c7142016-04-08 03:55:22313 return std::unique_ptr<RuntimeAPIDelegate>(
314 new ChromeRuntimeAPIDelegate(context));
rockotffa65b12014-10-14 17:19:06315}
316
mukaiee458c92015-01-06 01:30:33317const ComponentExtensionResourceManager*
[email protected]326e6f02014-06-20 04:53:37318ChromeExtensionsBrowserClient::GetComponentExtensionResourceManager() {
[email protected]326e6f02014-06-20 04:53:37319 return resource_manager_.get();
320}
321
thiago.santos89e236b2014-09-05 13:29:49322void ChromeExtensionsBrowserClient::BroadcastEventToRenderers(
kalman47451622015-07-22 17:41:51323 events::HistogramValue histogram_value,
thiago.santos89e236b2014-09-05 13:29:49324 const std::string& event_name,
dchengc963c7142016-04-08 03:55:22325 std::unique_ptr<base::ListValue> args) {
thiago.santos89e236b2014-09-05 13:29:49326 g_browser_process->extension_event_router_forwarder()
dcheng1fc00f12015-12-26 22:18:03327 ->BroadcastEventToRenderers(histogram_value, event_name, std::move(args),
kalman47451622015-07-22 17:41:51328 GURL());
thiago.santos89e236b2014-09-05 13:29:49329}
330
[email protected]4d1663782014-07-25 21:44:36331net::NetLog* ChromeExtensionsBrowserClient::GetNetLog() {
332 return g_browser_process->net_log();
333}
334
rockotffa65b12014-10-14 17:19:06335ExtensionCache* ChromeExtensionsBrowserClient::GetExtensionCache() {
336 if (!extension_cache_.get()) {
337#if defined(OS_CHROMEOS)
ginkage2179a15eb2015-03-18 13:55:52338 extension_cache_.reset(new ExtensionCacheImpl(
Jinho Bangb5216cec2018-01-17 19:43:11339 std::make_unique<ChromeOSExtensionCacheDelegate>()));
rockotffa65b12014-10-14 17:19:06340#else
341 extension_cache_.reset(new NullExtensionCache());
342#endif
343 }
344 return extension_cache_.get();
[email protected]f0e9ac552014-05-07 14:26:50345}
346
rockotf2a6b62c2014-10-15 21:58:07347bool ChromeExtensionsBrowserClient::IsBackgroundUpdateAllowed() {
avi3ef9ec9e2014-12-22 22:50:17348 return !base::CommandLine::ForCurrentProcess()->HasSwitch(
rockotf2a6b62c2014-10-15 21:58:07349 switches::kDisableBackgroundNetworking);
350}
351
352bool ChromeExtensionsBrowserClient::IsMinBrowserVersionSupported(
353 const std::string& min_version) {
sdefresne9fb67692015-08-03 18:48:22354 base::Version browser_version =
355 base::Version(version_info::GetVersionNumber());
pwnallcbd73192016-08-22 18:59:17356 base::Version browser_min_version(min_version);
rockotf2a6b62c2014-10-15 21:58:07357 if (browser_version.IsValid() && browser_min_version.IsValid() &&
358 browser_min_version.CompareTo(browser_version) > 0) {
359 return false;
360 }
361 return true;
362}
363
rdevlin.cronincb2ec659a2015-06-10 23:32:41364ExtensionWebContentsObserver*
365ChromeExtensionsBrowserClient::GetExtensionWebContentsObserver(
366 content::WebContents* web_contents) {
367 return ChromeExtensionWebContentsObserver::FromWebContents(web_contents);
368}
369
wittmanb3ee0482015-06-24 17:47:40370void ChromeExtensionsBrowserClient::ReportError(
371 content::BrowserContext* context,
dchengc963c7142016-04-08 03:55:22372 std::unique_ptr<ExtensionError> error) {
dcheng1fc00f12015-12-26 22:18:03373 ErrorConsole::Get(context)->ReportError(std::move(error));
wittmanb3ee0482015-06-24 17:47:40374}
375
paulmeyeree6c0ae72015-08-04 17:20:12376void ChromeExtensionsBrowserClient::CleanUpWebView(
377 content::BrowserContext* browser_context,
378 int embedder_process_id,
379 int view_instance_id) {
paulmeyered437262015-07-09 16:05:29380 // Clean up context menus for the WebView.
vmpstrae72b082016-07-25 21:55:47381 auto* menu_manager =
paulmeyered437262015-07-09 16:05:29382 MenuManager::Get(Profile::FromBrowserContext(browser_context));
383 menu_manager->RemoveAllContextItems(
384 MenuItem::ExtensionKey("", embedder_process_id, view_instance_id));
385}
386
afakhry31b34aac2015-08-07 17:55:56387void ChromeExtensionsBrowserClient::AttachExtensionTaskManagerTag(
388 content::WebContents* web_contents,
389 ViewType view_type) {
390 switch (view_type) {
391 case VIEW_TYPE_APP_WINDOW:
dmazzoni5ba638d2016-01-07 22:58:54392 case VIEW_TYPE_COMPONENT:
afakhry31b34aac2015-08-07 17:55:56393 case VIEW_TYPE_EXTENSION_BACKGROUND_PAGE:
394 case VIEW_TYPE_EXTENSION_DIALOG:
395 case VIEW_TYPE_EXTENSION_POPUP:
afakhry31b34aac2015-08-07 17:55:56396 // These are the only types that are tracked by the ExtensionTag.
avi24d693f2016-08-06 18:03:52397 task_manager::WebContentsTags::CreateForExtension(web_contents,
398 view_type);
afakhry31b34aac2015-08-07 17:55:56399 return;
400
401 case VIEW_TYPE_BACKGROUND_CONTENTS:
robcdcc4b82015-12-06 12:39:45402 case VIEW_TYPE_EXTENSION_GUEST:
afakhry31b34aac2015-08-07 17:55:56403 case VIEW_TYPE_PANEL:
404 case VIEW_TYPE_TAB_CONTENTS:
405 // Those types are tracked by other tags:
avi24d693f2016-08-06 18:03:52406 // BACKGROUND_CONTENTS --> task_manager::BackgroundContentsTag.
robcdcc4b82015-12-06 12:39:45407 // GUEST --> extensions::ChromeGuestViewManagerDelegate.
avi24d693f2016-08-06 18:03:52408 // PANEL --> task_manager::PanelTag.
409 // TAB_CONTENTS --> task_manager::TabContentsTag.
afakhry31b34aac2015-08-07 17:55:56410 // These tags are created and attached to the web_contents in other
411 // locations, and they must be ignored here.
412 return;
413
414 case VIEW_TYPE_INVALID:
415 NOTREACHED();
416 return;
417 }
418}
419
asargent631a99a2015-10-15 21:51:48420scoped_refptr<update_client::UpdateClient>
421ChromeExtensionsBrowserClient::CreateUpdateClient(
422 content::BrowserContext* context) {
423 return update_client::UpdateClientFactory(
kylechar96f3eba2017-09-25 20:23:56424 base::MakeRefCounted<ChromeUpdateClientConfig>(context));
asargent631a99a2015-10-15 21:51:48425}
426
rdevlin.cronin1790e822016-04-05 21:03:35427std::unique_ptr<ExtensionApiFrameIdMapHelper>
428ChromeExtensionsBrowserClient::CreateExtensionApiFrameIdMapHelper(
429 ExtensionApiFrameIdMap* map) {
Jinho Bangb5216cec2018-01-17 19:43:11430 return std::make_unique<ChromeExtensionApiFrameIdMapHelper>(map);
rdevlin.cronin9a62870f2016-02-11 23:25:58431}
432
juncai17fc8532016-06-02 06:45:50433std::unique_ptr<content::BluetoothChooser>
434ChromeExtensionsBrowserClient::CreateBluetoothChooser(
435 content::RenderFrameHost* frame,
436 const content::BluetoothChooser::EventHandler& event_handler) {
Jinho Bangb5216cec2018-01-17 19:43:11437 return std::make_unique<ChromeExtensionBluetoothChooser>(frame,
ricea91d6fc122016-08-30 08:47:14438 event_handler);
juncai17fc8532016-06-02 06:45:50439}
440
rdevlin.cronin6fba7ec2016-06-24 16:15:05441bool ChromeExtensionsBrowserClient::IsActivityLoggingEnabled(
442 content::BrowserContext* context) {
443 ActivityLog* activity_log = ActivityLog::GetInstance(context);
444 return activity_log && activity_log->is_active();
445}
446
jam059a6b42016-10-19 22:06:54447ExtensionNavigationUIData*
448ChromeExtensionsBrowserClient::GetExtensionNavigationUIData(
449 net::URLRequest* request) {
450 const content::ResourceRequestInfo* info =
451 content::ResourceRequestInfo::ForRequest(request);
452 if (!info)
453 return nullptr;
454 ChromeNavigationUIData* navigation_data =
455 static_cast<ChromeNavigationUIData*>(info->GetNavigationUIData());
456 if (!navigation_data)
457 return nullptr;
458 return navigation_data->GetExtensionNavigationUIData();
459}
460
steelc8e6ede2016-09-29 00:56:27461KioskDelegate* ChromeExtensionsBrowserClient::GetKioskDelegate() {
462 if (!kiosk_delegate_)
463 kiosk_delegate_.reset(new ChromeKioskDelegate());
464 return kiosk_delegate_.get();
465}
466
tbarzic8e89b0b12017-06-10 03:25:51467bool ChromeExtensionsBrowserClient::IsLockScreenContext(
468 content::BrowserContext* context) {
469#if defined(OS_CHROMEOS)
tbarzicd2a741e2017-06-28 20:37:54470 return chromeos::ProfileHelper::IsLockScreenAppProfile(
471 Profile::FromBrowserContext(context));
tbarzic8e89b0b12017-06-10 03:25:51472#else
473 return false;
474#endif
475}
rdevlin.cronin62018a12017-06-22 17:34:06476
Michael Giuffrida717aac42017-08-02 11:24:21477std::string ChromeExtensionsBrowserClient::GetApplicationLocale() {
478 return g_browser_process->GetApplicationLocale();
479}
480
Minh X. Nguyen3bfb32282017-11-09 17:11:14481bool ChromeExtensionsBrowserClient::IsExtensionEnabled(
482 const std::string& extension_id,
483 content::BrowserContext* context) const {
484 return ExtensionSystem::Get(context)->extension_service()->IsExtensionEnabled(
485 extension_id);
486}
487
rdevlin.cronin62018a12017-06-22 17:34:06488// static
489void ChromeExtensionsBrowserClient::set_did_chrome_update_for_testing(
490 bool did_update) {
491 g_did_chrome_update_for_testing = did_update;
492}
493
[email protected]9fe42042013-10-29 21:13:33494} // namespace extensions