Load extensions URLs with Network Service enabled
Adds support for chrome-extension:// URLs when the Network Service
is enabled. Navigation and subresource loads are supported, with
access policy mirroring the non-network service path.
Unlike the old code, this loading path does not run on the IO thread
and has no dependencies on IO thread data.
To support this change while reusing significant amounts of core logic,
some extensions code has been refactored to be thread agnostic with
more granular data dependencies (e.g. taking a GURL and ExtensionSet
instead of net::URLRequest and extensions::InfoMap*).
The net result of this change is that we can re-enable ~1220
browser_tests with Network Service enabled.
Bug: 780325
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_site_isolation
Change-Id: I7143c1bf080f40a6f00fc761ed823add951dd61e
Reviewed-on: https://chromium-review.googlesource.com/756660
Commit-Queue: Ken Rockot <[email protected]>
Reviewed-by: Daniel Cheng <[email protected]>
Reviewed-by: John Abd-El-Malek <[email protected]>
Cr-Commit-Position: refs/heads/master@{#514915}
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 388f667..5f6ad480 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -352,6 +352,7 @@
#include "components/guest_view/browser/guest_view_base.h"
#include "components/guest_view/browser/guest_view_manager.h"
#include "extensions/browser/extension_navigation_throttle.h"
+#include "extensions/browser/extension_protocols.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_util.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"
@@ -3597,6 +3598,29 @@
return result;
}
+void ChromeContentBrowserClient::RegisterNonNetworkNavigationURLLoaderFactories(
+ content::RenderFrameHost* frame_host,
+ NonNetworkURLLoaderFactoryMap* factories) {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+ factories->emplace(
+ extensions::kExtensionScheme,
+ extensions::CreateExtensionNavigationURLLoaderFactory(frame_host));
+#endif
+}
+
+void ChromeContentBrowserClient::
+ RegisterNonNetworkSubresourceURLLoaderFactories(
+ content::RenderFrameHost* frame_host,
+ const GURL& frame_url,
+ NonNetworkURLLoaderFactoryMap* factories) {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+ auto factory = extensions::MaybeCreateExtensionSubresourceURLLoaderFactory(
+ frame_host, frame_url);
+ if (factory)
+ factories->emplace(extensions::kExtensionScheme, std::move(factory));
+#endif
+}
+
// Static; handles rewriting Web UI URLs.
bool ChromeContentBrowserClient::HandleWebUI(
GURL* url,
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 351650c1..3da33835 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -363,6 +363,13 @@
std::vector<std::unique_ptr<content::URLLoaderThrottle>>
CreateURLLoaderThrottles(
const base::Callback<content::WebContents*()>& wc_getter) override;
+ void RegisterNonNetworkNavigationURLLoaderFactories(
+ content::RenderFrameHost* frame_host,
+ NonNetworkURLLoaderFactoryMap* factories) override;
+ void RegisterNonNetworkSubresourceURLLoaderFactories(
+ content::RenderFrameHost* frame_host,
+ const GURL& frame_url,
+ NonNetworkURLLoaderFactoryMap* factories) override;
protected:
static bool HandleWebUI(GURL* url, content::BrowserContext* browser_context);
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index 17c4ec2..605586c 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -178,14 +178,20 @@
}
bool ChromeExtensionsBrowserClient::AllowCrossRendererResourceLoad(
- net::URLRequest* request,
+ const GURL& url,
+ content::ResourceType resource_type,
+ ui::PageTransition page_transition,
+ int child_id,
bool is_incognito,
const Extension* extension,
- InfoMap* extension_info_map) {
+ const ExtensionSet& extensions,
+ const ProcessMap& process_map) {
bool allowed = false;
if (chrome_url_request_util::AllowCrossRendererResourceLoad(
- request, is_incognito, extension, extension_info_map, &allowed))
+ url, resource_type, page_transition, child_id, is_incognito,
+ extension, extensions, process_map, &allowed)) {
return allowed;
+ }
// Couldn't determine if resource is allowed. Block the load.
return false;
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h
index e61c9ed..e74dfee 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.h
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -71,10 +71,14 @@
const base::FilePath& directory_path,
const std::string& content_security_policy,
bool send_cors_header) override;
- bool AllowCrossRendererResourceLoad(net::URLRequest* request,
+ bool AllowCrossRendererResourceLoad(const GURL& url,
+ content::ResourceType resource_type,
+ ui::PageTransition page_transition,
+ int child_id,
bool is_incognito,
const Extension* extension,
- InfoMap* extension_info_map) override;
+ const ExtensionSet& extensions,
+ const ProcessMap& process_map) override;
PrefService* GetPrefServiceForContext(
content::BrowserContext* context) override;
void GetEarlyExtensionPrefsObservers(
diff --git a/chrome/browser/extensions/chrome_url_request_util.cc b/chrome/browser/extensions/chrome_url_request_util.cc
index c23634ee..fbe3463 100644
--- a/chrome/browser/extensions/chrome_url_request_util.cc
+++ b/chrome/browser/extensions/chrome_url_request_util.cc
@@ -19,7 +19,6 @@
#include "extensions/browser/component_extension_resource_manager.h"
#include "extensions/browser/extension_protocols.h"
#include "extensions/browser/extensions_browser_client.h"
-#include "extensions/browser/info_map.h"
#include "extensions/browser/url_request_util.h"
#include "extensions/common/file_util.h"
#include "net/base/mime_util.h"
@@ -122,13 +121,18 @@
namespace extensions {
namespace chrome_url_request_util {
-bool AllowCrossRendererResourceLoad(net::URLRequest* request,
+bool AllowCrossRendererResourceLoad(const GURL& url,
+ content::ResourceType resource_type,
+ ui::PageTransition page_transition,
+ int child_id,
bool is_incognito,
const Extension* extension,
- InfoMap* extension_info_map,
+ const ExtensionSet& extensions,
+ const ProcessMap& process_map,
bool* allowed) {
if (url_request_util::AllowCrossRendererResourceLoad(
- request, is_incognito, extension, extension_info_map, allowed)) {
+ url, resource_type, page_transition, child_id, is_incognito,
+ extension, extensions, process_map, allowed)) {
return true;
}
diff --git a/chrome/browser/extensions/chrome_url_request_util.h b/chrome/browser/extensions/chrome_url_request_util.h
index 4e7aa55a..1077ef24 100644
--- a/chrome/browser/extensions/chrome_url_request_util.h
+++ b/chrome/browser/extensions/chrome_url_request_util.h
@@ -7,6 +7,12 @@
#include <string>
+#include "content/public/common/resource_type.h"
+#include "content/public/common/url_loader.mojom.h"
+#include "ui/base/page_transition_types.h"
+
+class GURL;
+
namespace base {
class FilePath;
}
@@ -19,7 +25,8 @@
namespace extensions {
class Extension;
-class InfoMap;
+class ExtensionSet;
+class ProcessMap;
// Utilities related to URLRequest jobs for extension resources. See
// chrome/browser/extensions/extension_protocols_unittest.cc for related tests.
@@ -28,10 +35,14 @@
// Sets allowed=true to allow a chrome-extension:// resource request coming from
// renderer A to access a resource in an extension running in renderer B.
// Returns false when it couldn't determine if the resource is allowed or not
-bool AllowCrossRendererResourceLoad(net::URLRequest* request,
+bool AllowCrossRendererResourceLoad(const GURL& url,
+ content::ResourceType resource_type,
+ ui::PageTransition page_transition,
+ int child_id,
bool is_incognito,
const Extension* extension,
- InfoMap* extension_info_map,
+ const ExtensionSet& extensions,
+ const ProcessMap& process_map,
bool* allowed);
// Creates a URLRequestJob for loading component extension resources out of