blob: bd9ac751d77fb74d03686caf6185bd738e2f522a [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"
Yutaka Hirano968d6252018-12-04 05:09:3115#include "chrome/browser/chrome_content_browser_client.h"
Alexander Hendrichf90ea2802019-06-27 08:42:5516#include "chrome/browser/chromeos/profiles/profile_helper.h"
[email protected]13e062e2014-08-09 10:21:5517#include "chrome/browser/extensions/activity_log/activity_log.h"
18#include "chrome/browser/extensions/api/chrome_extensions_api_client.h"
19#include "chrome/browser/extensions/api/content_settings/content_settings_service.h"
[email protected]f0e9ac552014-05-07 14:26:5020#include "chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h"
[email protected]326e6f02014-06-20 04:53:3721#include "chrome/browser/extensions/chrome_component_extension_resource_manager.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"
Devlin Croninbc8177d2018-08-23 03:51:0924#include "chrome/browser/extensions/chrome_extensions_browser_api_provider.h"
Miyoung Shinb6b328b2019-12-10 04:39:3325#include "chrome/browser/extensions/chrome_extensions_browser_interface_binders.h"
steelc8e6ede2016-09-29 00:56:2726#include "chrome/browser/extensions/chrome_kiosk_delegate.h"
[email protected]13e062e2014-08-09 10:21:5527#include "chrome/browser/extensions/chrome_process_manager_delegate.h"
lfg048201a2014-09-16 19:09:3628#include "chrome/browser/extensions/chrome_url_request_util.h"
wittmanb3ee0482015-06-24 17:47:4029#include "chrome/browser/extensions/error_console/error_console.h"
thiago.santos89e236b2014-09-05 13:29:4930#include "chrome/browser/extensions/event_router_forwarder.h"
Minh X. Nguyen3bfb32282017-11-09 17:11:1431#include "chrome/browser/extensions/extension_service.h"
[email protected]8172a9d2014-01-09 23:18:3032#include "chrome/browser/extensions/extension_system_factory.h"
[email protected]6a3d8ce42014-02-07 00:42:3733#include "chrome/browser/extensions/extension_util.h"
paulmeyered437262015-07-09 16:05:2934#include "chrome/browser/extensions/menu_manager.h"
asargent631a99a2015-10-15 21:51:4835#include "chrome/browser/extensions/updater/chrome_update_client_config.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"
avi24d693f2016-08-06 18:03:5241#include "chrome/browser/task_manager/web_contents_tags.h"
juncai17fc8532016-06-02 06:45:5042#include "chrome/browser/ui/bluetooth/chrome_extension_bluetooth_chooser.h"
John Abd-El-Malek04bfa8532018-07-12 05:28:2243#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
sdefresne9fb67692015-08-03 18:48:2244#include "chrome/common/channel_info.h"
[email protected]326e6f02014-06-20 04:53:3745#include "chrome/common/chrome_paths.h"
[email protected]7f474212013-11-05 04:26:1646#include "chrome/common/chrome_switches.h"
[email protected]45fd94172013-11-13 03:29:5247#include "chrome/common/pref_names.h"
Lukasz Anforowiczfeddf7e32019-09-18 22:13:2348#include "chrome/common/url_constants.h"
Scott Violet5655874f2020-01-14 21:03:2149#include "components/sessions/content/session_tab_helper.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"
brettw90e92602015-10-10 00:12:4054#include "content/public/common/content_switches.h"
Devlin Croninbc8177d2018-08-23 03:51:0955#include "extensions/browser/core_extensions_browser_api_provider.h"
[email protected]489db0842014-01-22 18:20:0356#include "extensions/browser/extension_prefs.h"
Minh X. Nguyen3bfb32282017-11-09 17:11:1457#include "extensions/browser/extension_system.h"
karandeepb810e33402017-04-05 23:41:2258#include "extensions/browser/extension_util.h"
Miyoung Shin70485f02019-12-05 05:21:0359#include "extensions/browser/extensions_browser_interface_binders.h"
[email protected]234fc5ff2014-01-16 23:32:2860#include "extensions/browser/pref_names.h"
lfg048201a2014-09-16 19:09:3661#include "extensions/browser/url_request_util.h"
rdevlin.cronin41227532016-07-13 21:24:3462#include "extensions/common/features/feature_channel.h"
[email protected]9fe42042013-10-29 21:13:3363
[email protected]d0d1c052013-12-21 07:20:2264#if defined(OS_CHROMEOS)
Aga Wronskaff7f92d2018-07-25 21:08:3965#include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
stevenjbd194dd1362015-01-28 17:30:0866#include "chrome/browser/chromeos/profiles/profile_helper.h"
ginkage2179a15eb2015-03-18 13:55:5267#include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h"
rockotffa65b12014-10-14 17:19:0668#include "chrome/browser/extensions/updater/extension_cache_impl.h"
Steven Bennetts38e9bde22019-01-03 17:31:1069#include "chromeos/constants/chromeos_switches.h"
kelvinp1b80b8f2015-10-01 01:22:1370#include "components/user_manager/user_manager.h"
rockotffa65b12014-10-14 17:19:0671#else
72#include "extensions/browser/updater/null_extension_cache.h"
[email protected]d0d1c052013-12-21 07:20:2273#endif
74
[email protected]9fe42042013-10-29 21:13:3375namespace extensions {
76
rdevlin.cronin62018a12017-06-22 17:34:0677namespace {
78
79// If true, the extensions client will behave as though there is always a
80// new chrome update.
81bool g_did_chrome_update_for_testing = false;
82
Xi Chengd4850672018-02-26 18:01:5283bool ExtensionsDisabled(const base::CommandLine& command_line) {
Oscar Johansson7f4c1b932018-06-12 06:11:5884 return command_line.HasSwitch(::switches::kDisableExtensions) ||
85 command_line.HasSwitch(::switches::kDisableExtensionsExcept);
Xi Chengd4850672018-02-26 18:01:5286}
87
rdevlin.cronin62018a12017-06-22 17:34:0688} // namespace
89
[email protected]be514c32014-03-17 23:30:4490ChromeExtensionsBrowserClient::ChromeExtensionsBrowserClient() {
Devlin Croninbc8177d2018-08-23 03:51:0991 AddAPIProvider(std::make_unique<CoreExtensionsBrowserAPIProvider>());
92 AddAPIProvider(std::make_unique<ChromeExtensionsBrowserAPIProvider>());
93
[email protected]6b54fda2014-07-22 02:13:4794 process_manager_delegate_.reset(new ChromeProcessManagerDelegate);
[email protected]be514c32014-03-17 23:30:4495 api_client_.reset(new ChromeExtensionsAPIClient);
emaxx2ae3a0a2017-05-20 02:54:3696 SetCurrentChannel(chrome::GetChannel());
mukaiee458c92015-01-06 01:30:3397 resource_manager_.reset(new ChromeComponentExtensionResourceManager());
[email protected]59b0e602014-01-30 00:41:2498}
[email protected]9fe42042013-10-29 21:13:3399
100ChromeExtensionsBrowserClient::~ChromeExtensionsBrowserClient() {}
101
102bool ChromeExtensionsBrowserClient::IsShuttingDown() {
103 return g_browser_process->IsShuttingDown();
104}
105
[email protected]367d9b172013-12-03 00:31:02106bool ChromeExtensionsBrowserClient::AreExtensionsDisabled(
avi3ef9ec9e2014-12-22 22:50:17107 const base::CommandLine& command_line,
[email protected]367d9b172013-12-03 00:31:02108 content::BrowserContext* context) {
109 Profile* profile = static_cast<Profile*>(context);
Xi Chengd4850672018-02-26 18:01:52110 return ExtensionsDisabled(command_line) ||
catmullings98cd1942016-08-30 22:31:59111 profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions);
[email protected]367d9b172013-12-03 00:31:02112}
113
[email protected]45fd94172013-11-13 03:29:52114bool ChromeExtensionsBrowserClient::IsValidContext(
115 content::BrowserContext* context) {
Ramin Halavati1e2fb522019-05-07 06:11:02116 DCHECK(context);
Ramin Halavatif3432f42018-11-15 18:06:41117 if (!g_browser_process) {
118 LOG(ERROR) << "Unexpected null g_browser_process";
119 NOTREACHED();
120 return false;
121 }
[email protected]45fd94172013-11-13 03:29:52122 Profile* profile = static_cast<Profile*>(context);
scheibc0792ff2015-01-13 00:17:43123 return g_browser_process->profile_manager() &&
124 g_browser_process->profile_manager()->IsValidProfile(profile);
[email protected]45fd94172013-11-13 03:29:52125}
126
[email protected]9fe42042013-10-29 21:13:33127bool ChromeExtensionsBrowserClient::IsSameContext(
128 content::BrowserContext* first,
129 content::BrowserContext* second) {
mark a. foltz06ff8102017-09-05 20:18:09130 Profile* first_profile = Profile::FromBrowserContext(first);
131 Profile* second_profile = Profile::FromBrowserContext(second);
132 // TODO(crbug.com/727487): We need to check both ways because of offscreen
133 // presentation profiles, which are not registered with the original profile.
134 // This can be reverted to check just first->IsSameProfile(second) when Bug
135 // 727487 is fixed and presentations have a proper profile type. See Bug
136 // 664351 for background.
137 return first_profile->IsSameProfile(second_profile) ||
138 second_profile->IsSameProfile(first_profile);
[email protected]9fe42042013-10-29 21:13:33139}
140
141bool ChromeExtensionsBrowserClient::HasOffTheRecordContext(
142 content::BrowserContext* context) {
143 return static_cast<Profile*>(context)->HasOffTheRecordProfile();
144}
145
146content::BrowserContext* ChromeExtensionsBrowserClient::GetOffTheRecordContext(
147 content::BrowserContext* context) {
148 return static_cast<Profile*>(context)->GetOffTheRecordProfile();
149}
150
[email protected]7f474212013-11-05 04:26:16151content::BrowserContext* ChromeExtensionsBrowserClient::GetOriginalContext(
152 content::BrowserContext* context) {
Francois Dorayc93ce0d2018-03-29 16:50:45153 DCHECK(context);
[email protected]7f474212013-11-05 04:26:16154 return static_cast<Profile*>(context)->GetOriginalProfile();
155}
156
stevenjbd194dd1362015-01-28 17:30:08157#if defined(OS_CHROMEOS)
158std::string ChromeExtensionsBrowserClient::GetUserIdHashFromContext(
159 content::BrowserContext* context) {
160 return chromeos::ProfileHelper::GetUserIdHashFromProfile(
161 static_cast<Profile*>(context));
162}
163#endif
164
[email protected]a5fc73e2014-02-13 20:26:47165bool ChromeExtensionsBrowserClient::IsGuestSession(
[email protected]d012be2b2014-03-03 17:02:47166 content::BrowserContext* context) const {
[email protected]a5fc73e2014-02-13 20:26:47167 return static_cast<Profile*>(context)->IsGuestSession();
168}
169
[email protected]6a3d8ce42014-02-07 00:42:37170bool ChromeExtensionsBrowserClient::IsExtensionIncognitoEnabled(
171 const std::string& extension_id,
172 content::BrowserContext* context) const {
[email protected]d012be2b2014-03-03 17:02:47173 return IsGuestSession(context)
174 || util::IsIncognitoEnabled(extension_id, context);
[email protected]6a3d8ce42014-02-07 00:42:37175}
176
177bool ChromeExtensionsBrowserClient::CanExtensionCrossIncognito(
kalmane58e62232015-07-23 18:27:22178 const Extension* extension,
[email protected]6a3d8ce42014-02-07 00:42:37179 content::BrowserContext* context) const {
[email protected]d012be2b2014-03-03 17:02:47180 return IsGuestSession(context)
181 || util::CanCrossIncognito(extension, context);
[email protected]6a3d8ce42014-02-07 00:42:37182}
183
Chris Mumford8f812662018-02-22 00:27:57184base::FilePath ChromeExtensionsBrowserClient::GetBundleResourcePath(
185 const network::ResourceRequest& request,
186 const base::FilePath& extension_resources_path,
dpapad669a89702019-05-10 18:00:49187 int* resource_id) const {
Chris Mumford8f812662018-02-22 00:27:57188 return chrome_url_request_util::GetBundleResourcePath(
dpapad669a89702019-05-10 18:00:49189 request, extension_resources_path, resource_id);
Chris Mumford8f812662018-02-22 00:27:57190}
191
192void ChromeExtensionsBrowserClient::LoadResourceFromResourceBundle(
193 const network::ResourceRequest& request,
Julie Jeongeun Kimf65376f2019-11-05 03:54:55194 mojo::PendingReceiver<network::mojom::URLLoader> loader,
Chris Mumford8f812662018-02-22 00:27:57195 const base::FilePath& resource_relative_path,
dpapad669a89702019-05-10 18:00:49196 int resource_id,
Chris Mumford8f812662018-02-22 00:27:57197 const std::string& content_security_policy,
Julie Jeongeun Kim6dd4c7b2019-11-18 05:56:30198 mojo::PendingRemote<network::mojom::URLLoaderClient> client,
Chris Mumford8f812662018-02-22 00:27:57199 bool send_cors_header) {
200 chrome_url_request_util::LoadResourceFromResourceBundle(
dpapad669a89702019-05-10 18:00:49201 request, std::move(loader), resource_relative_path, resource_id,
Chris Mumford8f812662018-02-22 00:27:57202 content_security_policy, std::move(client), send_cors_header);
203}
204
[email protected]1791e6c92014-04-11 08:29:01205bool ChromeExtensionsBrowserClient::AllowCrossRendererResourceLoad(
Ken Rockot6414c4d92017-11-08 19:58:32206 const GURL& url,
Minggang Wangee5af392020-02-05 02:55:28207 blink::mojom::ResourceType resource_type,
Ken Rockot6414c4d92017-11-08 19:58:32208 ui::PageTransition page_transition,
209 int child_id,
[email protected]1791e6c92014-04-11 08:29:01210 bool is_incognito,
211 const Extension* extension,
Ken Rockot6414c4d92017-11-08 19:58:32212 const ExtensionSet& extensions,
213 const ProcessMap& process_map) {
lfg048201a2014-09-16 19:09:36214 bool allowed = false;
215 if (chrome_url_request_util::AllowCrossRendererResourceLoad(
Ken Rockot6414c4d92017-11-08 19:58:32216 url, resource_type, page_transition, child_id, is_incognito,
217 extension, extensions, process_map, &allowed)) {
lfg048201a2014-09-16 19:09:36218 return allowed;
Ken Rockot6414c4d92017-11-08 19:58:32219 }
lfg048201a2014-09-16 19:09:36220
221 // Couldn't determine if resource is allowed. Block the load.
222 return false;
[email protected]1791e6c92014-04-11 08:29:01223}
224
[email protected]367d9b172013-12-03 00:31:02225PrefService* ChromeExtensionsBrowserClient::GetPrefServiceForContext(
226 content::BrowserContext* context) {
227 return static_cast<Profile*>(context)->GetPrefs();
228}
229
[email protected]d31e2482014-04-02 22:52:20230void ChromeExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
231 content::BrowserContext* context,
Nigel Tao650b7312019-04-27 00:18:32232 std::vector<EarlyExtensionPrefsObserver*>* observers) const {
[email protected]d31e2482014-04-02 22:52:20233 observers->push_back(ContentSettingsService::Get(context));
[email protected]d31e2482014-04-02 22:52:20234}
235
[email protected]6b54fda2014-07-22 02:13:47236ProcessManagerDelegate*
237ChromeExtensionsBrowserClient::GetProcessManagerDelegate() const {
[email protected]6b54fda2014-07-22 02:13:47238 return process_manager_delegate_.get();
[email protected]7f474212013-11-05 04:26:16239}
240
dchengc963c7142016-04-08 03:55:22241std::unique_ptr<ExtensionHostDelegate>
[email protected]6c0f179f2014-03-19 11:04:41242ChromeExtensionsBrowserClient::CreateExtensionHostDelegate() {
dchengc963c7142016-04-08 03:55:22243 return std::unique_ptr<ExtensionHostDelegate>(
244 new ChromeExtensionHostDelegate);
[email protected]a36b55602014-02-08 02:32:32245}
246
[email protected]45fd94172013-11-13 03:29:52247bool ChromeExtensionsBrowserClient::DidVersionUpdate(
[email protected]513b8032013-11-18 07:47:49248 content::BrowserContext* context) {
249 Profile* profile = static_cast<Profile*>(context);
250
thakis3e861de2016-06-14 14:24:01251 // Unit tests may not provide prefs; assume everything is up to date.
[email protected]513b8032013-11-18 07:47:49252 ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile);
[email protected]45fd94172013-11-13 03:29:52253 if (!extension_prefs)
254 return false;
255
rdevlin.cronin62018a12017-06-22 17:34:06256 if (g_did_chrome_update_for_testing)
257 return true;
258
thakis3e861de2016-06-14 14:24:01259 // If we're inside a browser test, then assume prefs are all up to date.
Oscar Johansson7f4c1b932018-06-12 06:11:58260 if (base::CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType))
[email protected]45fd94172013-11-13 03:29:52261 return false;
262
263 PrefService* pref_service = extension_prefs->pref_service();
264 base::Version last_version;
[email protected]234fc5ff2014-01-16 23:32:28265 if (pref_service->HasPrefPath(pref_names::kLastChromeVersion)) {
[email protected]45fd94172013-11-13 03:29:52266 std::string last_version_str =
[email protected]234fc5ff2014-01-16 23:32:28267 pref_service->GetString(pref_names::kLastChromeVersion);
[email protected]45fd94172013-11-13 03:29:52268 last_version = base::Version(last_version_str);
269 }
270
robpercivaldcd8b102016-01-25 19:39:00271 std::string current_version_str = version_info::GetVersionNumber();
Lei Zhang3a309d092018-03-30 22:42:28272 const base::Version& current_version = version_info::GetVersion();
robpercivaldcd8b102016-01-25 19:39:00273 pref_service->SetString(pref_names::kLastChromeVersion, current_version_str);
[email protected]45fd94172013-11-13 03:29:52274
275 // If there was no version string in prefs, assume we're out of date.
276 if (!last_version.IsValid())
277 return true;
robpercivaldcd8b102016-01-25 19:39:00278 // If the current version string is invalid, assume we didn't update.
279 if (!current_version.IsValid())
280 return false;
[email protected]45fd94172013-11-13 03:29:52281
robpercivaldcd8b102016-01-25 19:39:00282 return last_version < current_version;
[email protected]45fd94172013-11-13 03:29:52283}
284
[email protected]86fad30d2014-07-29 21:39:27285void ChromeExtensionsBrowserClient::PermitExternalProtocolHandler() {
286 ExternalProtocolHandler::PermitLaunchUrl();
287}
288
Michael Giuffrida456e84e92018-07-12 01:33:12289bool ChromeExtensionsBrowserClient::IsInDemoMode() {
290#if defined(OS_CHROMEOS)
Aga Wronskaff7f92d2018-07-25 21:08:39291 const chromeos::DemoSession* const demo_session =
292 chromeos::DemoSession::Get();
293 return demo_session && demo_session->started();
Michael Giuffrida456e84e92018-07-12 01:33:12294#else
295 return false;
296#endif
297}
298
Wenzhao Zangc6955542018-09-19 18:49:01299bool ChromeExtensionsBrowserClient::IsScreensaverInDemoMode(
300 const std::string& app_id) {
301#if defined(OS_CHROMEOS)
Wenzhao Zang8415014c2018-09-19 21:41:23302 return app_id == chromeos::DemoSession::GetScreensaverAppId() &&
303 IsInDemoMode();
Wenzhao Zangc6955542018-09-19 18:49:01304#endif
305 return false;
306}
307
[email protected]45928b682013-11-28 08:20:27308bool ChromeExtensionsBrowserClient::IsRunningInForcedAppMode() {
309 return chrome::IsRunningInForcedAppMode();
310}
311
Toni Barzicfc4a81a2018-01-31 01:48:59312bool ChromeExtensionsBrowserClient::IsAppModeForcedForApp(
313 const ExtensionId& extension_id) {
314 return chrome::IsRunningInForcedAppModeForApp(extension_id);
315}
316
kelvinp1b80b8f2015-10-01 01:22:13317bool ChromeExtensionsBrowserClient::IsLoggedInAsPublicAccount() {
318#if defined(OS_CHROMEOS)
319 return user_manager::UserManager::Get()->IsLoggedInAsPublicAccount();
320#else
321 return false;
322#endif
323}
324
[email protected]70489302014-02-13 15:15:48325ExtensionSystemProvider*
326ChromeExtensionsBrowserClient::GetExtensionSystemFactory() {
327 return ExtensionSystemFactory::GetInstance();
[email protected]8172a9d2014-01-09 23:18:30328}
329
Miyoung Shin70485f02019-12-05 05:21:03330void ChromeExtensionsBrowserClient::RegisterBrowserInterfaceBindersForFrame(
Miyoung Shinb6b328b2019-12-10 04:39:33331 service_manager::BinderMapWithContext<content::RenderFrameHost*>*
332 binder_map,
Miyoung Shin70485f02019-12-05 05:21:03333 content::RenderFrameHost* render_frame_host,
334 const Extension* extension) const {
Miyoung Shinb6b328b2019-12-10 04:39:33335 PopulateExtensionFrameBinders(binder_map, render_frame_host, extension);
336 PopulateChromeFrameBindersForExtension(binder_map, render_frame_host,
337 extension);
Miyoung Shin70485f02019-12-05 05:21:03338}
339
dchengc963c7142016-04-08 03:55:22340std::unique_ptr<RuntimeAPIDelegate>
rockotffa65b12014-10-14 17:19:06341ChromeExtensionsBrowserClient::CreateRuntimeAPIDelegate(
342 content::BrowserContext* context) const {
dchengc963c7142016-04-08 03:55:22343 return std::unique_ptr<RuntimeAPIDelegate>(
344 new ChromeRuntimeAPIDelegate(context));
rockotffa65b12014-10-14 17:19:06345}
346
mukaiee458c92015-01-06 01:30:33347const ComponentExtensionResourceManager*
[email protected]326e6f02014-06-20 04:53:37348ChromeExtensionsBrowserClient::GetComponentExtensionResourceManager() {
[email protected]326e6f02014-06-20 04:53:37349 return resource_manager_.get();
350}
351
thiago.santos89e236b2014-09-05 13:29:49352void ChromeExtensionsBrowserClient::BroadcastEventToRenderers(
kalman47451622015-07-22 17:41:51353 events::HistogramValue histogram_value,
thiago.santos89e236b2014-09-05 13:29:49354 const std::string& event_name,
Keith Leed9510012019-08-27 06:22:00355 std::unique_ptr<base::ListValue> args,
356 bool dispatch_to_off_the_record_profiles) {
thiago.santos89e236b2014-09-05 13:29:49357 g_browser_process->extension_event_router_forwarder()
dcheng1fc00f12015-12-26 22:18:03358 ->BroadcastEventToRenderers(histogram_value, event_name, std::move(args),
Keith Leed9510012019-08-27 06:22:00359 GURL(), dispatch_to_off_the_record_profiles);
thiago.santos89e236b2014-09-05 13:29:49360}
361
rockotffa65b12014-10-14 17:19:06362ExtensionCache* ChromeExtensionsBrowserClient::GetExtensionCache() {
363 if (!extension_cache_.get()) {
364#if defined(OS_CHROMEOS)
Maksim Ivanov8738d332020-01-07 22:19:01365 // TODO(crbug.com/1012892): Replace this with just BEST_EFFORT, since the
366 // sign-in profile extensions use a different caching mechanism now.
Alexander Hendrichf90ea2802019-06-27 08:42:55367 base::TaskPriority task_priority =
368 chromeos::ProfileHelper::IsSigninProfileInitialized() &&
369 chromeos::ProfileHelper::SigninProfileHasLoginScreenExtensions()
370 ? base::TaskPriority::USER_VISIBLE
371 : base::TaskPriority::BEST_EFFORT;
ginkage2179a15eb2015-03-18 13:55:52372 extension_cache_.reset(new ExtensionCacheImpl(
Alexander Hendrichf90ea2802019-06-27 08:42:55373 std::make_unique<ChromeOSExtensionCacheDelegate>(), task_priority));
rockotffa65b12014-10-14 17:19:06374#else
375 extension_cache_.reset(new NullExtensionCache());
376#endif
377 }
378 return extension_cache_.get();
[email protected]f0e9ac552014-05-07 14:26:50379}
380
rockotf2a6b62c2014-10-15 21:58:07381bool ChromeExtensionsBrowserClient::IsBackgroundUpdateAllowed() {
avi3ef9ec9e2014-12-22 22:50:17382 return !base::CommandLine::ForCurrentProcess()->HasSwitch(
Oscar Johansson7f4c1b932018-06-12 06:11:58383 ::switches::kDisableBackgroundNetworking);
rockotf2a6b62c2014-10-15 21:58:07384}
385
386bool ChromeExtensionsBrowserClient::IsMinBrowserVersionSupported(
387 const std::string& min_version) {
Lei Zhang3a309d092018-03-30 22:42:28388 const base::Version& browser_version = version_info::GetVersion();
pwnallcbd73192016-08-22 18:59:17389 base::Version browser_min_version(min_version);
Lei Zhang3a309d092018-03-30 22:42:28390 return !browser_version.IsValid() || !browser_min_version.IsValid() ||
391 browser_min_version.CompareTo(browser_version) <= 0;
rockotf2a6b62c2014-10-15 21:58:07392}
393
rdevlin.cronincb2ec659a2015-06-10 23:32:41394ExtensionWebContentsObserver*
395ChromeExtensionsBrowserClient::GetExtensionWebContentsObserver(
396 content::WebContents* web_contents) {
397 return ChromeExtensionWebContentsObserver::FromWebContents(web_contents);
398}
399
wittmanb3ee0482015-06-24 17:47:40400void ChromeExtensionsBrowserClient::ReportError(
401 content::BrowserContext* context,
dchengc963c7142016-04-08 03:55:22402 std::unique_ptr<ExtensionError> error) {
dcheng1fc00f12015-12-26 22:18:03403 ErrorConsole::Get(context)->ReportError(std::move(error));
wittmanb3ee0482015-06-24 17:47:40404}
405
paulmeyeree6c0ae72015-08-04 17:20:12406void ChromeExtensionsBrowserClient::CleanUpWebView(
407 content::BrowserContext* browser_context,
408 int embedder_process_id,
409 int view_instance_id) {
paulmeyered437262015-07-09 16:05:29410 // Clean up context menus for the WebView.
vmpstrae72b082016-07-25 21:55:47411 auto* menu_manager =
paulmeyered437262015-07-09 16:05:29412 MenuManager::Get(Profile::FromBrowserContext(browser_context));
413 menu_manager->RemoveAllContextItems(
414 MenuItem::ExtensionKey("", embedder_process_id, view_instance_id));
415}
416
afakhry31b34aac2015-08-07 17:55:56417void ChromeExtensionsBrowserClient::AttachExtensionTaskManagerTag(
418 content::WebContents* web_contents,
419 ViewType view_type) {
420 switch (view_type) {
421 case VIEW_TYPE_APP_WINDOW:
dmazzoni5ba638d2016-01-07 22:58:54422 case VIEW_TYPE_COMPONENT:
afakhry31b34aac2015-08-07 17:55:56423 case VIEW_TYPE_EXTENSION_BACKGROUND_PAGE:
424 case VIEW_TYPE_EXTENSION_DIALOG:
425 case VIEW_TYPE_EXTENSION_POPUP:
afakhry31b34aac2015-08-07 17:55:56426 // These are the only types that are tracked by the ExtensionTag.
avi24d693f2016-08-06 18:03:52427 task_manager::WebContentsTags::CreateForExtension(web_contents,
428 view_type);
afakhry31b34aac2015-08-07 17:55:56429 return;
430
431 case VIEW_TYPE_BACKGROUND_CONTENTS:
robcdcc4b82015-12-06 12:39:45432 case VIEW_TYPE_EXTENSION_GUEST:
afakhry31b34aac2015-08-07 17:55:56433 case VIEW_TYPE_TAB_CONTENTS:
434 // Those types are tracked by other tags:
avi24d693f2016-08-06 18:03:52435 // BACKGROUND_CONTENTS --> task_manager::BackgroundContentsTag.
robcdcc4b82015-12-06 12:39:45436 // GUEST --> extensions::ChromeGuestViewManagerDelegate.
avi24d693f2016-08-06 18:03:52437 // PANEL --> task_manager::PanelTag.
438 // TAB_CONTENTS --> task_manager::TabContentsTag.
afakhry31b34aac2015-08-07 17:55:56439 // These tags are created and attached to the web_contents in other
440 // locations, and they must be ignored here.
441 return;
442
443 case VIEW_TYPE_INVALID:
444 NOTREACHED();
445 return;
446 }
447}
448
asargent631a99a2015-10-15 21:51:48449scoped_refptr<update_client::UpdateClient>
450ChromeExtensionsBrowserClient::CreateUpdateClient(
451 content::BrowserContext* context) {
452 return update_client::UpdateClientFactory(
Minh X. Nguyen5c83226102018-04-19 16:10:25453 ChromeUpdateClientConfig::Create(context));
asargent631a99a2015-10-15 21:51:48454}
455
juncai17fc8532016-06-02 06:45:50456std::unique_ptr<content::BluetoothChooser>
457ChromeExtensionsBrowserClient::CreateBluetoothChooser(
458 content::RenderFrameHost* frame,
459 const content::BluetoothChooser::EventHandler& event_handler) {
Jinho Bangb5216cec2018-01-17 19:43:11460 return std::make_unique<ChromeExtensionBluetoothChooser>(frame,
ricea91d6fc122016-08-30 08:47:14461 event_handler);
juncai17fc8532016-06-02 06:45:50462}
463
rdevlin.cronin6fba7ec2016-06-24 16:15:05464bool ChromeExtensionsBrowserClient::IsActivityLoggingEnabled(
465 content::BrowserContext* context) {
466 ActivityLog* activity_log = ActivityLog::GetInstance(context);
467 return activity_log && activity_log->is_active();
468}
469
Ken Rockot06d07e32018-02-27 16:24:22470void ChromeExtensionsBrowserClient::GetTabAndWindowIdForWebContents(
471 content::WebContents* web_contents,
472 int* tab_id,
473 int* window_id) {
Scott Violet5655874f2020-01-14 21:03:21474 sessions::SessionTabHelper* session_tab_helper =
475 sessions::SessionTabHelper::FromWebContents(web_contents);
Ken Rockot06d07e32018-02-27 16:24:22476 if (session_tab_helper) {
477 *tab_id = session_tab_helper->session_id().id();
478 *window_id = session_tab_helper->window_id().id();
479 } else {
480 *tab_id = -1;
481 *window_id = -1;
482 }
483}
484
steelc8e6ede2016-09-29 00:56:27485KioskDelegate* ChromeExtensionsBrowserClient::GetKioskDelegate() {
486 if (!kiosk_delegate_)
487 kiosk_delegate_.reset(new ChromeKioskDelegate());
488 return kiosk_delegate_.get();
489}
490
tbarzic8e89b0b12017-06-10 03:25:51491bool ChromeExtensionsBrowserClient::IsLockScreenContext(
492 content::BrowserContext* context) {
493#if defined(OS_CHROMEOS)
tbarzicd2a741e2017-06-28 20:37:54494 return chromeos::ProfileHelper::IsLockScreenAppProfile(
495 Profile::FromBrowserContext(context));
tbarzic8e89b0b12017-06-10 03:25:51496#else
497 return false;
498#endif
499}
rdevlin.cronin62018a12017-06-22 17:34:06500
Michael Giuffrida717aac42017-08-02 11:24:21501std::string ChromeExtensionsBrowserClient::GetApplicationLocale() {
502 return g_browser_process->GetApplicationLocale();
503}
504
Minh X. Nguyen3bfb32282017-11-09 17:11:14505bool ChromeExtensionsBrowserClient::IsExtensionEnabled(
506 const std::string& extension_id,
507 content::BrowserContext* context) const {
508 return ExtensionSystem::Get(context)->extension_service()->IsExtensionEnabled(
509 extension_id);
510}
511
John Abd-El-Malek04bfa8532018-07-12 05:28:22512bool ChromeExtensionsBrowserClient::IsWebUIAllowedToMakeNetworkRequests(
513 const url::Origin& origin) {
514 return ChromeWebUIControllerFactory::IsWebUIAllowedToMakeNetworkRequests(
515 origin);
516}
517
John Abd-El-Malekebbb0df22018-08-23 19:11:32518network::mojom::NetworkContext*
519ChromeExtensionsBrowserClient::GetSystemNetworkContext() {
520 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
521 return g_browser_process->system_network_context_manager()->GetContext();
522}
523
Clark DuVall2cf99249e2018-09-19 19:11:51524UserScriptListener* ChromeExtensionsBrowserClient::GetUserScriptListener() {
Evan Stade5b510464b52019-10-22 02:50:55525 return &user_script_listener_;
Clark DuVall2cf99249e2018-09-19 19:11:51526}
527
Yutaka Hirano968d6252018-12-04 05:09:31528std::string ChromeExtensionsBrowserClient::GetUserAgent() const {
529 return ::GetUserAgent();
530}
531
Lukasz Anforowiczfeddf7e32019-09-18 22:13:23532bool ChromeExtensionsBrowserClient::ShouldSchemeBypassNavigationChecks(
533 const std::string& scheme) const {
534 if (scheme == chrome::kChromeSearchScheme)
535 return true;
536
537 return ExtensionsBrowserClient::ShouldSchemeBypassNavigationChecks(scheme);
538}
539
Takashi Toyoshima128441462019-10-16 04:19:17540bool ChromeExtensionsBrowserClient::ShouldForceWebRequestExtraHeaders(
541 content::BrowserContext* context) const {
542 // If OOR-CORS is disabled, we never apply this enforcement.
543 if (!context->ShouldEnableOutOfBlinkCors())
544 return false;
545
546 // Enables the enforcement if the prefs is managed by the enterprise policy.
547 return Profile::FromBrowserContext(context)->GetPrefs()->IsManagedPreference(
548 prefs::kCorsMitigationList);
549}
550
rdevlin.cronin62018a12017-06-22 17:34:06551// static
552void ChromeExtensionsBrowserClient::set_did_chrome_update_for_testing(
553 bool did_update) {
554 g_did_chrome_update_for_testing = did_update;
555}
556
[email protected]9fe42042013-10-29 21:13:33557} // namespace extensions