blob: 88ad99443693014d7a09018266111555795e371f [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"
dchengc963c7142016-04-08 03:55:2210#include "base/memory/ptr_util.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"
yoz774dcda2d2014-08-27 03:32:5818#include "chrome/browser/extensions/api/generated_api_registration.h"
[email protected]21c6c432014-03-05 18:47:3119#include "chrome/browser/extensions/api/preference/chrome_direct_setting.h"
20#include "chrome/browser/extensions/api/preference/preference_api.h"
[email protected]f0e9ac552014-05-07 14:26:5021#include "chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h"
[email protected]326e6f02014-06-20 04:53:3722#include "chrome/browser/extensions/chrome_component_extension_resource_manager.h"
rdevlin.cronin1790e822016-04-05 21:03:3523#include "chrome/browser/extensions/chrome_extension_api_frame_id_map_helper.h"
[email protected]6c0f179f2014-03-19 11:04:4124#include "chrome/browser/extensions/chrome_extension_host_delegate.h"
rdevlin.cronincb2ec659a2015-06-10 23:32:4125#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
steelc8e6ede2016-09-29 00:56:2726#include "chrome/browser/extensions/chrome_kiosk_delegate.h"
kmarshall166e5b42015-04-03 22:29:4327#include "chrome/browser/extensions/chrome_mojo_service_registration.h"
[email protected]13e062e2014-08-09 10:21:5528#include "chrome/browser/extensions/chrome_process_manager_delegate.h"
lfg048201a2014-09-16 19:09:3629#include "chrome/browser/extensions/chrome_url_request_util.h"
wittmanb3ee0482015-06-24 17:47:4030#include "chrome/browser/extensions/error_console/error_console.h"
thiago.santos89e236b2014-09-05 13:29:4931#include "chrome/browser/extensions/event_router_forwarder.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"
[email protected]9fe42042013-10-29 21:13:3337#include "chrome/browser/profiles/profile.h"
[email protected]7f474212013-11-05 04:26:1638#include "chrome/browser/profiles/profile_manager.h"
jam059a6b42016-10-19 22:06:5439#include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
rdevlin.cronin9a62870f2016-02-11 23:25:5840#include "chrome/browser/sessions/session_tab_helper.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"
sdefresne9fb67692015-08-03 18:48:2243#include "chrome/common/channel_info.h"
[email protected]326e6f02014-06-20 04:53:3744#include "chrome/common/chrome_paths.h"
[email protected]7f474212013-11-05 04:26:1645#include "chrome/common/chrome_switches.h"
[email protected]45fd94172013-11-13 03:29:5246#include "chrome/common/pref_names.h"
drogerc690e8802015-09-21 14:29:1647#include "components/net_log/chrome_net_log.h"
asargent631a99a2015-10-15 21:51:4848#include "components/update_client/update_client.h"
sdefresne9fb67692015-08-03 18:48:2249#include "components/version_info/version_info.h"
paulmeyered437262015-07-09 16:05:2950#include "content/public/browser/render_process_host.h"
jam059a6b42016-10-19 22:06:5451#include "content/public/browser/resource_request_info.h"
brettw90e92602015-10-10 00:12:4052#include "content/public/common/content_switches.h"
yoz774dcda2d2014-08-27 03:32:5853#include "extensions/browser/api/generated_api_registration.h"
[email protected]21c6c432014-03-05 18:47:3154#include "extensions/browser/extension_function_registry.h"
[email protected]489db0842014-01-22 18:20:0355#include "extensions/browser/extension_prefs.h"
kmarshall166e5b42015-04-03 22:29:4356#include "extensions/browser/mojo/service_registration.h"
[email protected]234fc5ff2014-01-16 23:32:2857#include "extensions/browser/pref_names.h"
lfg048201a2014-09-16 19:09:3658#include "extensions/browser/url_request_util.h"
rdevlin.cronin41227532016-07-13 21:24:3459#include "extensions/common/features/feature_channel.h"
[email protected]9fe42042013-10-29 21:13:3360
[email protected]d0d1c052013-12-21 07:20:2261#if defined(OS_CHROMEOS)
stevenjbd194dd1362015-01-28 17:30:0862#include "chrome/browser/chromeos/profiles/profile_helper.h"
ginkage2179a15eb2015-03-18 13:55:5263#include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h"
rockotffa65b12014-10-14 17:19:0664#include "chrome/browser/extensions/updater/extension_cache_impl.h"
[email protected]d0d1c052013-12-21 07:20:2265#include "chromeos/chromeos_switches.h"
kelvinp1b80b8f2015-10-01 01:22:1366#include "components/user_manager/user_manager.h"
rockotffa65b12014-10-14 17:19:0667#else
68#include "extensions/browser/updater/null_extension_cache.h"
[email protected]d0d1c052013-12-21 07:20:2269#endif
70
[email protected]9fe42042013-10-29 21:13:3371namespace extensions {
72
[email protected]be514c32014-03-17 23:30:4473ChromeExtensionsBrowserClient::ChromeExtensionsBrowserClient() {
[email protected]6b54fda2014-07-22 02:13:4774 process_manager_delegate_.reset(new ChromeProcessManagerDelegate);
[email protected]be514c32014-03-17 23:30:4475 api_client_.reset(new ChromeExtensionsAPIClient);
[email protected]59b0e602014-01-30 00:41:2476 // Only set if it hasn't already been set (e.g. by a test).
77 if (GetCurrentChannel() == GetDefaultChannel())
sdefresne9fb67692015-08-03 18:48:2278 SetCurrentChannel(chrome::GetChannel());
mukaiee458c92015-01-06 01:30:3379 resource_manager_.reset(new ChromeComponentExtensionResourceManager());
[email protected]59b0e602014-01-30 00:41:2480}
[email protected]9fe42042013-10-29 21:13:3381
82ChromeExtensionsBrowserClient::~ChromeExtensionsBrowserClient() {}
83
84bool ChromeExtensionsBrowserClient::IsShuttingDown() {
85 return g_browser_process->IsShuttingDown();
86}
87
[email protected]367d9b172013-12-03 00:31:0288bool ChromeExtensionsBrowserClient::AreExtensionsDisabled(
avi3ef9ec9e2014-12-22 22:50:1789 const base::CommandLine& command_line,
[email protected]367d9b172013-12-03 00:31:0290 content::BrowserContext* context) {
91 Profile* profile = static_cast<Profile*>(context);
catmullings98cd1942016-08-30 22:31:5992 return switches::ExtensionsDisabled(command_line) ||
93 profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions);
[email protected]367d9b172013-12-03 00:31:0294}
95
[email protected]45fd94172013-11-13 03:29:5296bool ChromeExtensionsBrowserClient::IsValidContext(
97 content::BrowserContext* context) {
98 Profile* profile = static_cast<Profile*>(context);
scheibc0792ff2015-01-13 00:17:4399 return g_browser_process->profile_manager() &&
100 g_browser_process->profile_manager()->IsValidProfile(profile);
[email protected]45fd94172013-11-13 03:29:52101}
102
[email protected]9fe42042013-10-29 21:13:33103bool ChromeExtensionsBrowserClient::IsSameContext(
104 content::BrowserContext* first,
105 content::BrowserContext* second) {
106 return static_cast<Profile*>(first)->IsSameProfile(
107 static_cast<Profile*>(second));
108}
109
110bool ChromeExtensionsBrowserClient::HasOffTheRecordContext(
111 content::BrowserContext* context) {
112 return static_cast<Profile*>(context)->HasOffTheRecordProfile();
113}
114
115content::BrowserContext* ChromeExtensionsBrowserClient::GetOffTheRecordContext(
116 content::BrowserContext* context) {
117 return static_cast<Profile*>(context)->GetOffTheRecordProfile();
118}
119
[email protected]7f474212013-11-05 04:26:16120content::BrowserContext* ChromeExtensionsBrowserClient::GetOriginalContext(
121 content::BrowserContext* context) {
122 return static_cast<Profile*>(context)->GetOriginalProfile();
123}
124
stevenjbd194dd1362015-01-28 17:30:08125#if defined(OS_CHROMEOS)
126std::string ChromeExtensionsBrowserClient::GetUserIdHashFromContext(
127 content::BrowserContext* context) {
128 return chromeos::ProfileHelper::GetUserIdHashFromProfile(
129 static_cast<Profile*>(context));
130}
131#endif
132
[email protected]a5fc73e2014-02-13 20:26:47133bool ChromeExtensionsBrowserClient::IsGuestSession(
[email protected]d012be2b2014-03-03 17:02:47134 content::BrowserContext* context) const {
[email protected]a5fc73e2014-02-13 20:26:47135 return static_cast<Profile*>(context)->IsGuestSession();
136}
137
[email protected]6a3d8ce42014-02-07 00:42:37138bool ChromeExtensionsBrowserClient::IsExtensionIncognitoEnabled(
139 const std::string& extension_id,
140 content::BrowserContext* context) const {
[email protected]d012be2b2014-03-03 17:02:47141 return IsGuestSession(context)
142 || util::IsIncognitoEnabled(extension_id, context);
[email protected]6a3d8ce42014-02-07 00:42:37143}
144
145bool ChromeExtensionsBrowserClient::CanExtensionCrossIncognito(
kalmane58e62232015-07-23 18:27:22146 const Extension* extension,
[email protected]6a3d8ce42014-02-07 00:42:37147 content::BrowserContext* context) const {
[email protected]d012be2b2014-03-03 17:02:47148 return IsGuestSession(context)
149 || util::CanCrossIncognito(extension, context);
[email protected]6a3d8ce42014-02-07 00:42:37150}
151
[email protected]1791e6c92014-04-11 08:29:01152net::URLRequestJob*
153ChromeExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob(
154 net::URLRequest* request,
155 net::NetworkDelegate* network_delegate,
156 const base::FilePath& directory_path,
157 const std::string& content_security_policy,
158 bool send_cors_header) {
lfg048201a2014-09-16 19:09:36159 return chrome_url_request_util::MaybeCreateURLRequestResourceBundleJob(
[email protected]1791e6c92014-04-11 08:29:01160 request,
161 network_delegate,
162 directory_path,
163 content_security_policy,
164 send_cors_header);
165}
166
167bool ChromeExtensionsBrowserClient::AllowCrossRendererResourceLoad(
168 net::URLRequest* request,
169 bool is_incognito,
170 const Extension* extension,
171 InfoMap* extension_info_map) {
lfg048201a2014-09-16 19:09:36172 bool allowed = false;
173 if (chrome_url_request_util::AllowCrossRendererResourceLoad(
174 request, is_incognito, extension, extension_info_map, &allowed))
175 return allowed;
176
177 // Couldn't determine if resource is allowed. Block the load.
178 return false;
[email protected]1791e6c92014-04-11 08:29:01179}
180
[email protected]367d9b172013-12-03 00:31:02181PrefService* ChromeExtensionsBrowserClient::GetPrefServiceForContext(
182 content::BrowserContext* context) {
183 return static_cast<Profile*>(context)->GetPrefs();
184}
185
[email protected]d31e2482014-04-02 22:52:20186void ChromeExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
187 content::BrowserContext* context,
188 std::vector<ExtensionPrefsObserver*>* observers) const {
[email protected]d31e2482014-04-02 22:52:20189 observers->push_back(ContentSettingsService::Get(context));
[email protected]d31e2482014-04-02 22:52:20190}
191
[email protected]6b54fda2014-07-22 02:13:47192ProcessManagerDelegate*
193ChromeExtensionsBrowserClient::GetProcessManagerDelegate() const {
[email protected]6b54fda2014-07-22 02:13:47194 return process_manager_delegate_.get();
[email protected]7f474212013-11-05 04:26:16195}
196
dchengc963c7142016-04-08 03:55:22197std::unique_ptr<ExtensionHostDelegate>
[email protected]6c0f179f2014-03-19 11:04:41198ChromeExtensionsBrowserClient::CreateExtensionHostDelegate() {
dchengc963c7142016-04-08 03:55:22199 return std::unique_ptr<ExtensionHostDelegate>(
200 new ChromeExtensionHostDelegate);
[email protected]a36b55602014-02-08 02:32:32201}
202
[email protected]45fd94172013-11-13 03:29:52203bool ChromeExtensionsBrowserClient::DidVersionUpdate(
[email protected]513b8032013-11-18 07:47:49204 content::BrowserContext* context) {
205 Profile* profile = static_cast<Profile*>(context);
206
thakis3e861de2016-06-14 14:24:01207 // Unit tests may not provide prefs; assume everything is up to date.
[email protected]513b8032013-11-18 07:47:49208 ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile);
[email protected]45fd94172013-11-13 03:29:52209 if (!extension_prefs)
210 return false;
211
thakis3e861de2016-06-14 14:24:01212 // If we're inside a browser test, then assume prefs are all up to date.
avi3ef9ec9e2014-12-22 22:50:17213 if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType))
[email protected]45fd94172013-11-13 03:29:52214 return false;
215
216 PrefService* pref_service = extension_prefs->pref_service();
217 base::Version last_version;
[email protected]234fc5ff2014-01-16 23:32:28218 if (pref_service->HasPrefPath(pref_names::kLastChromeVersion)) {
[email protected]45fd94172013-11-13 03:29:52219 std::string last_version_str =
[email protected]234fc5ff2014-01-16 23:32:28220 pref_service->GetString(pref_names::kLastChromeVersion);
[email protected]45fd94172013-11-13 03:29:52221 last_version = base::Version(last_version_str);
222 }
223
robpercivaldcd8b102016-01-25 19:39:00224 std::string current_version_str = version_info::GetVersionNumber();
225 base::Version current_version(current_version_str);
226 pref_service->SetString(pref_names::kLastChromeVersion, current_version_str);
[email protected]45fd94172013-11-13 03:29:52227
228 // If there was no version string in prefs, assume we're out of date.
229 if (!last_version.IsValid())
230 return true;
robpercivaldcd8b102016-01-25 19:39:00231 // If the current version string is invalid, assume we didn't update.
232 if (!current_version.IsValid())
233 return false;
[email protected]45fd94172013-11-13 03:29:52234
robpercivaldcd8b102016-01-25 19:39:00235 return last_version < current_version;
[email protected]45fd94172013-11-13 03:29:52236}
237
[email protected]86fad30d2014-07-29 21:39:27238void ChromeExtensionsBrowserClient::PermitExternalProtocolHandler() {
239 ExternalProtocolHandler::PermitLaunchUrl();
240}
241
[email protected]45928b682013-11-28 08:20:27242bool ChromeExtensionsBrowserClient::IsRunningInForcedAppMode() {
243 return chrome::IsRunningInForcedAppMode();
244}
245
kelvinp1b80b8f2015-10-01 01:22:13246bool ChromeExtensionsBrowserClient::IsLoggedInAsPublicAccount() {
247#if defined(OS_CHROMEOS)
248 return user_manager::UserManager::Get()->IsLoggedInAsPublicAccount();
249#else
250 return false;
251#endif
252}
253
[email protected]70489302014-02-13 15:15:48254ExtensionSystemProvider*
255ChromeExtensionsBrowserClient::GetExtensionSystemFactory() {
256 return ExtensionSystemFactory::GetInstance();
[email protected]8172a9d2014-01-09 23:18:30257}
258
[email protected]21c6c432014-03-05 18:47:31259void ChromeExtensionsBrowserClient::RegisterExtensionFunctions(
260 ExtensionFunctionRegistry* registry) const {
[email protected]21c6c432014-03-05 18:47:31261 // Preferences.
kalmane58e62232015-07-23 18:27:22262 registry->RegisterFunction<GetPreferenceFunction>();
263 registry->RegisterFunction<SetPreferenceFunction>();
264 registry->RegisterFunction<ClearPreferenceFunction>();
[email protected]21c6c432014-03-05 18:47:31265
266 // Direct Preference Access for Component Extensions.
kalmane58e62232015-07-23 18:27:22267 registry->RegisterFunction<chromedirectsetting::GetDirectSettingFunction>();
268 registry->RegisterFunction<chromedirectsetting::SetDirectSettingFunction>();
269 registry->RegisterFunction<chromedirectsetting::ClearDirectSettingFunction>();
[email protected]21c6c432014-03-05 18:47:31270
[email protected]e3a8ebb92014-03-31 01:54:38271 // Generated APIs from lower-level modules.
kalmane58e62232015-07-23 18:27:22272 api::GeneratedFunctionRegistry::RegisterAll(registry);
[email protected]e3a8ebb92014-03-31 01:54:38273
274 // Generated APIs from Chrome.
kalmane58e62232015-07-23 18:27:22275 api::ChromeGeneratedFunctionRegistry::RegisterAll(registry);
[email protected]21c6c432014-03-05 18:47:31276}
277
kmarshall166e5b42015-04-03 22:29:43278void ChromeExtensionsBrowserClient::RegisterMojoServices(
279 content::RenderFrameHost* render_frame_host,
280 const Extension* extension) const {
281 RegisterServicesForFrame(render_frame_host, extension);
282 RegisterChromeServicesForFrame(render_frame_host, extension);
283}
284
dchengc963c7142016-04-08 03:55:22285std::unique_ptr<RuntimeAPIDelegate>
rockotffa65b12014-10-14 17:19:06286ChromeExtensionsBrowserClient::CreateRuntimeAPIDelegate(
287 content::BrowserContext* context) const {
dchengc963c7142016-04-08 03:55:22288 return std::unique_ptr<RuntimeAPIDelegate>(
289 new ChromeRuntimeAPIDelegate(context));
rockotffa65b12014-10-14 17:19:06290}
291
mukaiee458c92015-01-06 01:30:33292const ComponentExtensionResourceManager*
[email protected]326e6f02014-06-20 04:53:37293ChromeExtensionsBrowserClient::GetComponentExtensionResourceManager() {
[email protected]326e6f02014-06-20 04:53:37294 return resource_manager_.get();
295}
296
thiago.santos89e236b2014-09-05 13:29:49297void ChromeExtensionsBrowserClient::BroadcastEventToRenderers(
kalman47451622015-07-22 17:41:51298 events::HistogramValue histogram_value,
thiago.santos89e236b2014-09-05 13:29:49299 const std::string& event_name,
dchengc963c7142016-04-08 03:55:22300 std::unique_ptr<base::ListValue> args) {
thiago.santos89e236b2014-09-05 13:29:49301 g_browser_process->extension_event_router_forwarder()
dcheng1fc00f12015-12-26 22:18:03302 ->BroadcastEventToRenderers(histogram_value, event_name, std::move(args),
kalman47451622015-07-22 17:41:51303 GURL());
thiago.santos89e236b2014-09-05 13:29:49304}
305
[email protected]4d1663782014-07-25 21:44:36306net::NetLog* ChromeExtensionsBrowserClient::GetNetLog() {
307 return g_browser_process->net_log();
308}
309
rockotffa65b12014-10-14 17:19:06310ExtensionCache* ChromeExtensionsBrowserClient::GetExtensionCache() {
311 if (!extension_cache_.get()) {
312#if defined(OS_CHROMEOS)
ginkage2179a15eb2015-03-18 13:55:52313 extension_cache_.reset(new ExtensionCacheImpl(
ricea91d6fc122016-08-30 08:47:14314 base::MakeUnique<ChromeOSExtensionCacheDelegate>()));
rockotffa65b12014-10-14 17:19:06315#else
316 extension_cache_.reset(new NullExtensionCache());
317#endif
318 }
319 return extension_cache_.get();
[email protected]f0e9ac552014-05-07 14:26:50320}
321
rockotf2a6b62c2014-10-15 21:58:07322bool ChromeExtensionsBrowserClient::IsBackgroundUpdateAllowed() {
avi3ef9ec9e2014-12-22 22:50:17323 return !base::CommandLine::ForCurrentProcess()->HasSwitch(
rockotf2a6b62c2014-10-15 21:58:07324 switches::kDisableBackgroundNetworking);
325}
326
327bool ChromeExtensionsBrowserClient::IsMinBrowserVersionSupported(
328 const std::string& min_version) {
sdefresne9fb67692015-08-03 18:48:22329 base::Version browser_version =
330 base::Version(version_info::GetVersionNumber());
pwnallcbd73192016-08-22 18:59:17331 base::Version browser_min_version(min_version);
rockotf2a6b62c2014-10-15 21:58:07332 if (browser_version.IsValid() && browser_min_version.IsValid() &&
333 browser_min_version.CompareTo(browser_version) > 0) {
334 return false;
335 }
336 return true;
337}
338
rdevlin.cronincb2ec659a2015-06-10 23:32:41339ExtensionWebContentsObserver*
340ChromeExtensionsBrowserClient::GetExtensionWebContentsObserver(
341 content::WebContents* web_contents) {
342 return ChromeExtensionWebContentsObserver::FromWebContents(web_contents);
343}
344
wittmanb3ee0482015-06-24 17:47:40345void ChromeExtensionsBrowserClient::ReportError(
346 content::BrowserContext* context,
dchengc963c7142016-04-08 03:55:22347 std::unique_ptr<ExtensionError> error) {
dcheng1fc00f12015-12-26 22:18:03348 ErrorConsole::Get(context)->ReportError(std::move(error));
wittmanb3ee0482015-06-24 17:47:40349}
350
paulmeyeree6c0ae72015-08-04 17:20:12351void ChromeExtensionsBrowserClient::CleanUpWebView(
352 content::BrowserContext* browser_context,
353 int embedder_process_id,
354 int view_instance_id) {
paulmeyered437262015-07-09 16:05:29355 // Clean up context menus for the WebView.
vmpstrae72b082016-07-25 21:55:47356 auto* menu_manager =
paulmeyered437262015-07-09 16:05:29357 MenuManager::Get(Profile::FromBrowserContext(browser_context));
358 menu_manager->RemoveAllContextItems(
359 MenuItem::ExtensionKey("", embedder_process_id, view_instance_id));
360}
361
afakhry31b34aac2015-08-07 17:55:56362void ChromeExtensionsBrowserClient::AttachExtensionTaskManagerTag(
363 content::WebContents* web_contents,
364 ViewType view_type) {
365 switch (view_type) {
366 case VIEW_TYPE_APP_WINDOW:
dmazzoni5ba638d2016-01-07 22:58:54367 case VIEW_TYPE_COMPONENT:
afakhry31b34aac2015-08-07 17:55:56368 case VIEW_TYPE_EXTENSION_BACKGROUND_PAGE:
369 case VIEW_TYPE_EXTENSION_DIALOG:
370 case VIEW_TYPE_EXTENSION_POPUP:
371 case VIEW_TYPE_LAUNCHER_PAGE:
afakhry31b34aac2015-08-07 17:55:56372 // These are the only types that are tracked by the ExtensionTag.
avi24d693f2016-08-06 18:03:52373 task_manager::WebContentsTags::CreateForExtension(web_contents,
374 view_type);
afakhry31b34aac2015-08-07 17:55:56375 return;
376
377 case VIEW_TYPE_BACKGROUND_CONTENTS:
robcdcc4b82015-12-06 12:39:45378 case VIEW_TYPE_EXTENSION_GUEST:
afakhry31b34aac2015-08-07 17:55:56379 case VIEW_TYPE_PANEL:
380 case VIEW_TYPE_TAB_CONTENTS:
381 // Those types are tracked by other tags:
avi24d693f2016-08-06 18:03:52382 // BACKGROUND_CONTENTS --> task_manager::BackgroundContentsTag.
robcdcc4b82015-12-06 12:39:45383 // GUEST --> extensions::ChromeGuestViewManagerDelegate.
avi24d693f2016-08-06 18:03:52384 // PANEL --> task_manager::PanelTag.
385 // TAB_CONTENTS --> task_manager::TabContentsTag.
afakhry31b34aac2015-08-07 17:55:56386 // These tags are created and attached to the web_contents in other
387 // locations, and they must be ignored here.
388 return;
389
390 case VIEW_TYPE_INVALID:
391 NOTREACHED();
392 return;
393 }
394}
395
asargent631a99a2015-10-15 21:51:48396scoped_refptr<update_client::UpdateClient>
397ChromeExtensionsBrowserClient::CreateUpdateClient(
398 content::BrowserContext* context) {
399 return update_client::UpdateClientFactory(
400 make_scoped_refptr(new ChromeUpdateClientConfig(context)));
401}
402
rdevlin.cronin1790e822016-04-05 21:03:35403std::unique_ptr<ExtensionApiFrameIdMapHelper>
404ChromeExtensionsBrowserClient::CreateExtensionApiFrameIdMapHelper(
405 ExtensionApiFrameIdMap* map) {
ricea91d6fc122016-08-30 08:47:14406 return base::MakeUnique<ChromeExtensionApiFrameIdMapHelper>(map);
rdevlin.cronin9a62870f2016-02-11 23:25:58407}
408
juncai17fc8532016-06-02 06:45:50409std::unique_ptr<content::BluetoothChooser>
410ChromeExtensionsBrowserClient::CreateBluetoothChooser(
411 content::RenderFrameHost* frame,
412 const content::BluetoothChooser::EventHandler& event_handler) {
ricea91d6fc122016-08-30 08:47:14413 return base::MakeUnique<ChromeExtensionBluetoothChooser>(frame,
414 event_handler);
juncai17fc8532016-06-02 06:45:50415}
416
rdevlin.cronin6fba7ec2016-06-24 16:15:05417bool ChromeExtensionsBrowserClient::IsActivityLoggingEnabled(
418 content::BrowserContext* context) {
419 ActivityLog* activity_log = ActivityLog::GetInstance(context);
420 return activity_log && activity_log->is_active();
421}
422
jam059a6b42016-10-19 22:06:54423ExtensionNavigationUIData*
424ChromeExtensionsBrowserClient::GetExtensionNavigationUIData(
425 net::URLRequest* request) {
426 const content::ResourceRequestInfo* info =
427 content::ResourceRequestInfo::ForRequest(request);
428 if (!info)
429 return nullptr;
430 ChromeNavigationUIData* navigation_data =
431 static_cast<ChromeNavigationUIData*>(info->GetNavigationUIData());
432 if (!navigation_data)
433 return nullptr;
434 return navigation_data->GetExtensionNavigationUIData();
435}
436
steelc8e6ede2016-09-29 00:56:27437KioskDelegate* ChromeExtensionsBrowserClient::GetKioskDelegate() {
438 if (!kiosk_delegate_)
439 kiosk_delegate_.reset(new ChromeKioskDelegate());
440 return kiosk_delegate_.get();
441}
442
[email protected]9fe42042013-10-29 21:13:33443} // namespace extensions