Reland "[ProfileSelections] Transition extension keyed factories to use Profile Selections"
This is a reland of commit f93ee8bbfe4108f5cce0beb322142d5332a864bf
Original change's description:
> [ProfileSelections] Transition extension keyed factories to use Profile Selections
>
> Make sure that all extension factories (that do not use the
> BrowserContextKeyedAPI) use the Profile Selection logic through the
> ExtensionBrowserClient to have more control over different profile
> types.
> Mainly so that it stops being able to indirectly create services for the
> System Profile and be able to easily control the creation for the Guest
> Profile through the force variable.
>
> Changes:
> - `GetOriginalContext()` --> `GetContextRedirectedToOriginal()`
> - `context` --> `GetContextOwnInstance()`
> - no implementation --> `GetContextForOriginalOnly()`
>
> These changes will indirectly cause those services not to be able to be
> created for the System Profile, and the creation for the Guest Profile
> will be dependant on the `force_guest_profile` variable.
>
> Also added protections to some stacks in extensions to return early in
> case of System Profile (Extensions are disabled in the System Profile).
>
> Bug: 1284664
> Change-Id: I1ca9a345ca769ef42cb17ae38516a399283c4fd2
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4665672
> Reviewed-by: David Roger <droger@chromium.org>
> Commit-Queue: Ryan Sultanem <rsult@google.com>
> Reviewed-by: Dominick Ng <dominickn@chromium.org>
> Reviewed-by: Devlin Cronin <rdevlin.cronin@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1171652}
Bug: 1284664
Change-Id: Icc4150037510143bb7803301538af81856ca2037
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4704704
Reviewed-by: Devlin Cronin <rdevlin.cronin@chromium.org>
Reviewed-by: Dominick Ng <dominickn@chromium.org>
Commit-Queue: Ryan Sultanem <rsult@google.com>
Reviewed-by: David Roger <droger@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1173410}
diff --git a/apps/saved_files_service_factory.cc b/apps/saved_files_service_factory.cc
index e38a200..72d88b4 100644
--- a/apps/saved_files_service_factory.cc
+++ b/apps/saved_files_service_factory.cc
@@ -51,8 +51,8 @@
// is to make this service available in guest sessions, where it could be used
// when apps white-listed in guest sessions attempt to use chrome.fileSystem
// API.
- return extensions::ExtensionsBrowserClient::Get()->GetOriginalContext(
- context);
+ return extensions::ExtensionsBrowserClient::Get()
+ ->GetContextRedirectedToOriginal(context, /*force_guest_profile=*/true);
}
} // namespace apps
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 36335feb..a5d402d9 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5029,14 +5029,20 @@
throttles.push_back(std::move(url_to_apps_throttle));
#endif
-#if BUILDFLAG(ENABLE_EXTENSIONS)
- throttles.push_back(
- std::make_unique<extensions::ExtensionNavigationThrottle>(handle));
+ Profile* profile = Profile::FromBrowserContext(
+ handle->GetWebContents()->GetBrowserContext());
- MaybeAddThrottle(extensions::ExtensionsBrowserClient::Get()
- ->GetUserScriptListener()
- ->CreateNavigationThrottle(handle),
- &throttles);
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+ if (!ChromeContentBrowserClientExtensionsPart::
+ AreExtensionsDisabledForProfile(profile)) {
+ throttles.push_back(
+ std::make_unique<extensions::ExtensionNavigationThrottle>(handle));
+
+ MaybeAddThrottle(extensions::ExtensionsBrowserClient::Get()
+ ->GetUserScriptListener()
+ ->CreateNavigationThrottle(handle),
+ &throttles);
+ }
#endif
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
@@ -5169,9 +5175,6 @@
&throttles);
}
- Profile* profile = Profile::FromBrowserContext(
- handle->GetWebContents()->GetBrowserContext());
-
if (profile && profile->GetPrefs()) {
MaybeAddThrottle(
security_interstitials::InsecureFormNavigationThrottle::
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
index 10ad0d99..85a9f3f 100644
--- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
+++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
@@ -727,6 +727,9 @@
content::RenderProcessHost* host) {
int id = host->GetID();
Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext());
+ if (AreExtensionsDisabledForProfile(profile)) {
+ return;
+ }
host->AddFilter(new ChromeExtensionMessageFilter(profile));
host->AddFilter(new ExtensionMessageFilter(id, profile));
@@ -849,10 +852,18 @@
AppendExtraRendererCommandLineSwitches(base::CommandLine* command_line,
content::RenderProcessHost* process,
Profile* profile) {
- if (!process)
+ if (!process) {
return;
+ }
+
DCHECK(profile);
- if (ProcessMap::Get(profile)->Contains(process->GetID())) {
+ if (AreExtensionsDisabledForProfile(profile)) {
+ return;
+ }
+
+ auto* process_map = ProcessMap::Get(profile);
+ CHECK(process_map);
+ if (process_map->Contains(process->GetID())) {
command_line->AppendSwitch(switches::kExtensionProcess);
}
}
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index c4efa820..3d8fcc97 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -276,6 +276,12 @@
return selections.ApplyProfileSelection(Profile::FromBrowserContext(context));
}
+bool ChromeExtensionsBrowserClient::AreExtensionsDisabledForContext(
+ content::BrowserContext* context) {
+ return ChromeContentBrowserClientExtensionsPart::
+ AreExtensionsDisabledForProfile(Profile::FromBrowserContext(context));
+}
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::string ChromeExtensionsBrowserClient::GetUserIdHashFromContext(
content::BrowserContext* context) {
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h
index c6611b5..c853adce 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.h
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -87,6 +87,8 @@
content::BrowserContext* GetContextForOriginalOnly(
content::BrowserContext* context,
bool force_guest_profile) override;
+ bool AreExtensionsDisabledForContext(
+ content::BrowserContext* context) override;
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::string GetUserIdHashFromContext(
diff --git a/chrome/browser/metrics/chrome_metrics_extensions_helper.cc b/chrome/browser/metrics/chrome_metrics_extensions_helper.cc
index 9bfae42..30f7d867 100644
--- a/chrome/browser/metrics/chrome_metrics_extensions_helper.cc
+++ b/chrome/browser/metrics/chrome_metrics_extensions_helper.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/metrics/chrome_metrics_extensions_helper.h"
+#include "chrome/browser/extensions/chrome_content_browser_client_extensions_part.h"
#include "content/public/browser/render_process_host.h"
#include "extensions/buildflags/buildflags.h"
@@ -17,8 +18,16 @@
bool ChromeMetricsExtensionsHelper::IsExtensionProcess(
content::RenderProcessHost* render_process_host) {
#if BUILDFLAG(ENABLE_EXTENSIONS)
- return extensions::ProcessMap::Get(render_process_host->GetBrowserContext())
- ->Contains(render_process_host->GetID());
+ if (extensions::ChromeContentBrowserClientExtensionsPart::
+ AreExtensionsDisabledForProfile(
+ render_process_host->GetBrowserContext())) {
+ return false;
+ }
+
+ auto* process_map =
+ extensions::ProcessMap::Get(render_process_host->GetBrowserContext());
+ CHECK(process_map);
+ return process_map->Contains(render_process_host->GetID());
#else
return false;
#endif
diff --git a/chrome/browser/metrics/power/process_monitor.cc b/chrome/browser/metrics/power/process_monitor.cc
index 5453abd..ee031a27 100644
--- a/chrome/browser/metrics/power/process_monitor.cc
+++ b/chrome/browser/metrics/power/process_monitor.cc
@@ -17,6 +17,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "build/build_config.h"
+#include "chrome/browser/extensions/chrome_content_browser_client_extensions_part.h"
#include "chrome/browser/metrics/power/power_metrics_constants.h"
#include "content/public/browser/browser_child_process_host.h"
#include "content/public/browser/browser_child_process_host_iterator.h"
@@ -113,9 +114,14 @@
DCHECK_CURRENTLY_ON(BrowserThread::UI);
#if BUILDFLAG(ENABLE_EXTENSIONS)
content::BrowserContext* browser_context = host->GetBrowserContext();
+ if (extensions::ChromeContentBrowserClientExtensionsPart::
+ AreExtensionsDisabledForProfile(browser_context)) {
+ return MonitoredProcessType::kRenderer;
+ }
+
extensions::ProcessMap* extension_process_map =
extensions::ProcessMap::Get(browser_context);
-
+ DCHECK(extension_process_map);
std::set<std::string> extension_ids =
extension_process_map->GetExtensionsInProcess(host->GetID());
diff --git a/extensions/browser/api/device_permissions_manager.cc b/extensions/browser/api/device_permissions_manager.cc
index 11a9682..794b733 100644
--- a/extensions/browser/api/device_permissions_manager.cc
+++ b/extensions/browser/api/device_permissions_manager.cc
@@ -689,7 +689,8 @@
// Return the original (possibly off-the-record) browser context so that a
// separate instance of the DevicePermissionsManager is used in incognito
// mode. The parent class's implemenation returns NULL.
- return context;
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
}
} // namespace extensions
diff --git a/extensions/browser/api/messaging/messaging_api_message_filter.cc b/extensions/browser/api/messaging/messaging_api_message_filter.cc
index f0533d4..5b812697 100644
--- a/extensions/browser/api/messaging/messaging_api_message_filter.cc
+++ b/extensions/browser/api/messaging/messaging_api_message_filter.cc
@@ -51,6 +51,12 @@
DependsOn(EventRouterFactory::GetInstance());
}
~ShutdownNotifierFactory() override = default;
+
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override {
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
+ }
};
// Returns true if `source_endpoint` can be legitimately claimed/used by
diff --git a/extensions/browser/api/networking_private/networking_private_delegate_factory.cc b/extensions/browser/api/networking_private/networking_private_delegate_factory.cc
index 8cb28b7..b4fbc80 100644
--- a/extensions/browser/api/networking_private/networking_private_delegate_factory.cc
+++ b/extensions/browser/api/networking_private/networking_private_delegate_factory.cc
@@ -85,7 +85,8 @@
BrowserContext* NetworkingPrivateDelegateFactory::GetBrowserContextToUse(
BrowserContext* context) const {
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
} // namespace extensions
diff --git a/extensions/browser/api/offscreen/offscreen_api.cc b/extensions/browser/api/offscreen/offscreen_api.cc
index c4fdeba..ef72415c 100644
--- a/extensions/browser/api/offscreen/offscreen_api.cc
+++ b/extensions/browser/api/offscreen/offscreen_api.cc
@@ -29,9 +29,12 @@
content::BrowserContext& GetBrowserContextToUse(
content::BrowserContext& calling_context,
const Extension& extension) {
+ ExtensionsBrowserClient* client = ExtensionsBrowserClient::Get();
+
// The on-the-record profile always uses itself.
if (!calling_context.IsOffTheRecord()) {
- return calling_context;
+ return *client->GetContextForOriginalOnly(&calling_context,
+ /*force_guest_profile=*/true);
}
DCHECK(util::IsIncognitoEnabled(extension.id(), &calling_context))
@@ -40,9 +43,10 @@
// Split-mode extensions use the incognito (calling) context; spanning mode
// extensions fall back to the original profile.
bool is_split_mode = IncognitoInfo::IsSplitMode(&extension);
- return is_split_mode ? calling_context
- : *ExtensionsBrowserClient::Get()->GetOriginalContext(
- &calling_context);
+ return is_split_mode ? *client->GetContextOwnInstance(
+ &calling_context, /*force_guest_profile=*/true)
+ : *client->GetContextRedirectedToOriginal(
+ &calling_context, /*force_guest_profile=*/true);
}
// Similar to the above, returns the OffscreenDocumentManager to use for the
diff --git a/extensions/browser/api/offscreen/offscreen_document_manager.cc b/extensions/browser/api/offscreen/offscreen_document_manager.cc
index c4a0826..8b7c0d5 100644
--- a/extensions/browser/api/offscreen/offscreen_document_manager.cc
+++ b/extensions/browser/api/offscreen/offscreen_document_manager.cc
@@ -14,6 +14,7 @@
#include "extensions/browser/api/offscreen/offscreen_document_lifetime_enforcer.h"
#include "extensions/browser/extension_registry_factory.h"
#include "extensions/browser/extension_util.h"
+#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/offscreen_document_host.h"
#include "extensions/browser/process_manager.h"
#include "extensions/browser/process_manager_factory.h"
@@ -65,7 +66,8 @@
content::BrowserContext* context) const {
// Use the `context` passed in; this service has separate instances in
// on-the-record and incognito.
- return context;
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
}
KeyedService* OffscreenDocumentManagerFactory::BuildServiceInstanceFor(
diff --git a/extensions/browser/api/printer_provider/printer_provider_api_factory.cc b/extensions/browser/api/printer_provider/printer_provider_api_factory.cc
index e3c3b6a..391fdaf 100644
--- a/extensions/browser/api/printer_provider/printer_provider_api_factory.cc
+++ b/extensions/browser/api/printer_provider/printer_provider_api_factory.cc
@@ -50,7 +50,8 @@
content::BrowserContext* PrinterProviderAPIFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
} // namespace extensions
diff --git a/extensions/browser/api/socket/app_firewall_hole_manager.cc b/extensions/browser/api/socket/app_firewall_hole_manager.cc
index 879884a..56ae409 100644
--- a/extensions/browser/api/socket/app_firewall_hole_manager.cc
+++ b/extensions/browser/api/socket/app_firewall_hole_manager.cc
@@ -10,6 +10,7 @@
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/browser_context.h"
#include "extensions/browser/app_window/app_window.h"
+#include "extensions/browser/extensions_browser_client.h"
using content::BrowserContext;
@@ -47,7 +48,8 @@
BrowserContext* GetBrowserContextToUse(
BrowserContext* context) const override {
- return context;
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
}
};
diff --git a/extensions/browser/api/storage/session_storage_manager.cc b/extensions/browser/api/storage/session_storage_manager.cc
index d2669e2..4ebdaf5f 100644
--- a/extensions/browser/api/storage/session_storage_manager.cc
+++ b/extensions/browser/api/storage/session_storage_manager.cc
@@ -54,7 +54,8 @@
content::BrowserContext* browser_context) const {
// Share storage between incognito and on-the-record profiles by using the
// original context of an incognito window.
- return ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ browser_context, /*force_guest_profile=*/true);
}
KeyedService* SessionStorageManagerFactory::BuildServiceInstanceFor(
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
index 7c5b6b7..79dad33a 100644
--- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
+++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
@@ -99,6 +99,12 @@
DependsOn(PermissionHelper::GetFactoryInstance());
}
~ShutdownNotifierFactory() override {}
+
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override {
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
+ }
};
// Creates simulated net::RedirectInfo when an extension redirects a request,
diff --git a/extensions/browser/api/web_request/web_request_proxying_websocket.cc b/extensions/browser/api/web_request/web_request_proxying_websocket.cc
index b312b3f8..6bf0f2e 100644
--- a/extensions/browser/api/web_request/web_request_proxying_websocket.cc
+++ b/extensions/browser/api/web_request/web_request_proxying_websocket.cc
@@ -45,6 +45,12 @@
DependsOn(PermissionHelper::GetFactoryInstance());
}
~ShutdownNotifierFactory() override {}
+
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override {
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
+ }
};
} // namespace
diff --git a/extensions/browser/app_window/app_window_geometry_cache.cc b/extensions/browser/app_window/app_window_geometry_cache.cc
index e39fbcb..a8aaed4 100644
--- a/extensions/browser/app_window/app_window_geometry_cache.cc
+++ b/extensions/browser/app_window/app_window_geometry_cache.cc
@@ -277,7 +277,8 @@
content::BrowserContext*
AppWindowGeometryCache::Factory::GetBrowserContextToUse(
content::BrowserContext* context) const {
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
void AppWindowGeometryCache::AddObserver(Observer* observer) {
diff --git a/extensions/browser/extension_action_manager.cc b/extensions/browser/extension_action_manager.cc
index 4384cd8..3720a4d 100644
--- a/extensions/browser/extension_action_manager.cc
+++ b/extensions/browser/extension_action_manager.cc
@@ -46,7 +46,8 @@
content::BrowserContext* GetBrowserContextToUse(
content::BrowserContext* context) const override {
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
};
diff --git a/extensions/browser/extension_function.cc b/extensions/browser/extension_function.cc
index 5aafd3ea..0b9fe8a 100644
--- a/extensions/browser/extension_function.cc
+++ b/extensions/browser/extension_function.cc
@@ -28,6 +28,7 @@
#include "base/trace_event/trace_event.h"
#include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h"
#include "components/keyed_service/core/keyed_service_shutdown_notifier.h"
+#include "content/public/browser/browser_context.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
@@ -275,6 +276,12 @@
BrowserContextShutdownNotifierFactory()
: BrowserContextKeyedServiceShutdownNotifierFactory("ExtensionFunction") {
}
+
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override {
+ return extensions::ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
+ }
};
} // namespace
diff --git a/extensions/browser/extension_host_registry.cc b/extensions/browser/extension_host_registry.cc
index 4a1230fc..1304c13d 100644
--- a/extensions/browser/extension_host_registry.cc
+++ b/extensions/browser/extension_host_registry.cc
@@ -55,7 +55,8 @@
// LazyBackgroundTaskQueue!) rely on this, and are set up to be redirect to
// the original context. This makes it quite challenging to let this have its
// own incognito context.
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
KeyedService* ExtensionHostRegistryFactory::BuildServiceInstanceFor(
diff --git a/extensions/browser/extension_message_filter.cc b/extensions/browser/extension_message_filter.cc
index 9e24cef..159d905 100644
--- a/extensions/browser/extension_message_filter.cc
+++ b/extensions/browser/extension_message_filter.cc
@@ -7,6 +7,7 @@
#include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h"
#include "components/keyed_service/core/keyed_service_shutdown_notifier.h"
#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/process_manager.h"
#include "extensions/browser/process_manager_factory.h"
#include "extensions/common/extension_messages.h"
@@ -37,6 +38,12 @@
DependsOn(ProcessManagerFactory::GetInstance());
}
~ShutdownNotifierFactory() override {}
+
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override {
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
+ }
};
} // namespace
diff --git a/extensions/browser/extension_prefs_helper_factory.cc b/extensions/browser/extension_prefs_helper_factory.cc
index dac8b6e0..d583202 100644
--- a/extensions/browser/extension_prefs_helper_factory.cc
+++ b/extensions/browser/extension_prefs_helper_factory.cc
@@ -43,7 +43,8 @@
content::BrowserContext* ExtensionPrefsHelperFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
bool ExtensionPrefsHelperFactory::ServiceIsNULLWhileTesting() const {
diff --git a/extensions/browser/extension_service_worker_message_filter.cc b/extensions/browser/extension_service_worker_message_filter.cc
index 16ec2f9..e02b724 100644
--- a/extensions/browser/extension_service_worker_message_filter.cc
+++ b/extensions/browser/extension_service_worker_message_filter.cc
@@ -15,6 +15,7 @@
#include "extensions/browser/event_router_factory.h"
#include "extensions/browser/events/event_ack_data.h"
#include "extensions/browser/extension_registry_factory.h"
+#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/process_manager.h"
#include "extensions/browser/process_manager_factory.h"
#include "extensions/common/extension_messages.h"
@@ -44,6 +45,12 @@
DependsOn(ProcessManagerFactory::GetInstance());
}
~ShutdownNotifierFactory() override = default;
+
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override {
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
+ }
};
} // namespace
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h
index b70ec0a..c8b79578 100644
--- a/extensions/browser/extensions_browser_client.h
+++ b/extensions/browser/extensions_browser_client.h
@@ -182,6 +182,12 @@
content::BrowserContext* context,
bool force_guest_profile) = 0;
+ // Returns whether the `context` has extensions disabled.
+ // An example of an implementation of `BrowserContext` that has extensions
+ // disabled is `Profile` of type System Profile.
+ virtual bool AreExtensionsDisabledForContext(
+ content::BrowserContext* context) = 0;
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Returns a user id hash from |context| or an empty string if no hash could
// be extracted.
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc
index e0de725..df29907 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc
@@ -61,8 +61,8 @@
content::BrowserContext*
MimeHandlerStreamManagerFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
- return extensions::ExtensionsBrowserClient::Get()->GetOriginalContext(
- context);
+ return extensions::ExtensionsBrowserClient::Get()
+ ->GetContextRedirectedToOriginal(context, /*force_guest_profile=*/true);
}
} // namespace
diff --git a/extensions/browser/image_loader_factory.cc b/extensions/browser/image_loader_factory.cc
index 518fa17..49234b1b 100644
--- a/extensions/browser/image_loader_factory.cc
+++ b/extensions/browser/image_loader_factory.cc
@@ -37,7 +37,8 @@
content::BrowserContext* ImageLoaderFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
} // namespace extensions
diff --git a/extensions/browser/lazy_background_task_queue_factory.cc b/extensions/browser/lazy_background_task_queue_factory.cc
index 78e4691..f1ead87 100644
--- a/extensions/browser/lazy_background_task_queue_factory.cc
+++ b/extensions/browser/lazy_background_task_queue_factory.cc
@@ -45,7 +45,8 @@
BrowserContext* LazyBackgroundTaskQueueFactory::GetBrowserContextToUse(
BrowserContext* context) const {
// Redirected in incognito.
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
} // namespace extensions
diff --git a/extensions/browser/permissions_manager.cc b/extensions/browser/permissions_manager.cc
index 4aa47299..7279e54 100644
--- a/extensions/browser/permissions_manager.cc
+++ b/extensions/browser/permissions_manager.cc
@@ -178,7 +178,8 @@
content::BrowserContext* PermissionsManagerFactory::GetBrowserContextToUse(
content::BrowserContext* browser_context) const {
- return ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ browser_context, /*force_guest_profile=*/true);
}
KeyedService* PermissionsManagerFactory::BuildServiceInstanceFor(
diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc
index ac0da20..c9e90b66 100644
--- a/extensions/browser/process_manager.cc
+++ b/extensions/browser/process_manager.cc
@@ -216,12 +216,14 @@
// a regular incognito mode, background pages of extensions must be
// created regardless of whether extensions use "spanning" or "split"
// incognito behavior.
- BrowserContext* original_context = client->GetOriginalContext(context);
+ BrowserContext* original_context = client->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
return new ProcessManager(context, original_context, extension_registry);
}
if (context->IsOffTheRecord()) {
- BrowserContext* original_context = client->GetOriginalContext(context);
+ BrowserContext* original_context = client->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
return new IncognitoProcessManager(
context, original_context, extension_registry);
}
@@ -1115,7 +1117,8 @@
extension_registry_->enabled_extensions().GetExtensionOrAppByURL(url);
if (extension && !IncognitoInfo::IsSplitMode(extension)) {
BrowserContext* original_context =
- ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context());
+ ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ browser_context(), /*force_guest_profile=*/true);
return ProcessManager::Get(original_context)->GetSiteInstanceForURL(url);
}
diff --git a/extensions/browser/process_map_factory.cc b/extensions/browser/process_map_factory.cc
index a1b96e3..f185cd4 100644
--- a/extensions/browser/process_map_factory.cc
+++ b/extensions/browser/process_map_factory.cc
@@ -43,7 +43,8 @@
BrowserContext* ProcessMapFactory::GetBrowserContextToUse(
BrowserContext* context) const {
// Redirected in incognito.
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
} // namespace extensions
diff --git a/extensions/browser/service_worker_task_queue_factory.cc b/extensions/browser/service_worker_task_queue_factory.cc
index 8ac48300..929bdcc 100644
--- a/extensions/browser/service_worker_task_queue_factory.cc
+++ b/extensions/browser/service_worker_task_queue_factory.cc
@@ -39,7 +39,8 @@
BrowserContext* context) const {
ServiceWorkerTaskQueue* task_queue = new ServiceWorkerTaskQueue(context);
BrowserContext* original_context =
- ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
if (original_context != context) {
// To let incognito context's ServiceWorkerTaskQueue know about extensions
// that were activated (which has its own instance of
@@ -53,7 +54,8 @@
BrowserContext* ServiceWorkerTaskQueueFactory::GetBrowserContextToUse(
BrowserContext* context) const {
- return context;
+ return ExtensionsBrowserClient::Get()->GetContextOwnInstance(
+ context, /*force_guest_profile=*/true);
}
} // namespace extensions
diff --git a/extensions/browser/test_extensions_browser_client.cc b/extensions/browser/test_extensions_browser_client.cc
index c881998..d41d47a 100644
--- a/extensions/browser/test_extensions_browser_client.cc
+++ b/extensions/browser/test_extensions_browser_client.cc
@@ -113,6 +113,11 @@
return context->IsOffTheRecord() ? nullptr : context;
}
+bool TestExtensionsBrowserClient::AreExtensionsDisabledForContext(
+ content::BrowserContext* context) {
+ return false;
+}
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::string TestExtensionsBrowserClient::GetUserIdHashFromContext(
content::BrowserContext* context) {
diff --git a/extensions/browser/test_extensions_browser_client.h b/extensions/browser/test_extensions_browser_client.h
index 7f81070..cd4c1fd 100644
--- a/extensions/browser/test_extensions_browser_client.h
+++ b/extensions/browser/test_extensions_browser_client.h
@@ -90,6 +90,8 @@
content::BrowserContext* GetContextForOriginalOnly(
content::BrowserContext* context,
bool force_guest_profile) override;
+ bool AreExtensionsDisabledForContext(
+ content::BrowserContext* context) override;
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::string GetUserIdHashFromContext(
diff --git a/extensions/browser/updater/update_service_factory.cc b/extensions/browser/updater/update_service_factory.cc
index 075479a..84fceb3 100644
--- a/extensions/browser/updater/update_service_factory.cc
+++ b/extensions/browser/updater/update_service_factory.cc
@@ -38,4 +38,10 @@
context, ExtensionsBrowserClient::Get()->CreateUpdateClient(context));
}
+content::BrowserContext* UpdateServiceFactory::GetBrowserContextToUse(
+ content::BrowserContext* context) const {
+ return ExtensionsBrowserClient::Get()->GetContextForOriginalOnly(
+ context, /*force_guest_profile=*/true);
+}
+
} // namespace extensions
diff --git a/extensions/browser/updater/update_service_factory.h b/extensions/browser/updater/update_service_factory.h
index 49ff9ee..e314db89 100644
--- a/extensions/browser/updater/update_service_factory.h
+++ b/extensions/browser/updater/update_service_factory.h
@@ -31,6 +31,8 @@
// BrowserContextKeyedServiceFactory:
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const override;
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override;
};
} // namespace extensions
diff --git a/extensions/browser/warning_service.cc b/extensions/browser/warning_service.cc
index 13f621c3..9d42310 100644
--- a/extensions/browser/warning_service.cc
+++ b/extensions/browser/warning_service.cc
@@ -19,7 +19,8 @@
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (browser_context_) {
extension_registry_observation_.Observe(ExtensionRegistry::Get(
- ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context_)));
+ ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ browser_context_, /*force_guest_profile=*/true)));
}
}
diff --git a/extensions/browser/warning_service_factory.cc b/extensions/browser/warning_service_factory.cc
index 662fd5a..7efc2a9 100644
--- a/extensions/browser/warning_service_factory.cc
+++ b/extensions/browser/warning_service_factory.cc
@@ -43,7 +43,8 @@
BrowserContext* WarningServiceFactory::GetBrowserContextToUse(
BrowserContext* context) const {
// Redirected in incognito.
- return ExtensionsBrowserClient::Get()->GetOriginalContext(context);
+ return ExtensionsBrowserClient::Get()->GetContextRedirectedToOriginal(
+ context, /*force_guest_profile=*/true);
}
} // namespace extensions
diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc
index 9198eecb..44d4058 100644
--- a/extensions/shell/browser/shell_content_browser_client.cc
+++ b/extensions/shell/browser/shell_content_browser_client.cc
@@ -37,6 +37,7 @@
#include "extensions/browser/extension_protocols.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_web_contents_observer.h"
+#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/guest_view/extensions_guest_view.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"
#include "extensions/browser/process_map.h"
@@ -247,8 +248,12 @@
ShellContentBrowserClient::CreateThrottlesForNavigation(
content::NavigationHandle* navigation_handle) {
std::vector<std::unique_ptr<content::NavigationThrottle>> throttles;
- throttles.push_back(
- std::make_unique<ExtensionNavigationThrottle>(navigation_handle));
+ if (!extensions::ExtensionsBrowserClient::Get()
+ ->AreExtensionsDisabledForContext(
+ navigation_handle->GetWebContents()->GetBrowserContext())) {
+ throttles.push_back(
+ std::make_unique<ExtensionNavigationThrottle>(navigation_handle));
+ }
return throttles;
}
diff --git a/extensions/shell/browser/shell_extensions_browser_client.cc b/extensions/shell/browser/shell_extensions_browser_client.cc
index 639e988..b931b542 100644
--- a/extensions/shell/browser/shell_extensions_browser_client.cc
+++ b/extensions/shell/browser/shell_extensions_browser_client.cc
@@ -112,6 +112,11 @@
return context;
}
+bool ShellExtensionsBrowserClient::AreExtensionsDisabledForContext(
+ content::BrowserContext* context) {
+ return false;
+}
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::string ShellExtensionsBrowserClient::GetUserIdHashFromContext(
content::BrowserContext* context) {
diff --git a/extensions/shell/browser/shell_extensions_browser_client.h b/extensions/shell/browser/shell_extensions_browser_client.h
index 4b64829c..4b459b7 100644
--- a/extensions/shell/browser/shell_extensions_browser_client.h
+++ b/extensions/shell/browser/shell_extensions_browser_client.h
@@ -59,6 +59,8 @@
content::BrowserContext* GetContextForOriginalOnly(
content::BrowserContext* context,
bool force_guest_profile) override;
+ bool AreExtensionsDisabledForContext(
+ content::BrowserContext* context) override;
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::string GetUserIdHashFromContext(