[go: nahoru, domu]

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(