Commit c85cf0a3 authored by Yao Xiao's avatar Yao Xiao Committed by Commit Bot

Fill in the Network Isolation Key for request from extension

Some extension browser tests are failing when split cache is enabled, because
the request is not considered as cacheable when the Network Isolation Key is
missing.

This CL fills in the Network Isolation Key for the factory used by request
from extensions. This factory is used for xhr and fetch requests from the
extension’s background script.


Bug: 1003882
Change-Id: If5ff7f159dbccb490b1f8ec5d5f98e08301ba1bf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1811477
Commit-Queue: Yao Xiao <yaoxia@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarŁukasz Anforowicz <lukasza@chromium.org>
Reviewed-by: default avatarShivani Sharma <shivanisha@chromium.org>
Cr-Commit-Position: refs/heads/master@{#700012}
parent aa3767df
...@@ -1608,11 +1608,13 @@ ChromeContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests( ...@@ -1608,11 +1608,13 @@ ChromeContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests(
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& request_initiator) { const url::Origin& request_initiator,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key) {
#if BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_EXTENSIONS)
return ChromeContentBrowserClientExtensionsPart:: return ChromeContentBrowserClientExtensionsPart::
CreateURLLoaderFactoryForNetworkRequests( CreateURLLoaderFactoryForNetworkRequests(process, network_context,
process, network_context, header_client, request_initiator); header_client, request_initiator,
network_isolation_key);
#else #else
return network::mojom::URLLoaderFactoryPtrInfo(); return network::mojom::URLLoaderFactoryPtrInfo();
#endif #endif
......
...@@ -157,7 +157,9 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient { ...@@ -157,7 +157,9 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& request_initiator) override; const url::Origin& request_initiator,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key)
override;
void GetAdditionalWebUISchemes( void GetAdditionalWebUISchemes(
std::vector<std::string>* additional_schemes) override; std::vector<std::string>* additional_schemes) override;
void GetAdditionalViewSourceSchemes( void GetAdditionalViewSourceSchemes(
......
...@@ -652,9 +652,11 @@ ChromeContentBrowserClientExtensionsPart:: ...@@ -652,9 +652,11 @@ ChromeContentBrowserClientExtensionsPart::
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& request_initiator) { const url::Origin& request_initiator,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key) {
return URLLoaderFactoryManager::CreateFactory( return URLLoaderFactoryManager::CreateFactory(
process, network_context, header_client, request_initiator); process, network_context, header_client, request_initiator,
network_isolation_key);
} }
// static // static
......
...@@ -99,7 +99,8 @@ class ChromeContentBrowserClientExtensionsPart ...@@ -99,7 +99,8 @@ class ChromeContentBrowserClientExtensionsPart
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& request_initiator); const url::Origin& request_initiator,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key);
static bool IsBuiltinComponent(content::BrowserContext* browser_context, static bool IsBuiltinComponent(content::BrowserContext* browser_context,
const url::Origin& origin); const url::Origin& origin);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "extensions/common/switches.h" #include "extensions/common/switches.h"
#include "extensions/test/result_catcher.h" #include "extensions/test/result_catcher.h"
#include "net/base/backoff_entry.h" #include "net/base/backoff_entry.h"
#include "net/base/features.h"
#include "net/base/url_util.h" #include "net/base/url_util.h"
#include "net/dns/mock_host_resolver.h" #include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/embedded_test_server.h"
...@@ -98,19 +99,26 @@ class ExtensionURLLoaderThrottleBrowserTest : public ExtensionBrowserTest { ...@@ -98,19 +99,26 @@ class ExtensionURLLoaderThrottleBrowserTest : public ExtensionBrowserTest {
const Extension* extension_; const Extension* extension_;
}; };
class ExtensionURLLoaderThrottleCommandLineBrowserTest class ExtensionURLLoaderThrottleWithSplitCacheBrowserTest
: public ExtensionURLLoaderThrottleBrowserTest { : public ExtensionURLLoaderThrottleBrowserTest,
public ::testing::WithParamInterface<bool> {
public: public:
void SetUpCommandLine(base::CommandLine* command_line) override { void SetUp() override {
ExtensionURLLoaderThrottleBrowserTest::SetUpCommandLine(command_line); bool split_cache_by_network_isolation_key = GetParam();
command_line->AppendSwitch( feature_list_.InitWithFeatureState(
extensions::switches::kDisableExtensionsHttpThrottling); net::features::kSplitCacheByNetworkIsolationKey,
split_cache_by_network_isolation_key);
ExtensionURLLoaderThrottleBrowserTest::SetUp();
} }
private:
base::test::ScopedFeatureList feature_list_;
}; };
// Tests that if the same URL is requested repeatedly by an extension, it will // Tests that if the same URL is requested repeatedly by an extension, it will
// eventually be throttled. // eventually be throttled.
IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, ThrottleRequest) { IN_PROC_BROWSER_TEST_P(ExtensionURLLoaderThrottleWithSplitCacheBrowserTest,
ThrottleRequest) {
embedded_test_server()->RegisterRequestHandler( embedded_test_server()->RegisterRequestHandler(
base::BindRepeating(&HandleRequest, false, false)); base::BindRepeating(&HandleRequest, false, false));
ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(embedded_test_server()->Start());
...@@ -123,7 +131,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, ThrottleRequest) { ...@@ -123,7 +131,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, ThrottleRequest) {
// Tests that if the same URL is repeatedly requested by an extension, and the // Tests that if the same URL is repeatedly requested by an extension, and the
// response is served from the cache, it will not be throttled. // response is served from the cache, it will not be throttled.
IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, IN_PROC_BROWSER_TEST_P(ExtensionURLLoaderThrottleWithSplitCacheBrowserTest,
DoNotThrottleCachedResponse) { DoNotThrottleCachedResponse) {
embedded_test_server()->RegisterRequestHandler( embedded_test_server()->RegisterRequestHandler(
base::BindRepeating(&HandleRequest, false, true)); base::BindRepeating(&HandleRequest, false, true));
...@@ -136,7 +144,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, ...@@ -136,7 +144,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest,
} }
// Tests that the redirected request is also being throttled. // Tests that the redirected request is also being throttled.
IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, IN_PROC_BROWSER_TEST_P(ExtensionURLLoaderThrottleWithSplitCacheBrowserTest,
ThrottleRequest_Redirect) { ThrottleRequest_Redirect) {
embedded_test_server()->RegisterRequestHandler( embedded_test_server()->RegisterRequestHandler(
base::BindRepeating(&HandleRequest, false, false)); base::BindRepeating(&HandleRequest, false, false));
...@@ -160,7 +168,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, ...@@ -160,7 +168,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest,
// Tests that if both redirect (302) and non-redirect (503) responses are // Tests that if both redirect (302) and non-redirect (503) responses are
// served from cache, the extension throttle does not throttle the request. // served from cache, the extension throttle does not throttle the request.
IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, IN_PROC_BROWSER_TEST_P(ExtensionURLLoaderThrottleWithSplitCacheBrowserTest,
DoNotThrottleCachedResponse_Redirect) { DoNotThrottleCachedResponse_Redirect) {
embedded_test_server()->RegisterRequestHandler( embedded_test_server()->RegisterRequestHandler(
base::BindRepeating(&HandleRequest, true, true)); base::BindRepeating(&HandleRequest, true, true));
...@@ -175,7 +183,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, ...@@ -175,7 +183,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest,
// Tests that if the redirect (302) is served from cache, but the non-redirect // Tests that if the redirect (302) is served from cache, but the non-redirect
// (503) is not, the extension throttle throttles the requests for the second // (503) is not, the extension throttle throttles the requests for the second
// url. // url.
IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, IN_PROC_BROWSER_TEST_P(ExtensionURLLoaderThrottleWithSplitCacheBrowserTest,
ThrottleRequest_RedirectCached) { ThrottleRequest_RedirectCached) {
embedded_test_server()->RegisterRequestHandler( embedded_test_server()->RegisterRequestHandler(
base::BindRepeating(&HandleRequest, true, false)); base::BindRepeating(&HandleRequest, true, false));
...@@ -197,7 +205,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, ...@@ -197,7 +205,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest,
// Tests that if the redirect (302) is not served from cache, but the // Tests that if the redirect (302) is not served from cache, but the
// non-redirect (503) is, the extension throttle only throttles requests to the // non-redirect (503) is, the extension throttle only throttles requests to the
// redirect URL. // redirect URL.
IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, IN_PROC_BROWSER_TEST_P(ExtensionURLLoaderThrottleWithSplitCacheBrowserTest,
DoNotThrottleCachedResponse_NonRedirectCached) { DoNotThrottleCachedResponse_NonRedirectCached) {
embedded_test_server()->RegisterRequestHandler( embedded_test_server()->RegisterRequestHandler(
base::BindRepeating(&HandleRequest, false, true)); base::BindRepeating(&HandleRequest, false, true));
...@@ -216,6 +224,21 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest, ...@@ -216,6 +224,21 @@ IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleBrowserTest,
"")); ""));
} }
INSTANTIATE_TEST_SUITE_P(
/* no prefix */,
ExtensionURLLoaderThrottleWithSplitCacheBrowserTest,
testing::Bool());
class ExtensionURLLoaderThrottleCommandLineBrowserTest
: public ExtensionURLLoaderThrottleBrowserTest {
public:
void SetUpCommandLine(base::CommandLine* command_line) override {
ExtensionURLLoaderThrottleBrowserTest::SetUpCommandLine(command_line);
command_line->AppendSwitch(
extensions::switches::kDisableExtensionsHttpThrottling);
}
};
// Tests that if switches::kDisableExtensionsHttpThrottling is set on the // Tests that if switches::kDisableExtensionsHttpThrottling is set on the
// command line, throttling is disabled. // command line, throttling is disabled.
IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleCommandLineBrowserTest, IN_PROC_BROWSER_TEST_F(ExtensionURLLoaderThrottleCommandLineBrowserTest,
......
...@@ -2467,7 +2467,7 @@ void RenderProcessHostImpl::CreateURLLoaderFactoryInternal( ...@@ -2467,7 +2467,7 @@ void RenderProcessHostImpl::CreateURLLoaderFactoryInternal(
const base::Optional<url::Origin>& origin, const base::Optional<url::Origin>& origin,
network::mojom::CrossOriginEmbedderPolicy embedder_policy, network::mojom::CrossOriginEmbedderPolicy embedder_policy,
const WebPreferences* preferences, const WebPreferences* preferences,
base::Optional<net::NetworkIsolationKey> network_isolation_key, const base::Optional<net::NetworkIsolationKey>& network_isolation_key,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient> mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>
header_client, header_client,
network::mojom::URLLoaderFactoryRequest request, network::mojom::URLLoaderFactoryRequest request,
...@@ -2485,7 +2485,8 @@ void RenderProcessHostImpl::CreateURLLoaderFactoryInternal( ...@@ -2485,7 +2485,8 @@ void RenderProcessHostImpl::CreateURLLoaderFactoryInternal(
if (origin.has_value()) { if (origin.has_value()) {
embedder_provided_factory = embedder_provided_factory =
GetContentClient()->browser()->CreateURLLoaderFactoryForNetworkRequests( GetContentClient()->browser()->CreateURLLoaderFactoryForNetworkRequests(
this, network_context, &header_client, origin.value()); this, network_context, &header_client, origin.value(),
network_isolation_key);
} }
if (embedder_provided_factory) { if (embedder_provided_factory) {
mojo::FuseInterface(std::move(request), mojo::FuseInterface(std::move(request),
......
...@@ -757,7 +757,7 @@ class CONTENT_EXPORT RenderProcessHostImpl ...@@ -757,7 +757,7 @@ class CONTENT_EXPORT RenderProcessHostImpl
const base::Optional<url::Origin>& origin, const base::Optional<url::Origin>& origin,
network::mojom::CrossOriginEmbedderPolicy embedder_policy, network::mojom::CrossOriginEmbedderPolicy embedder_policy,
const WebPreferences* preferences, const WebPreferences* preferences,
base::Optional<net::NetworkIsolationKey> network_isolation_key, const base::Optional<net::NetworkIsolationKey>& network_isolation_key,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient> mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>
header_client, header_client,
network::mojom::URLLoaderFactoryRequest request, network::mojom::URLLoaderFactoryRequest request,
......
...@@ -140,7 +140,8 @@ ContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests( ...@@ -140,7 +140,8 @@ ContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests(
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& request_initiator) { const url::Origin& request_initiator,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key) {
return network::mojom::URLLoaderFactoryPtrInfo(); return network::mojom::URLLoaderFactoryPtrInfo();
} }
......
...@@ -356,7 +356,8 @@ class CONTENT_EXPORT ContentBrowserClient { ...@@ -356,7 +356,8 @@ class CONTENT_EXPORT ContentBrowserClient {
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& request_initiator); const url::Origin& request_initiator,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key);
// Returns a list additional WebUI schemes, if any. These additional schemes // Returns a list additional WebUI schemes, if any. These additional schemes
// act as aliases to the chrome: scheme. The additional schemes may or may // act as aliases to the chrome: scheme. The additional schemes may or may
......
...@@ -312,11 +312,14 @@ network::mojom::URLLoaderFactoryPtrInfo CreateURLLoaderFactory( ...@@ -312,11 +312,14 @@ network::mojom::URLLoaderFactoryPtrInfo CreateURLLoaderFactory(
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const Extension& extension) { const Extension& extension,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key) {
// Compute relaxed CORB config to be used by |extension|. // Compute relaxed CORB config to be used by |extension|.
network::mojom::URLLoaderFactoryParamsPtr params = network::mojom::URLLoaderFactoryParamsPtr params =
network::mojom::URLLoaderFactoryParams::New(); network::mojom::URLLoaderFactoryParams::New();
params->network_isolation_key = network_isolation_key;
// Setup factory bound allow list that overwrites per-profile common list // Setup factory bound allow list that overwrites per-profile common list
// to allow tab specific permissions only for this newly created factory. // to allow tab specific permissions only for this newly created factory.
params->factory_bound_allow_patterns = CreateCorsOriginAccessAllowList( params->factory_bound_allow_patterns = CreateCorsOriginAccessAllowList(
...@@ -518,7 +521,8 @@ network::mojom::URLLoaderFactoryPtrInfo URLLoaderFactoryManager::CreateFactory( ...@@ -518,7 +521,8 @@ network::mojom::URLLoaderFactoryPtrInfo URLLoaderFactoryManager::CreateFactory(
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& initiator_origin) { const url::Origin& initiator_origin,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key) {
content::BrowserContext* browser_context = process->GetBrowserContext(); content::BrowserContext* browser_context = process->GetBrowserContext();
const ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context); const ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context);
DCHECK(registry); // CreateFactory shouldn't happen during shutdown. DCHECK(registry); // CreateFactory shouldn't happen during shutdown.
...@@ -555,7 +559,7 @@ network::mojom::URLLoaderFactoryPtrInfo URLLoaderFactoryManager::CreateFactory( ...@@ -555,7 +559,7 @@ network::mojom::URLLoaderFactoryPtrInfo URLLoaderFactoryManager::CreateFactory(
if (!IsSpecialURLLoaderFactoryRequired(*extension, factory_user)) if (!IsSpecialURLLoaderFactoryRequired(*extension, factory_user))
return network::mojom::URLLoaderFactoryPtrInfo(); return network::mojom::URLLoaderFactoryPtrInfo();
return CreateURLLoaderFactory(process, network_context, header_client, return CreateURLLoaderFactory(process, network_context, header_client,
*extension); *extension, network_isolation_key);
} }
// static // static
......
...@@ -67,7 +67,8 @@ class URLLoaderFactoryManager { ...@@ -67,7 +67,8 @@ class URLLoaderFactoryManager {
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& initiator_origin); const url::Origin& initiator_origin,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key);
static void AddExtensionToAllowlistForTesting(const Extension& extension); static void AddExtensionToAllowlistForTesting(const Extension& extension);
static void RemoveExtensionFromAllowlistForTesting( static void RemoveExtensionFromAllowlistForTesting(
......
...@@ -341,9 +341,11 @@ ShellContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests( ...@@ -341,9 +341,11 @@ ShellContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests(
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& request_initiator) { const url::Origin& request_initiator,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key) {
return URLLoaderFactoryManager::CreateFactory( return URLLoaderFactoryManager::CreateFactory(
process, network_context, header_client, request_initiator); process, network_context, header_client, request_initiator,
network_isolation_key);
} }
std::string ShellContentBrowserClient::GetUserAgent() { std::string ShellContentBrowserClient::GetUserAgent() {
......
...@@ -101,7 +101,9 @@ class ShellContentBrowserClient : public content::ContentBrowserClient { ...@@ -101,7 +101,9 @@ class ShellContentBrowserClient : public content::ContentBrowserClient {
network::mojom::NetworkContext* network_context, network::mojom::NetworkContext* network_context,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client, header_client,
const url::Origin& request_initiator) override; const url::Origin& request_initiator,
const base::Optional<net::NetworkIsolationKey>& network_isolation_key)
override;
std::string GetUserAgent() override; std::string GetUserAgent() override;
protected: protected:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment