blob: 56e3568ec7411fc439233b179f611297597c495d [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"
Francois Dorayc93ce0d2018-03-29 16:50:4510#include "base/logging.h"
[email protected]45fd94172013-11-13 03:29:5211#include "base/version.h"
avia2f4804a2015-12-24 23:11:1312#include "build/build_config.h"
[email protected]45928b682013-11-28 08:20:2713#include "chrome/browser/app_mode/app_mode_utils.h"
[email protected]9fe42042013-10-29 21:13:3314#include "chrome/browser/browser_process.h"
[email protected]13e062e2014-08-09 10:21:5515#include "chrome/browser/extensions/activity_log/activity_log.h"
16#include "chrome/browser/extensions/api/chrome_extensions_api_client.h"
17#include "chrome/browser/extensions/api/content_settings/content_settings_service.h"
[email protected]f0e9ac552014-05-07 14:26:5018#include "chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h"
[email protected]326e6f02014-06-20 04:53:3719#include "chrome/browser/extensions/chrome_component_extension_resource_manager.h"
rdevlin.cronin1790e822016-04-05 21:03:3520#include "chrome/browser/extensions/chrome_extension_api_frame_id_map_helper.h"
[email protected]6c0f179f2014-03-19 11:04:4121#include "chrome/browser/extensions/chrome_extension_host_delegate.h"
rdevlin.cronincb2ec659a2015-06-10 23:32:4122#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
Devlin Croninbc8177d2018-08-23 03:51:0923#include "chrome/browser/extensions/chrome_extensions_browser_api_provider.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"
Clark DuVall2cf99249e2018-09-19 19:11:5135#include "chrome/browser/extensions/user_script_listener.h"
[email protected]0b9de032014-03-15 05:47:0136#include "chrome/browser/external_protocol/external_protocol_handler.h"
John Abd-El-Malekebbb0df22018-08-23 19:11:3237#include "chrome/browser/net/system_network_context_manager.h"
[email protected]9fe42042013-10-29 21:13:3338#include "chrome/browser/profiles/profile.h"
[email protected]7f474212013-11-05 04:26:1639#include "chrome/browser/profiles/profile_manager.h"
jam059a6b42016-10-19 22:06:5440#include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
rdevlin.cronin9a62870f2016-02-11 23:25:5841#include "chrome/browser/sessions/session_tab_helper.h"
avi24d693f2016-08-06 18:03:5242#include "chrome/browser/task_manager/web_contents_tags.h"
juncai17fc8532016-06-02 06:45:5043#include "chrome/browser/ui/bluetooth/chrome_extension_bluetooth_chooser.h"
John Abd-El-Malek04bfa8532018-07-12 05:28:2244#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
sdefresne9fb67692015-08-03 18:48:2245#include "chrome/common/channel_info.h"
[email protected]326e6f02014-06-20 04:53:3746#include "chrome/common/chrome_paths.h"
[email protected]7f474212013-11-05 04:26:1647#include "chrome/common/chrome_switches.h"
[email protected]45fd94172013-11-13 03:29:5248#include "chrome/common/pref_names.h"
drogerc690e8802015-09-21 14:29:1649#include "components/net_log/chrome_net_log.h"
asargent631a99a2015-10-15 21:51:4850#include "components/update_client/update_client.h"
sdefresne9fb67692015-08-03 18:48:2251#include "components/version_info/version_info.h"
John Abd-El-Malekebbb0df22018-08-23 19:11:3252#include "content/public/browser/browser_thread.h"
paulmeyered437262015-07-09 16:05:2953#include "content/public/browser/render_process_host.h"
jam059a6b42016-10-19 22:06:5454#include "content/public/browser/resource_request_info.h"
brettw90e92602015-10-10 00:12:4055#include "content/public/common/content_switches.h"
Devlin Croninbc8177d2018-08-23 03:51:0956#include "extensions/browser/core_extensions_browser_api_provider.h"
[email protected]489db0842014-01-22 18:20:0357#include "extensions/browser/extension_prefs.h"
Minh X. Nguyen3bfb32282017-11-09 17:11:1458#include "extensions/browser/extension_system.h"
karandeepb810e33402017-04-05 23:41:2259#include "extensions/browser/extension_util.h"
Ben Goodgerb6169152017-07-22 04:09:4360#include "extensions/browser/mojo/interface_registration.h"
[email protected]234fc5ff2014-01-16 23:32:2861#include "extensions/browser/pref_names.h"
lfg048201a2014-09-16 19:09:3662#include "extensions/browser/url_request_util.h"
rdevlin.cronin41227532016-07-13 21:24:3463#include "extensions/common/features/feature_channel.h"
[email protected]9fe42042013-10-29 21:13:3364
[email protected]d0d1c052013-12-21 07:20:2265#if defined(OS_CHROMEOS)
Aga Wronskaff7f92d2018-07-25 21:08:3966#include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
stevenjbd194dd1362015-01-28 17:30:0867#include "chrome/browser/chromeos/profiles/profile_helper.h"
ginkage2179a15eb2015-03-18 13:55:5268#include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h"
rockotffa65b12014-10-14 17:19:0669#include "chrome/browser/extensions/updater/extension_cache_impl.h"
[email protected]d0d1c052013-12-21 07:20:2270#include "chromeos/chromeos_switches.h"
kelvinp1b80b8f2015-10-01 01:22:1371#include "components/user_manager/user_manager.h"
rockotffa65b12014-10-14 17:19:0672#else
73#include "extensions/browser/updater/null_extension_cache.h"
[email protected]d0d1c052013-12-21 07:20:2274#endif
75
[email protected]9fe42042013-10-29 21:13:3376namespace extensions {
77
rdevlin.cronin62018a12017-06-22 17:34:0678namespace {
79
80// If true, the extensions client will behave as though there is always a
81// new chrome update.
82bool g_did_chrome_update_for_testing = false;
83
Xi Chengd4850672018-02-26 18:01:5284bool ExtensionsDisabled(const base::CommandLine& command_line) {
Oscar Johansson7f4c1b932018-06-12 06:11:5885 return command_line.HasSwitch(::switches::kDisableExtensions) ||
86 command_line.HasSwitch(::switches::kDisableExtensionsExcept);
Xi Chengd4850672018-02-26 18:01:5287}
88
rdevlin.cronin62018a12017-06-22 17:34:0689} // namespace
90
[email protected]be514c32014-03-17 23:30:4491ChromeExtensionsBrowserClient::ChromeExtensionsBrowserClient() {
Devlin Croninbc8177d2018-08-23 03:51:0992 AddAPIProvider(std::make_unique<CoreExtensionsBrowserAPIProvider>());
93 AddAPIProvider(std::make_unique<ChromeExtensionsBrowserAPIProvider>());
94
[email protected]6b54fda2014-07-22 02:13:4795 process_manager_delegate_.reset(new ChromeProcessManagerDelegate);
[email protected]be514c32014-03-17 23:30:4496 api_client_.reset(new ChromeExtensionsAPIClient);
emaxx2ae3a0a2017-05-20 02:54:3697 SetCurrentChannel(chrome::GetChannel());
mukaiee458c92015-01-06 01:30:3398 resource_manager_.reset(new ChromeComponentExtensionResourceManager());
[email protected]59b0e602014-01-30 00:41:2499}
[email protected]9fe42042013-10-29 21:13:33100
101ChromeExtensionsBrowserClient::~ChromeExtensionsBrowserClient() {}
102
103bool ChromeExtensionsBrowserClient::IsShuttingDown() {
104 return g_browser_process->IsShuttingDown();
105}
106
[email protected]367d9b172013-12-03 00:31:02107bool ChromeExtensionsBrowserClient::AreExtensionsDisabled(
avi3ef9ec9e2014-12-22 22:50:17108 const base::CommandLine& command_line,
[email protected]367d9b172013-12-03 00:31:02109 content::BrowserContext* context) {
110 Profile* profile = static_cast<Profile*>(context);
Xi Chengd4850672018-02-26 18:01:52111 return ExtensionsDisabled(command_line) ||
catmullings98cd1942016-08-30 22:31:59112 profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions);
[email protected]367d9b172013-12-03 00:31:02113}
114
[email protected]45fd94172013-11-13 03:29:52115bool ChromeExtensionsBrowserClient::IsValidContext(
116 content::BrowserContext* context) {
Ramin Halavatif3432f42018-11-15 18:06:41117 // TODO(https://crbug.com/870838): Remove after investigating the bug.
118 if (!context) {
119 LOG(ERROR) << "Unexpected null context";
120 NOTREACHED();
121 return false;
122 }
123 if (!g_browser_process) {
124 LOG(ERROR) << "Unexpected null g_browser_process";
125 NOTREACHED();
126 return false;
127 }
[email protected]45fd94172013-11-13 03:29:52128 Profile* profile = static_cast<Profile*>(context);
scheibc0792ff2015-01-13 00:17:43129 return g_browser_process->profile_manager() &&
130 g_browser_process->profile_manager()->IsValidProfile(profile);
[email protected]45fd94172013-11-13 03:29:52131}
132
[email protected]9fe42042013-10-29 21:13:33133bool ChromeExtensionsBrowserClient::IsSameContext(
134 content::BrowserContext* first,
135 content::BrowserContext* second) {
mark a. foltz06ff8102017-09-05 20:18:09136 Profile* first_profile = Profile::FromBrowserContext(first);
137 Profile* second_profile = Profile::FromBrowserContext(second);
138 // TODO(crbug.com/727487): We need to check both ways because of offscreen
139 // presentation profiles, which are not registered with the original profile.
140 // This can be reverted to check just first->IsSameProfile(second) when Bug
141 // 727487 is fixed and presentations have a proper profile type. See Bug
142 // 664351 for background.
143 return first_profile->IsSameProfile(second_profile) ||
144 second_profile->IsSameProfile(first_profile);
[email protected]9fe42042013-10-29 21:13:33145}
146
147bool ChromeExtensionsBrowserClient::HasOffTheRecordContext(
148 content::BrowserContext* context) {
149 return static_cast<Profile*>(context)->HasOffTheRecordProfile();
150}
151
152content::BrowserContext* ChromeExtensionsBrowserClient::GetOffTheRecordContext(
153 content::BrowserContext* context) {
154 return static_cast<Profile*>(context)->GetOffTheRecordProfile();
155}
156
[email protected]7f474212013-11-05 04:26:16157content::BrowserContext* ChromeExtensionsBrowserClient::GetOriginalContext(
158 content::BrowserContext* context) {
Francois Dorayc93ce0d2018-03-29 16:50:45159 DCHECK(context);
[email protected]7f474212013-11-05 04:26:16160 return static_cast<Profile*>(context)->GetOriginalProfile();
161}
162
stevenjbd194dd1362015-01-28 17:30:08163#if defined(OS_CHROMEOS)
164std::string ChromeExtensionsBrowserClient::GetUserIdHashFromContext(
165 content::BrowserContext* context) {
166 return chromeos::ProfileHelper::GetUserIdHashFromProfile(
167 static_cast<Profile*>(context));
168}
169#endif
170
[email protected]a5fc73e2014-02-13 20:26:47171bool ChromeExtensionsBrowserClient::IsGuestSession(
[email protected]d012be2b2014-03-03 17:02:47172 content::BrowserContext* context) const {
[email protected]a5fc73e2014-02-13 20:26:47173 return static_cast<Profile*>(context)->IsGuestSession();
174}
175
[email protected]6a3d8ce42014-02-07 00:42:37176bool ChromeExtensionsBrowserClient::IsExtensionIncognitoEnabled(
177 const std::string& extension_id,
178 content::BrowserContext* context) const {
[email protected]d012be2b2014-03-03 17:02:47179 return IsGuestSession(context)
180 || util::IsIncognitoEnabled(extension_id, context);
[email protected]6a3d8ce42014-02-07 00:42:37181}
182
183bool ChromeExtensionsBrowserClient::CanExtensionCrossIncognito(
kalmane58e62232015-07-23 18:27:22184 const Extension* extension,
[email protected]6a3d8ce42014-02-07 00:42:37185 content::BrowserContext* context) const {
[email protected]d012be2b2014-03-03 17:02:47186 return IsGuestSession(context)
187 || util::CanCrossIncognito(extension, context);
[email protected]6a3d8ce42014-02-07 00:42:37188}
189
[email protected]1791e6c92014-04-11 08:29:01190net::URLRequestJob*
191ChromeExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob(
192 net::URLRequest* request,
193 net::NetworkDelegate* network_delegate,
194 const base::FilePath& directory_path,
195 const std::string& content_security_policy,
196 bool send_cors_header) {
lfg048201a2014-09-16 19:09:36197 return chrome_url_request_util::MaybeCreateURLRequestResourceBundleJob(
[email protected]1791e6c92014-04-11 08:29:01198 request,
199 network_delegate,
200 directory_path,
201 content_security_policy,
202 send_cors_header);
203}
204
Chris Mumford8f812662018-02-22 00:27:57205base::FilePath ChromeExtensionsBrowserClient::GetBundleResourcePath(
206 const network::ResourceRequest& request,
207 const base::FilePath& extension_resources_path,
208 int* resource_id) const {
209 return chrome_url_request_util::GetBundleResourcePath(
210 request, extension_resources_path, resource_id);
211}
212
213void ChromeExtensionsBrowserClient::LoadResourceFromResourceBundle(
214 const network::ResourceRequest& request,
215 network::mojom::URLLoaderRequest loader,
216 const base::FilePath& resource_relative_path,
217 int resource_id,
218 const std::string& content_security_policy,
219 network::mojom::URLLoaderClientPtr client,
220 bool send_cors_header) {
221 chrome_url_request_util::LoadResourceFromResourceBundle(
222 request, std::move(loader), resource_relative_path, resource_id,
223 content_security_policy, std::move(client), send_cors_header);
224}
225
[email protected]1791e6c92014-04-11 08:29:01226bool ChromeExtensionsBrowserClient::AllowCrossRendererResourceLoad(
Ken Rockot6414c4d92017-11-08 19:58:32227 const GURL& url,
228 content::ResourceType resource_type,
229 ui::PageTransition page_transition,
230 int child_id,
[email protected]1791e6c92014-04-11 08:29:01231 bool is_incognito,
232 const Extension* extension,
Ken Rockot6414c4d92017-11-08 19:58:32233 const ExtensionSet& extensions,
234 const ProcessMap& process_map) {
lfg048201a2014-09-16 19:09:36235 bool allowed = false;
236 if (chrome_url_request_util::AllowCrossRendererResourceLoad(
Ken Rockot6414c4d92017-11-08 19:58:32237 url, resource_type, page_transition, child_id, is_incognito,
238 extension, extensions, process_map, &allowed)) {
lfg048201a2014-09-16 19:09:36239 return allowed;
Ken Rockot6414c4d92017-11-08 19:58:32240 }
lfg048201a2014-09-16 19:09:36241
242 // Couldn't determine if resource is allowed. Block the load.
243 return false;
[email protected]1791e6c92014-04-11 08:29:01244}
245
[email protected]367d9b172013-12-03 00:31:02246PrefService* ChromeExtensionsBrowserClient::GetPrefServiceForContext(
247 content::BrowserContext* context) {
248 return static_cast<Profile*>(context)->GetPrefs();
249}
250
[email protected]d31e2482014-04-02 22:52:20251void ChromeExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
252 content::BrowserContext* context,
253 std::vector<ExtensionPrefsObserver*>* observers) const {
[email protected]d31e2482014-04-02 22:52:20254 observers->push_back(ContentSettingsService::Get(context));
[email protected]d31e2482014-04-02 22:52:20255}
256
[email protected]6b54fda2014-07-22 02:13:47257ProcessManagerDelegate*
258ChromeExtensionsBrowserClient::GetProcessManagerDelegate() const {
[email protected]6b54fda2014-07-22 02:13:47259 return process_manager_delegate_.get();
[email protected]7f474212013-11-05 04:26:16260}
261
dchengc963c7142016-04-08 03:55:22262std::unique_ptr<ExtensionHostDelegate>
[email protected]6c0f179f2014-03-19 11:04:41263ChromeExtensionsBrowserClient::CreateExtensionHostDelegate() {
dchengc963c7142016-04-08 03:55:22264 return std::unique_ptr<ExtensionHostDelegate>(
265 new ChromeExtensionHostDelegate);
[email protected]a36b55602014-02-08 02:32:32266}
267
[email protected]45fd94172013-11-13 03:29:52268bool ChromeExtensionsBrowserClient::DidVersionUpdate(
[email protected]513b8032013-11-18 07:47:49269 content::BrowserContext* context) {
270 Profile* profile = static_cast<Profile*>(context);
271
thakis3e861de2016-06-14 14:24:01272 // Unit tests may not provide prefs; assume everything is up to date.
[email protected]513b8032013-11-18 07:47:49273 ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile);
[email protected]45fd94172013-11-13 03:29:52274 if (!extension_prefs)
275 return false;
276
rdevlin.cronin62018a12017-06-22 17:34:06277 if (g_did_chrome_update_for_testing)
278 return true;
279
thakis3e861de2016-06-14 14:24:01280 // If we're inside a browser test, then assume prefs are all up to date.
Oscar Johansson7f4c1b932018-06-12 06:11:58281 if (base::CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType))
[email protected]45fd94172013-11-13 03:29:52282 return false;
283
284 PrefService* pref_service = extension_prefs->pref_service();
285 base::Version last_version;
[email protected]234fc5ff2014-01-16 23:32:28286 if (pref_service->HasPrefPath(pref_names::kLastChromeVersion)) {
[email protected]45fd94172013-11-13 03:29:52287 std::string last_version_str =
[email protected]234fc5ff2014-01-16 23:32:28288 pref_service->GetString(pref_names::kLastChromeVersion);
[email protected]45fd94172013-11-13 03:29:52289 last_version = base::Version(last_version_str);
290 }
291
robpercivaldcd8b102016-01-25 19:39:00292 std::string current_version_str = version_info::GetVersionNumber();
Lei Zhang3a309d092018-03-30 22:42:28293 const base::Version& current_version = version_info::GetVersion();
robpercivaldcd8b102016-01-25 19:39:00294 pref_service->SetString(pref_names::kLastChromeVersion, current_version_str);
[email protected]45fd94172013-11-13 03:29:52295
296 // If there was no version string in prefs, assume we're out of date.
297 if (!last_version.IsValid())
298 return true;
robpercivaldcd8b102016-01-25 19:39:00299 // If the current version string is invalid, assume we didn't update.
300 if (!current_version.IsValid())
301 return false;
[email protected]45fd94172013-11-13 03:29:52302
robpercivaldcd8b102016-01-25 19:39:00303 return last_version < current_version;
[email protected]45fd94172013-11-13 03:29:52304}
305
[email protected]86fad30d2014-07-29 21:39:27306void ChromeExtensionsBrowserClient::PermitExternalProtocolHandler() {
307 ExternalProtocolHandler::PermitLaunchUrl();
308}
309
Michael Giuffrida456e84e92018-07-12 01:33:12310bool ChromeExtensionsBrowserClient::IsInDemoMode() {
311#if defined(OS_CHROMEOS)
Aga Wronskaff7f92d2018-07-25 21:08:39312 const chromeos::DemoSession* const demo_session =
313 chromeos::DemoSession::Get();
314 return demo_session && demo_session->started();
Michael Giuffrida456e84e92018-07-12 01:33:12315#else
316 return false;
317#endif
318}
319
Wenzhao Zangc6955542018-09-19 18:49:01320bool ChromeExtensionsBrowserClient::IsScreensaverInDemoMode(
321 const std::string& app_id) {
322#if defined(OS_CHROMEOS)
Wenzhao Zang8415014c2018-09-19 21:41:23323 return app_id == chromeos::DemoSession::GetScreensaverAppId() &&
324 IsInDemoMode();
Wenzhao Zangc6955542018-09-19 18:49:01325#endif
326 return false;
327}
328
[email protected]45928b682013-11-28 08:20:27329bool ChromeExtensionsBrowserClient::IsRunningInForcedAppMode() {
330 return chrome::IsRunningInForcedAppMode();
331}
332
Toni Barzicfc4a81a2018-01-31 01:48:59333bool ChromeExtensionsBrowserClient::IsAppModeForcedForApp(
334 const ExtensionId& extension_id) {
335 return chrome::IsRunningInForcedAppModeForApp(extension_id);
336}
337
kelvinp1b80b8f2015-10-01 01:22:13338bool ChromeExtensionsBrowserClient::IsLoggedInAsPublicAccount() {
339#if defined(OS_CHROMEOS)
340 return user_manager::UserManager::Get()->IsLoggedInAsPublicAccount();
341#else
342 return false;
343#endif
344}
345
[email protected]70489302014-02-13 15:15:48346ExtensionSystemProvider*
347ChromeExtensionsBrowserClient::GetExtensionSystemFactory() {
348 return ExtensionSystemFactory::GetInstance();
[email protected]8172a9d2014-01-09 23:18:30349}
350
Ben Goodgerb6169152017-07-22 04:09:43351void ChromeExtensionsBrowserClient::RegisterExtensionInterfaces(
352 service_manager::BinderRegistryWithArgs<content::RenderFrameHost*>*
353 registry,
kmarshall166e5b42015-04-03 22:29:43354 content::RenderFrameHost* render_frame_host,
355 const Extension* extension) const {
Ben Goodgerb6169152017-07-22 04:09:43356 RegisterInterfacesForExtension(registry, render_frame_host, extension);
357 RegisterChromeInterfacesForExtension(registry, render_frame_host, extension);
kmarshall166e5b42015-04-03 22:29:43358}
359
dchengc963c7142016-04-08 03:55:22360std::unique_ptr<RuntimeAPIDelegate>
rockotffa65b12014-10-14 17:19:06361ChromeExtensionsBrowserClient::CreateRuntimeAPIDelegate(
362 content::BrowserContext* context) const {
dchengc963c7142016-04-08 03:55:22363 return std::unique_ptr<RuntimeAPIDelegate>(
364 new ChromeRuntimeAPIDelegate(context));
rockotffa65b12014-10-14 17:19:06365}
366
mukaiee458c92015-01-06 01:30:33367const ComponentExtensionResourceManager*
[email protected]326e6f02014-06-20 04:53:37368ChromeExtensionsBrowserClient::GetComponentExtensionResourceManager() {
[email protected]326e6f02014-06-20 04:53:37369 return resource_manager_.get();
370}
371
thiago.santos89e236b2014-09-05 13:29:49372void ChromeExtensionsBrowserClient::BroadcastEventToRenderers(
kalman47451622015-07-22 17:41:51373 events::HistogramValue histogram_value,
thiago.santos89e236b2014-09-05 13:29:49374 const std::string& event_name,
dchengc963c7142016-04-08 03:55:22375 std::unique_ptr<base::ListValue> args) {
thiago.santos89e236b2014-09-05 13:29:49376 g_browser_process->extension_event_router_forwarder()
dcheng1fc00f12015-12-26 22:18:03377 ->BroadcastEventToRenderers(histogram_value, event_name, std::move(args),
kalman47451622015-07-22 17:41:51378 GURL());
thiago.santos89e236b2014-09-05 13:29:49379}
380
[email protected]4d1663782014-07-25 21:44:36381net::NetLog* ChromeExtensionsBrowserClient::GetNetLog() {
382 return g_browser_process->net_log();
383}
384
rockotffa65b12014-10-14 17:19:06385ExtensionCache* ChromeExtensionsBrowserClient::GetExtensionCache() {
386 if (!extension_cache_.get()) {
387#if defined(OS_CHROMEOS)
ginkage2179a15eb2015-03-18 13:55:52388 extension_cache_.reset(new ExtensionCacheImpl(
Jinho Bangb5216cec2018-01-17 19:43:11389 std::make_unique<ChromeOSExtensionCacheDelegate>()));
rockotffa65b12014-10-14 17:19:06390#else
391 extension_cache_.reset(new NullExtensionCache());
392#endif
393 }
394 return extension_cache_.get();
[email protected]f0e9ac552014-05-07 14:26:50395}
396
rockotf2a6b62c2014-10-15 21:58:07397bool ChromeExtensionsBrowserClient::IsBackgroundUpdateAllowed() {
avi3ef9ec9e2014-12-22 22:50:17398 return !base::CommandLine::ForCurrentProcess()->HasSwitch(
Oscar Johansson7f4c1b932018-06-12 06:11:58399 ::switches::kDisableBackgroundNetworking);
rockotf2a6b62c2014-10-15 21:58:07400}
401
402bool ChromeExtensionsBrowserClient::IsMinBrowserVersionSupported(
403 const std::string& min_version) {
Lei Zhang3a309d092018-03-30 22:42:28404 const base::Version& browser_version = version_info::GetVersion();
pwnallcbd73192016-08-22 18:59:17405 base::Version browser_min_version(min_version);
Lei Zhang3a309d092018-03-30 22:42:28406 return !browser_version.IsValid() || !browser_min_version.IsValid() ||
407 browser_min_version.CompareTo(browser_version) <= 0;
rockotf2a6b62c2014-10-15 21:58:07408}
409
rdevlin.cronincb2ec659a2015-06-10 23:32:41410ExtensionWebContentsObserver*
411ChromeExtensionsBrowserClient::GetExtensionWebContentsObserver(
412 content::WebContents* web_contents) {
413 return ChromeExtensionWebContentsObserver::FromWebContents(web_contents);
414}
415
wittmanb3ee0482015-06-24 17:47:40416void ChromeExtensionsBrowserClient::ReportError(
417 content::BrowserContext* context,
dchengc963c7142016-04-08 03:55:22418 std::unique_ptr<ExtensionError> error) {
dcheng1fc00f12015-12-26 22:18:03419 ErrorConsole::Get(context)->ReportError(std::move(error));
wittmanb3ee0482015-06-24 17:47:40420}
421
paulmeyeree6c0ae72015-08-04 17:20:12422void ChromeExtensionsBrowserClient::CleanUpWebView(
423 content::BrowserContext* browser_context,
424 int embedder_process_id,
425 int view_instance_id) {
paulmeyered437262015-07-09 16:05:29426 // Clean up context menus for the WebView.
vmpstrae72b082016-07-25 21:55:47427 auto* menu_manager =
paulmeyered437262015-07-09 16:05:29428 MenuManager::Get(Profile::FromBrowserContext(browser_context));
429 menu_manager->RemoveAllContextItems(
430 MenuItem::ExtensionKey("", embedder_process_id, view_instance_id));
431}
432
afakhry31b34aac2015-08-07 17:55:56433void ChromeExtensionsBrowserClient::AttachExtensionTaskManagerTag(
434 content::WebContents* web_contents,
435 ViewType view_type) {
436 switch (view_type) {
437 case VIEW_TYPE_APP_WINDOW:
dmazzoni5ba638d2016-01-07 22:58:54438 case VIEW_TYPE_COMPONENT:
afakhry31b34aac2015-08-07 17:55:56439 case VIEW_TYPE_EXTENSION_BACKGROUND_PAGE:
440 case VIEW_TYPE_EXTENSION_DIALOG:
441 case VIEW_TYPE_EXTENSION_POPUP:
afakhry31b34aac2015-08-07 17:55:56442 // These are the only types that are tracked by the ExtensionTag.
avi24d693f2016-08-06 18:03:52443 task_manager::WebContentsTags::CreateForExtension(web_contents,
444 view_type);
afakhry31b34aac2015-08-07 17:55:56445 return;
446
447 case VIEW_TYPE_BACKGROUND_CONTENTS:
robcdcc4b82015-12-06 12:39:45448 case VIEW_TYPE_EXTENSION_GUEST:
afakhry31b34aac2015-08-07 17:55:56449 case VIEW_TYPE_TAB_CONTENTS:
450 // Those types are tracked by other tags:
avi24d693f2016-08-06 18:03:52451 // BACKGROUND_CONTENTS --> task_manager::BackgroundContentsTag.
robcdcc4b82015-12-06 12:39:45452 // GUEST --> extensions::ChromeGuestViewManagerDelegate.
avi24d693f2016-08-06 18:03:52453 // PANEL --> task_manager::PanelTag.
454 // TAB_CONTENTS --> task_manager::TabContentsTag.
afakhry31b34aac2015-08-07 17:55:56455 // These tags are created and attached to the web_contents in other
456 // locations, and they must be ignored here.
457 return;
458
459 case VIEW_TYPE_INVALID:
460 NOTREACHED();
461 return;
462 }
463}
464
asargent631a99a2015-10-15 21:51:48465scoped_refptr<update_client::UpdateClient>
466ChromeExtensionsBrowserClient::CreateUpdateClient(
467 content::BrowserContext* context) {
468 return update_client::UpdateClientFactory(
Minh X. Nguyen5c83226102018-04-19 16:10:25469 ChromeUpdateClientConfig::Create(context));
asargent631a99a2015-10-15 21:51:48470}
471
rdevlin.cronin1790e822016-04-05 21:03:35472std::unique_ptr<ExtensionApiFrameIdMapHelper>
473ChromeExtensionsBrowserClient::CreateExtensionApiFrameIdMapHelper(
474 ExtensionApiFrameIdMap* map) {
Jinho Bangb5216cec2018-01-17 19:43:11475 return std::make_unique<ChromeExtensionApiFrameIdMapHelper>(map);
rdevlin.cronin9a62870f2016-02-11 23:25:58476}
477
juncai17fc8532016-06-02 06:45:50478std::unique_ptr<content::BluetoothChooser>
479ChromeExtensionsBrowserClient::CreateBluetoothChooser(
480 content::RenderFrameHost* frame,
481 const content::BluetoothChooser::EventHandler& event_handler) {
Jinho Bangb5216cec2018-01-17 19:43:11482 return std::make_unique<ChromeExtensionBluetoothChooser>(frame,
ricea91d6fc122016-08-30 08:47:14483 event_handler);
juncai17fc8532016-06-02 06:45:50484}
485
rdevlin.cronin6fba7ec2016-06-24 16:15:05486bool ChromeExtensionsBrowserClient::IsActivityLoggingEnabled(
487 content::BrowserContext* context) {
488 ActivityLog* activity_log = ActivityLog::GetInstance(context);
489 return activity_log && activity_log->is_active();
490}
491
jam059a6b42016-10-19 22:06:54492ExtensionNavigationUIData*
493ChromeExtensionsBrowserClient::GetExtensionNavigationUIData(
494 net::URLRequest* request) {
495 const content::ResourceRequestInfo* info =
496 content::ResourceRequestInfo::ForRequest(request);
497 if (!info)
498 return nullptr;
499 ChromeNavigationUIData* navigation_data =
500 static_cast<ChromeNavigationUIData*>(info->GetNavigationUIData());
501 if (!navigation_data)
502 return nullptr;
503 return navigation_data->GetExtensionNavigationUIData();
504}
505
Ken Rockot06d07e32018-02-27 16:24:22506void ChromeExtensionsBrowserClient::GetTabAndWindowIdForWebContents(
507 content::WebContents* web_contents,
508 int* tab_id,
509 int* window_id) {
510 SessionTabHelper* session_tab_helper =
511 SessionTabHelper::FromWebContents(web_contents);
512 if (session_tab_helper) {
513 *tab_id = session_tab_helper->session_id().id();
514 *window_id = session_tab_helper->window_id().id();
515 } else {
516 *tab_id = -1;
517 *window_id = -1;
518 }
519}
520
steelc8e6ede2016-09-29 00:56:27521KioskDelegate* ChromeExtensionsBrowserClient::GetKioskDelegate() {
522 if (!kiosk_delegate_)
523 kiosk_delegate_.reset(new ChromeKioskDelegate());
524 return kiosk_delegate_.get();
525}
526
tbarzic8e89b0b12017-06-10 03:25:51527bool ChromeExtensionsBrowserClient::IsLockScreenContext(
528 content::BrowserContext* context) {
529#if defined(OS_CHROMEOS)
tbarzicd2a741e2017-06-28 20:37:54530 return chromeos::ProfileHelper::IsLockScreenAppProfile(
531 Profile::FromBrowserContext(context));
tbarzic8e89b0b12017-06-10 03:25:51532#else
533 return false;
534#endif
535}
rdevlin.cronin62018a12017-06-22 17:34:06536
Michael Giuffrida717aac42017-08-02 11:24:21537std::string ChromeExtensionsBrowserClient::GetApplicationLocale() {
538 return g_browser_process->GetApplicationLocale();
539}
540
Minh X. Nguyen3bfb32282017-11-09 17:11:14541bool ChromeExtensionsBrowserClient::IsExtensionEnabled(
542 const std::string& extension_id,
543 content::BrowserContext* context) const {
544 return ExtensionSystem::Get(context)->extension_service()->IsExtensionEnabled(
545 extension_id);
546}
547
John Abd-El-Malek04bfa8532018-07-12 05:28:22548bool ChromeExtensionsBrowserClient::IsWebUIAllowedToMakeNetworkRequests(
549 const url::Origin& origin) {
550 return ChromeWebUIControllerFactory::IsWebUIAllowedToMakeNetworkRequests(
551 origin);
552}
553
John Abd-El-Malekebbb0df22018-08-23 19:11:32554network::mojom::NetworkContext*
555ChromeExtensionsBrowserClient::GetSystemNetworkContext() {
556 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
557 return g_browser_process->system_network_context_manager()->GetContext();
558}
559
Clark DuVall2cf99249e2018-09-19 19:11:51560UserScriptListener* ChromeExtensionsBrowserClient::GetUserScriptListener() {
561 // Create lazily since this accesses g_browser_process which may not be set up
562 // when ChromeExtensionsBrowserClient is created.
563 if (!user_script_listener_)
564 user_script_listener_ = std::make_unique<UserScriptListener>();
565 return user_script_listener_.get();
566}
567
rdevlin.cronin62018a12017-06-22 17:34:06568// static
569void ChromeExtensionsBrowserClient::set_did_chrome_update_for_testing(
570 bool did_update) {
571 g_did_chrome_update_for_testing = did_update;
572}
573
[email protected]9fe42042013-10-29 21:13:33574} // namespace extensions