summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-09-24 15:25:25 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-10-02 11:32:01 +0000
commit5a85b3ecb42ec36336254a0ab6e92604ba4aa9e6 (patch)
treec208f09a59de708a0539448218945ea079d3ca91
parent84e109fd9995b73c29d8e43e1ff84b608479fcf7 (diff)
downloadqtwebengine-chromium-5a85b3ecb42ec36336254a0ab6e92604ba4aa9e6.tar.gz
Reintroduce non-NetworkService code for shared workers
The code was removed because it was unused by Android Webview, but we still need it. Reverts: Worker: Remove non-NetworkService code for shared workers in content/renderer/worker/ Worker: Remove non-NetworkService code for shared workers in content/browser/worker_host/ Worker: Remove non-NetworkService code from WorkerScriptLoaderFactory And fixes the code up to deal with conflicting later changes. Change-Id: Ib7307e0e10c78127f138162f37e796deb1efef65 Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
-rw-r--r--chromium/content/browser/worker_host/dedicated_worker_host.cc5
-rw-r--r--chromium/content/browser/worker_host/mock_shared_worker.cc1
-rw-r--r--chromium/content/browser/worker_host/mock_shared_worker.h1
-rw-r--r--chromium/content/browser/worker_host/shared_worker_host.cc50
-rw-r--r--chromium/content/browser/worker_host/shared_worker_host.h13
-rw-r--r--chromium/content/browser/worker_host/shared_worker_service_impl.cc25
-rw-r--r--chromium/content/browser/worker_host/shared_worker_service_impl.h2
-rw-r--r--chromium/content/browser/worker_host/shared_worker_service_impl_unittest.cc67
-rw-r--r--chromium/content/browser/worker_host/worker_browsertest.cc8
-rw-r--r--chromium/content/browser/worker_host/worker_script_fetch_initiator.cc266
-rw-r--r--chromium/content/browser/worker_host/worker_script_fetch_initiator.h2
-rw-r--r--chromium/content/browser/worker_host/worker_script_loader_factory.cc23
-rw-r--r--chromium/content/renderer/worker/embedded_shared_worker_stub.cc37
-rw-r--r--chromium/content/renderer/worker/embedded_shared_worker_stub.h10
-rw-r--r--chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.cc23
-rw-r--r--chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.h6
-rw-r--r--chromium/content/renderer/worker/shared_worker_factory_impl.cc3
-rw-r--r--chromium/content/renderer/worker/shared_worker_factory_impl.h2
-rw-r--r--chromium/third_party/blink/common/features.cc4
-rw-r--r--chromium/third_party/blink/public/mojom/worker/shared_worker_factory.mojom30
20 files changed, 428 insertions, 150 deletions
diff --git a/chromium/content/browser/worker_host/dedicated_worker_host.cc b/chromium/content/browser/worker_host/dedicated_worker_host.cc
index 6de307ce00a..c24c9749542 100644
--- a/chromium/content/browser/worker_host/dedicated_worker_host.cc
+++ b/chromium/content/browser/worker_host/dedicated_worker_host.cc
@@ -161,6 +161,8 @@ class DedicatedWorkerHost : public service_manager::mojom::InterfaceProvider {
// Called from WorkerScriptFetchInitiator. Continues starting the dedicated
// worker in the renderer process.
//
+ // |main_script_loader_factory| is not used when NetworkService is enabled.
+ //
// |main_script_load_params| is sent to the renderer process and to be used to
// load the dedicated worker main script pre-requested by the browser process.
//
@@ -174,6 +176,7 @@ class DedicatedWorkerHost : public service_manager::mojom::InterfaceProvider {
// a ServiceWorker object about the controller is prepared, it is registered
// to |controller_service_worker_object_host|.
void DidStartScriptLoad(
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
@@ -183,6 +186,8 @@ class DedicatedWorkerHost : public service_manager::mojom::InterfaceProvider {
bool success) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(blink::features::IsPlzDedicatedWorkerEnabled());
+ // |main_script_loader_factory| is not used when NetworkService is enabled.
+ DCHECK(!main_script_loader_factory);
if (!success) {
client_->OnScriptLoadStartFailed();
diff --git a/chromium/content/browser/worker_host/mock_shared_worker.cc b/chromium/content/browser/worker_host/mock_shared_worker.cc
index c452b2f99c8..3b027003c6e 100644
--- a/chromium/content/browser/worker_host/mock_shared_worker.cc
+++ b/chromium/content/browser/worker_host/mock_shared_worker.cc
@@ -107,6 +107,7 @@ void MockSharedWorkerFactory::CreateSharedWorker(
blink::mojom::ServiceWorkerProviderInfoForClientPtr
service_worker_provider_info,
const base::Optional<base::UnguessableToken>& appcache_host_id,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
diff --git a/chromium/content/browser/worker_host/mock_shared_worker.h b/chromium/content/browser/worker_host/mock_shared_worker.h
index d10ae02d4ad..672ab44645a 100644
--- a/chromium/content/browser/worker_host/mock_shared_worker.h
+++ b/chromium/content/browser/worker_host/mock_shared_worker.h
@@ -82,6 +82,7 @@ class MockSharedWorkerFactory : public blink::mojom::SharedWorkerFactory {
blink::mojom::ServiceWorkerProviderInfoForClientPtr
service_worker_provider_info,
const base::Optional<base::UnguessableToken>& appcache_host_id,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
diff --git a/chromium/content/browser/worker_host/shared_worker_host.cc b/chromium/content/browser/worker_host/shared_worker_host.cc
index c11c026212e..8243f55e2fd 100644
--- a/chromium/content/browser/worker_host/shared_worker_host.cc
+++ b/chromium/content/browser/worker_host/shared_worker_host.cc
@@ -118,7 +118,6 @@ SharedWorkerHost::SharedWorkerHost(
worker_process_id_(worker_process_id),
next_connection_request_id_(1),
interface_provider_binding_(this) {
- DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
DCHECK(instance_);
// Set up the worker interface request. This is needed first in either
// AddClient() or Start(). AddClient() can sometimes be called before Start()
@@ -167,6 +166,7 @@ void SharedWorkerHost::SetNetworkFactoryForTesting(
void SharedWorkerHost::Start(
blink::mojom::SharedWorkerFactoryPtr factory,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
@@ -174,12 +174,27 @@ void SharedWorkerHost::Start(
base::WeakPtr<ServiceWorkerObjectHost>
controller_service_worker_object_host) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(main_script_load_params);
- DCHECK(subresource_loader_factories);
- DCHECK(!subresource_loader_factories->pending_default_factory());
-
AdvanceTo(Phase::kStarted);
+#if DCHECK_IS_ON()
+ // Verify the combination of the given args based on the flags. See the
+ // function comment for details.
+ DCHECK(subresource_loader_factories);
+ if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ // NetworkService (PlzWorker):
+ DCHECK(!main_script_loader_factory);
+ DCHECK(main_script_load_params);
+ DCHECK(!subresource_loader_factories->pending_default_factory());
+ } else {
+ // non-NetworkService:
+ DCHECK(main_script_loader_factory);
+ DCHECK(!main_script_load_params);
+ DCHECK(subresource_loader_factories->pending_default_factory());
+ DCHECK(!controller);
+ DCHECK(!controller_service_worker_object_host);
+ }
+#endif // DCHECK_IS_ON()
+
blink::mojom::SharedWorkerInfoPtr info(blink::mojom::SharedWorkerInfo::New(
instance_->url(), instance_->name(), instance_->content_security_policy(),
instance_->content_security_policy_type(),
@@ -220,20 +235,29 @@ void SharedWorkerHost::Start(
mojo::MakeRequest(&interface_provider)));
// Set the default factory to the bundle for subresource loading to pass to
- // the renderer.
- mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_default_factory;
- CreateNetworkFactory(
- pending_default_factory.InitWithNewPipeAndPassReceiver());
- subresource_loader_factories->pending_default_factory() =
- std::move(pending_default_factory);
+ // the renderer when NetworkService is on. When NetworkService is off, the
+ // default factory is already provided by
+ // WorkerScriptFetchInitiator::CreateFactoryBundle().
+ if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_default_factory;
+ CreateNetworkFactory(
+ pending_default_factory.InitWithNewPipeAndPassReceiver());
+ subresource_loader_factories->pending_default_factory() =
+ std::move(pending_default_factory);
+ }
+ // NetworkService (PlzWorker):
// Prepare the controller service worker info to pass to the renderer.
+ // |controller| is only provided if NetworkService is enabled. In the
+ // non-NetworkService case, the controller is sent in SetController IPCs
+ // during the request for the shared worker script.
// |object_info| can be nullptr when the service worker context or the service
// worker version is gone during shared worker startup.
blink::mojom::ServiceWorkerObjectAssociatedPtrInfo
service_worker_remote_object;
blink::mojom::ServiceWorkerState service_worker_sent_state;
if (controller && controller->object_info) {
+ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
controller->object_info->request =
mojo::MakeRequest(&service_worker_remote_object);
service_worker_sent_state = controller->object_info->state;
@@ -248,16 +272,18 @@ void SharedWorkerHost::Start(
appcache_handle_
? base::make_optional(appcache_handle_->appcache_host_id())
: base::nullopt,
- std::move(main_script_load_params),
+ std::move(main_script_loader_factory), std::move(main_script_load_params),
std::move(subresource_loader_factories), std::move(controller),
std::move(host), std::move(worker_request_),
std::move(interface_provider));
+ // NetworkService (PlzWorker):
// |service_worker_remote_object| is an associated interface ptr, so calls
// can't be made on it until its request endpoint is sent. Now that the
// request endpoint was sent, it can be used, so add it to
// ServiceWorkerObjectHost.
if (service_worker_remote_object.is_valid()) {
+ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(
diff --git a/chromium/content/browser/worker_host/shared_worker_host.h b/chromium/content/browser/worker_host/shared_worker_host.h
index 9395da716da..87c552bad23 100644
--- a/chromium/content/browser/worker_host/shared_worker_host.h
+++ b/chromium/content/browser/worker_host/shared_worker_host.h
@@ -70,6 +70,11 @@ class CONTENT_EXPORT SharedWorkerHost
// Starts the SharedWorker in the renderer process.
//
+ // |main_script_loader_factory| is sent to the renderer process and is to be
+ // used to request the shared worker's main script. This is null when
+ // NetworkService is enabled in favor of |main_script_load_params|.
+ //
+ // NetworkService (PlzWorker):
// |main_script_load_params| is sent to the renderer process and to be used to
// load the shared worker main script pre-requested by the browser process.
//
@@ -78,11 +83,16 @@ class CONTENT_EXPORT SharedWorkerHost
// shared worker to load chrome-extension:// URLs which the renderer's default
// loader factory can't load.
//
+ // NetworkService (PlzWorker):
// |controller| contains information about the service worker controller. Once
// a ServiceWorker object about the controller is prepared, it is registered
- // to |controller_service_worker_object_host|.
+ // to |controller_service_worker_object_host|. These can be non-null only when
+ // NetworkService is enabled.
+ // When NetworkService is disabled, the service worker controller is sent via
+ // ServiceWorkerContainer#SetController.
void Start(
blink::mojom::SharedWorkerFactoryPtr factory,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
@@ -197,6 +207,7 @@ class CONTENT_EXPORT SharedWorkerHost
mojo::Binding<service_manager::mojom::InterfaceProvider>
interface_provider_binding_;
+ // NetworkService:
// The handle owns the precreated AppCacheHost until it's claimed by the
// renderer after main script loading finishes.
std::unique_ptr<AppCacheNavigationHandle> appcache_handle_;
diff --git a/chromium/content/browser/worker_host/shared_worker_service_impl.cc b/chromium/content/browser/worker_host/shared_worker_service_impl.cc
index 54f9a69434e..a1117afa541 100644
--- a/chromium/content/browser/worker_host/shared_worker_service_impl.cc
+++ b/chromium/content/browser/worker_host/shared_worker_service_impl.cc
@@ -208,7 +208,6 @@ void SharedWorkerServiceImpl::CreateWorker(
const blink::MessagePortChannel& message_port,
scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
DCHECK(!IsShuttingDown(RenderProcessHost::FromID(client_process_id)));
DCHECK(!blob_url_loader_factory || instance->url().SchemeIsBlob());
@@ -221,11 +220,16 @@ void SharedWorkerServiceImpl::CreateWorker(
auto weak_host = host->AsWeakPtr();
worker_hosts_.insert(std::move(host));
- auto appcache_handle = std::make_unique<AppCacheNavigationHandle>(
- appcache_service_.get(), weak_host->worker_process_id());
- AppCacheNavigationHandleCore* appcache_handle_core = appcache_handle_core =
- appcache_handle->core();
- weak_host->SetAppCacheHandle(std::move(appcache_handle));
+ // NetworkService (PlzWorker):
+ // An appcache interceptor is available only when the network service is
+ // enabled.
+ AppCacheNavigationHandleCore* appcache_handle_core = nullptr;
+ if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ auto appcache_handle = std::make_unique<AppCacheNavigationHandle>(
+ appcache_service_.get(), weak_host->worker_process_id());
+ appcache_handle_core = appcache_handle->core();
+ weak_host->SetAppCacheHandle(std::move(appcache_handle));
+ }
auto service_worker_handle = std::make_unique<ServiceWorkerNavigationHandle>(
storage_partition_->GetServiceWorkerContext());
@@ -260,6 +264,7 @@ void SharedWorkerServiceImpl::DidCreateScriptLoader(
int process_id,
int frame_id,
const blink::MessagePortChannel& message_port,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
@@ -269,9 +274,11 @@ void SharedWorkerServiceImpl::DidCreateScriptLoader(
bool success) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ // NetworkService (PlzWorker):
// If the script fetcher fails to load shared worker's main script, notify the
// client of the failure and abort shared worker startup.
if (!success) {
+ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
client->OnScriptLoadFailed();
return;
}
@@ -281,6 +288,7 @@ void SharedWorkerServiceImpl::DidCreateScriptLoader(
StartWorker(std::move(instance), std::move(host), std::move(client),
process_id, frame_id, message_port,
+ std::move(main_script_loader_factory),
std::move(subresource_loader_factories),
std::move(main_script_load_params), std::move(controller),
std::move(controller_service_worker_object_host));
@@ -293,6 +301,7 @@ void SharedWorkerServiceImpl::StartWorker(
int client_process_id,
int frame_id,
const blink::MessagePortChannel& message_port,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
@@ -321,7 +330,9 @@ void SharedWorkerServiceImpl::StartWorker(
blink::mojom::SharedWorkerFactoryPtr factory;
BindInterface(worker_process_host, &factory);
- host->Start(std::move(factory), std::move(main_script_load_params),
+ host->Start(std::move(factory),
+ std::move(main_script_loader_factory),
+ std::move(main_script_load_params),
std::move(subresource_loader_factories), std::move(controller),
std::move(controller_service_worker_object_host));
host->AddClient(std::move(client), client_process_id, frame_id, message_port);
diff --git a/chromium/content/browser/worker_host/shared_worker_service_impl.h b/chromium/content/browser/worker_host/shared_worker_service_impl.h
index 553f1de7fa2..f7ee7ea0e92 100644
--- a/chromium/content/browser/worker_host/shared_worker_service_impl.h
+++ b/chromium/content/browser/worker_host/shared_worker_service_impl.h
@@ -97,6 +97,7 @@ class CONTENT_EXPORT SharedWorkerServiceImpl : public SharedWorkerService {
int client_process_id,
int frame_id,
const blink::MessagePortChannel& message_port,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
@@ -111,6 +112,7 @@ class CONTENT_EXPORT SharedWorkerServiceImpl : public SharedWorkerService {
int client_process_id,
int frame_id,
const blink::MessagePortChannel& message_port,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
diff --git a/chromium/content/browser/worker_host/shared_worker_service_impl_unittest.cc b/chromium/content/browser/worker_host/shared_worker_service_impl_unittest.cc
index 44eea2c414e..99b6ad05529 100644
--- a/chromium/content/browser/worker_host/shared_worker_service_impl_unittest.cc
+++ b/chromium/content/browser/worker_host/shared_worker_service_impl_unittest.cc
@@ -154,14 +154,20 @@ class SharedWorkerServiceImplTest : public RenderViewHostImplTestHarness {
RenderProcessHostImpl::set_render_process_host_factory_for_testing(
render_process_host_factory_.get());
- fake_url_loader_factory_ = std::make_unique<FakeNetworkURLLoaderFactory>();
- url_loader_factory_wrapper_ =
- base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
- fake_url_loader_factory_.get());
- static_cast<SharedWorkerServiceImpl*>(
- BrowserContext::GetDefaultStoragePartition(browser_context_.get())
- ->GetSharedWorkerService())
- ->SetURLLoaderFactoryForTesting(url_loader_factory_wrapper_);
+ if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ fake_url_loader_factory_ =
+ std::make_unique<FakeNetworkURLLoaderFactory>();
+ url_loader_factory_wrapper_ =
+ base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+ fake_url_loader_factory_.get());
+ static_cast<SharedWorkerServiceImpl*>(
+ BrowserContext::GetDefaultStoragePartition(browser_context_.get())
+ ->GetSharedWorkerService())
+ ->SetURLLoaderFactoryForTesting(url_loader_factory_wrapper_);
+ } else {
+ url_loader_factory_ =
+ std::make_unique<NotImplementedNetworkURLLoaderFactory>();
+ }
}
void TearDown() override {
@@ -184,6 +190,7 @@ class SharedWorkerServiceImplTest : public RenderViewHostImplTestHarness {
int factory_request_callback_process_id_ = ChildProcessHost::kInvalidUniqueID;
std::unique_ptr<MockRenderProcessHostFactory> render_process_host_factory_;
+ std::unique_ptr<NotImplementedNetworkURLLoaderFactory> url_loader_factory_;
std::unique_ptr<FakeNetworkURLLoaderFactory> fake_url_loader_factory_;
scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
@@ -203,6 +210,8 @@ TEST_F(SharedWorkerServiceImplTest, BasicTest) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host->OverrideURLLoaderFactory(url_loader_factory_.get());
MockSharedWorkerClient client;
MessagePortChannel local_port;
@@ -277,6 +286,8 @@ TEST_F(SharedWorkerServiceImplTest, TwoRendererTest) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
MockSharedWorkerClient client0;
MessagePortChannel local_port0;
@@ -346,6 +357,8 @@ TEST_F(SharedWorkerServiceImplTest, TwoRendererTest) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id1));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
MockSharedWorkerClient client1;
MessagePortChannel local_port1;
@@ -409,6 +422,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_NormalCase) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
// The second renderer host.
std::unique_ptr<TestWebContents> web_contents1 =
@@ -484,6 +499,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_NormalCase_URLMismatch) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
// The second renderer host.
std::unique_ptr<TestWebContents> web_contents1 =
@@ -495,6 +512,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_NormalCase_URLMismatch) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id1));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
// First client, creates worker.
@@ -571,6 +590,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_NormalCase_NameMismatch) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
// The second renderer host.
std::unique_ptr<TestWebContents> web_contents1 =
@@ -582,6 +603,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_NormalCase_NameMismatch) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id1));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
// First client, creates worker.
@@ -657,6 +680,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_PendingCase) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
// The second renderer host.
std::unique_ptr<TestWebContents> web_contents1 =
@@ -668,6 +693,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_PendingCase) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id1));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
// First client and second client are created before the worker starts.
@@ -734,6 +761,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_PendingCase_URLMismatch) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), renderer_host0->GetID()));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
// The second renderer host.
std::unique_ptr<TestWebContents> web_contents1 =
@@ -744,6 +773,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_PendingCase_URLMismatch) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), renderer_host1->GetID()));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
// First client and second client are created before the workers start.
@@ -824,6 +855,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_PendingCase_NameMismatch) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
// The second renderer host.
std::unique_ptr<TestWebContents> web_contents1 =
@@ -835,6 +868,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerTest_PendingCase_NameMismatch) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id1));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
// First client and second client are created before the workers start.
@@ -915,6 +950,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerRaceTest) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
std::unique_ptr<TestWebContents> web_contents1 =
CreateWebContents(GURL("http://example.com/"));
@@ -925,6 +962,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerRaceTest) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id1));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
std::unique_ptr<TestWebContents> web_contents2 =
CreateWebContents(GURL("http://example.com/"));
@@ -935,6 +974,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerRaceTest) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id2));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host2->OverrideURLLoaderFactory(url_loader_factory_.get());
MockSharedWorkerClient client0;
MessagePortChannel local_port0;
@@ -1027,6 +1068,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerRaceTest2) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
std::unique_ptr<TestWebContents> web_contents1 =
CreateWebContents(GURL("http://example.com/"));
@@ -1037,6 +1080,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerRaceTest2) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id1));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
std::unique_ptr<TestWebContents> web_contents2 =
CreateWebContents(GURL("http://example.com/"));
@@ -1047,6 +1092,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerRaceTest2) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id2));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host2->OverrideURLLoaderFactory(url_loader_factory_.get());
MockSharedWorkerClient client0;
MessagePortChannel local_port0;
@@ -1123,6 +1170,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerRaceTest3) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id0));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host0->OverrideURLLoaderFactory(url_loader_factory_.get());
// The second renderer host.
std::unique_ptr<TestWebContents> web_contents1 =
@@ -1134,6 +1183,8 @@ TEST_F(SharedWorkerServiceImplTest, CreateWorkerRaceTest3) {
blink::mojom::SharedWorkerFactory::Name_,
base::BindRepeating(&SharedWorkerServiceImplTest::BindSharedWorkerFactory,
base::Unretained(this), process_id1));
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+ renderer_host1->OverrideURLLoaderFactory(url_loader_factory_.get());
// Both clients try to connect/create a worker.
diff --git a/chromium/content/browser/worker_host/worker_browsertest.cc b/chromium/content/browser/worker_host/worker_browsertest.cc
index 0ebffbf24c5..d021ad2ebb4 100644
--- a/chromium/content/browser/worker_host/worker_browsertest.cc
+++ b/chromium/content/browser/worker_host/worker_browsertest.cc
@@ -36,6 +36,7 @@
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
#include "net/test/test_data_directory.h"
+#include "services/network/public/cpp/features.h"
#include "url/gurl.h"
namespace content {
@@ -276,7 +277,12 @@ IN_PROC_BROWSER_TEST_F(WorkerTest,
// Tests the value of |request_initiator| for shared worker resources.
IN_PROC_BROWSER_TEST_F(WorkerTest, VerifyInitiatorSharedWorker) {
- if (!SupportsSharedWorker())
+ // TODO(cammie): Remove the condition that network service must be
+ // enabled once it is enabled on all platforms?
+ // The main body of the test won't currently work unless network service
+ // is enabled (e.g. not on cast-shell-linux as of 2019/04).
+ if (!SupportsSharedWorker() ||
+ !base::FeatureList::IsEnabled(network::features::kNetworkService))
return;
const GURL start_url(embedded_test_server()->GetURL("/frame_tree/top.html"));
diff --git a/chromium/content/browser/worker_host/worker_script_fetch_initiator.cc b/chromium/content/browser/worker_host/worker_script_fetch_initiator.cc
index f5602a49c09..48d74986947 100644
--- a/chromium/content/browser/worker_host/worker_script_fetch_initiator.cc
+++ b/chromium/content/browser/worker_host/worker_script_fetch_initiator.cc
@@ -37,6 +37,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
#include "content/public/browser/resource_context.h"
#include "content/public/browser/shared_cors_origin_access_list.h"
#include "content/public/common/content_features.h"
@@ -90,7 +91,6 @@ void WorkerScriptFetchInitiator::Start(
const std::string& storage_domain,
CompletionCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
DCHECK(storage_partition);
DCHECK(resource_type == ResourceType::kWorker ||
resource_type == ResourceType::kSharedWorker)
@@ -124,67 +124,70 @@ void WorkerScriptFetchInitiator::Start(
worker_process_id, storage_partition, storage_domain,
constructor_uses_file_url, filesystem_url_support);
+ // NetworkService (PlzWorker):
// Create a resource request for initiating worker script fetch from the
// browser process.
std::unique_ptr<network::ResourceRequest> resource_request;
-
- // Determine the referrer for the worker script request based on the spec.
- // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer
- Referrer sanitized_referrer = Referrer::SanitizeForRequest(
- script_url,
- Referrer(outside_fetch_client_settings_object->outgoing_referrer,
- outside_fetch_client_settings_object->referrer_policy));
-
- resource_request = std::make_unique<network::ResourceRequest>();
- resource_request->url = script_url;
- resource_request->site_for_cookies = script_url;
- resource_request->request_initiator = request_initiator;
- resource_request->referrer = sanitized_referrer.url,
- resource_request->referrer_policy = Referrer::ReferrerPolicyForUrlRequest(
- outside_fetch_client_settings_object->referrer_policy);
- resource_request->resource_type = static_cast<int>(resource_type);
-
- // For a classic worker script request:
- // https://html.spec.whatwg.org/C/#fetch-a-classic-worker-script
- // Step 1: "Let request be a new request whose ..., mode is "same-origin",
- // ..."
- //
- // For a module worker script request:
- // https://html.spec.whatwg.org/C/#fetch-a-single-module-script
- // Step 6: "If destination is "worker" or "sharedworker" and the top-level
- // module fetch flag is set, then set request's mode to "same-origin"."
- resource_request->mode = network::mojom::RequestMode::kSameOrigin;
-
- // When the credentials mode is "omit", clear |allow_credentials| and set
- // load flags to disable sending credentials according to the comments in
- // CorsURLLoaderFactory::IsSane().
- // TODO(https://crbug.com/799935): Unify |LOAD_DO_NOT_*| into
- // |allow_credentials|.
- resource_request->credentials_mode = credentials_mode;
- if (credentials_mode == network::mojom::CredentialsMode::kOmit) {
- resource_request->allow_credentials = false;
- const auto load_flags_pattern = net::LOAD_DO_NOT_SAVE_COOKIES |
- net::LOAD_DO_NOT_SEND_COOKIES |
- net::LOAD_DO_NOT_SEND_AUTH_DATA;
- resource_request->load_flags |= load_flags_pattern;
- }
-
- switch (resource_type) {
- case ResourceType::kWorker:
- resource_request->fetch_request_context_type =
- static_cast<int>(blink::mojom::RequestContextType::WORKER);
- break;
- case ResourceType::kSharedWorker:
- resource_request->fetch_request_context_type =
- static_cast<int>(blink::mojom::RequestContextType::SHARED_WORKER);
- break;
- default:
- NOTREACHED() << static_cast<int>(resource_type);
- break;
+ if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ // Determine the referrer for the worker script request based on the spec.
+ // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer
+ Referrer sanitized_referrer = Referrer::SanitizeForRequest(
+ script_url,
+ Referrer(outside_fetch_client_settings_object->outgoing_referrer,
+ outside_fetch_client_settings_object->referrer_policy));
+
+
+ resource_request = std::make_unique<network::ResourceRequest>();
+ resource_request->url = script_url;
+ resource_request->site_for_cookies = script_url;
+ resource_request->request_initiator = request_initiator;
+ resource_request->referrer = sanitized_referrer.url,
+ resource_request->referrer_policy = Referrer::ReferrerPolicyForUrlRequest(
+ outside_fetch_client_settings_object->referrer_policy);
+ resource_request->resource_type = static_cast<int>(resource_type);
+
+ // For a classic worker script request:
+ // https://html.spec.whatwg.org/C/#fetch-a-classic-worker-script
+ // Step 1: "Let request be a new request whose ..., mode is "same-origin",
+ // ..."
+ //
+ // For a module worker script request:
+ // https://html.spec.whatwg.org/C/#fetch-a-single-module-script
+ // Step 6: "If destination is "worker" or "sharedworker" and the top-level
+ // module fetch flag is set, then set request's mode to "same-origin"."
+ resource_request->mode = network::mojom::RequestMode::kSameOrigin;
+
+ // When the credentials mode is "omit", clear |allow_credentials| and set
+ // load flags to disable sending credentials according to the comments in
+ // CorsURLLoaderFactory::IsSane().
+ // TODO(https://crbug.com/799935): Unify |LOAD_DO_NOT_*| into
+ // |allow_credentials|.
+ resource_request->credentials_mode = credentials_mode;
+ if (credentials_mode == network::mojom::CredentialsMode::kOmit) {
+ resource_request->allow_credentials = false;
+ const auto load_flags_pattern = net::LOAD_DO_NOT_SAVE_COOKIES |
+ net::LOAD_DO_NOT_SEND_COOKIES |
+ net::LOAD_DO_NOT_SEND_AUTH_DATA;
+ resource_request->load_flags |= load_flags_pattern;
+ }
+
+ switch (resource_type) {
+ case ResourceType::kWorker:
+ resource_request->fetch_request_context_type =
+ static_cast<int>(blink::mojom::RequestContextType::WORKER);
+ break;
+ case ResourceType::kSharedWorker:
+ resource_request->fetch_request_context_type =
+ static_cast<int>(blink::mojom::RequestContextType::SHARED_WORKER);
+ break;
+ default:
+ NOTREACHED() << static_cast<int>(resource_type);
+ break;
+ }
+
+ AddAdditionalRequestHeaders(resource_request.get(), browser_context);
}
- AddAdditionalRequestHeaders(resource_request.get(), browser_context);
-
// When navigation on UI is enabled, service worker and appcache work on the
// UI thread.
if (NavigationURLLoaderImpl::IsNavigationLoaderOnUIEnabled()) {
@@ -282,6 +285,26 @@ WorkerScriptFetchInitiator::CreateFactoryBundle(
url::kFileScheme, file_factory_ptr.PassInterface());
}
+ // Use RenderProcessHost's network factory as the default factory if
+ // NetworkService is off. If NetworkService is on the default factory is
+ // set in CreateScriptLoaderOnIO().
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ // Using an opaque origin here should be safe - the URLLoaderFactory created
+ // for such origin shouldn't have any special privileges. Additionally, the
+ // origin should not be inspected at all in the legacy, non-NetworkService
+ // path.
+ const url::Origin kSafeOrigin = url::Origin();
+
+ mojo::PendingRemote<network::mojom::URLLoaderFactory>
+ pending_default_factory;
+ // TODO(crbug.com/955476): Populate the network isolation key.
+ RenderProcessHost::FromID(worker_process_id)
+ ->CreateURLLoaderFactory(
+ kSafeOrigin, nullptr /* preferences */, net::NetworkIsolationKey(),
+ nullptr /* header_client */, pending_default_factory.InitWithNewPipeAndPassReceiver());
+ factory_bundle->pending_default_factory() = std::move(pending_default_factory);
+ }
+
return factory_bundle;
}
@@ -291,6 +314,7 @@ void WorkerScriptFetchInitiator::AddAdditionalRequestHeaders(
network::ResourceRequest* resource_request,
BrowserContext* browser_context) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
// TODO(nhiroki): Return early when the request is neither HTTP nor HTTPS
// (i.e., Blob URL or Data URL). This should be checked by
@@ -326,6 +350,7 @@ void WorkerScriptFetchInitiator::CreateScriptLoaderOnUI(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_override,
CompletionCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
// Create the URL loader factory for WorkerScriptLoaderFactory to use to load
// the main script.
@@ -390,7 +415,7 @@ void WorkerScriptFetchInitiator::CreateScriptLoaderOnUI(
std::move(url_loader_factory)),
std::move(throttles), std::move(resource_request),
base::BindOnce(WorkerScriptFetchInitiator::DidCreateScriptLoader,
- std::move(callback),
+ std::move(callback), nullptr /* main_script_loader_factory */,
std::move(subresource_loader_factories)));
}
@@ -415,20 +440,22 @@ void WorkerScriptFetchInitiator::CreateScriptLoaderOnIO(
DCHECK(resource_context);
DCHECK(service_worker_handle_core);
- auto resource_type =
- static_cast<ResourceType>(resource_request->resource_type);
- auto provider_type = blink::mojom::ServiceWorkerProviderType::kUnknown;
- switch (resource_type) {
- case ResourceType::kWorker:
- provider_type =
- blink::mojom::ServiceWorkerProviderType::kForDedicatedWorker;
- break;
- case ResourceType::kSharedWorker:
- provider_type = blink::mojom::ServiceWorkerProviderType::kForSharedWorker;
- break;
- default:
- NOTREACHED() << resource_request->resource_type;
- break;
+ if (resource_request) {
+ auto resource_type =
+ static_cast<ResourceType>(resource_request->resource_type);
+ auto provider_type = blink::mojom::ServiceWorkerProviderType::kUnknown;
+ switch (resource_type) {
+ case ResourceType::kWorker:
+ provider_type =
+ blink::mojom::ServiceWorkerProviderType::kForDedicatedWorker;
+ break;
+ case ResourceType::kSharedWorker:
+ provider_type = blink::mojom::ServiceWorkerProviderType::kForSharedWorker;
+ break;
+ default:
+ NOTREACHED() << resource_request->resource_type;
+ break;
+ }
}
// Create the URL loader factory for WorkerScriptLoaderFactory to use to load
@@ -445,18 +472,20 @@ void WorkerScriptFetchInitiator::CreateScriptLoaderOnIO(
std::move(url_loader_factory_override_info));
} else {
// Add the default factory to the bundle for browser.
- DCHECK(factory_bundle_for_browser_info);
-
- // Get the direct network factory from |loader_factory_getter|. This doesn't
- // support reconnection to the network service after a crash, but it's OK
- // since it's used only for a single request to fetch the worker's main
- // script during startup. If the network service crashes, worker startup
- // should simply fail.
- network::mojom::URLLoaderFactoryPtr network_factory_ptr;
- loader_factory_getter->CloneNetworkFactory(
- mojo::MakeRequest(&network_factory_ptr));
- factory_bundle_for_browser_info->pending_default_factory() =
- network_factory_ptr.PassInterface();
+ if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ DCHECK(factory_bundle_for_browser_info);
+
+ // Get the direct network factory from |loader_factory_getter|. This doesn't
+ // support reconnection to the network service after a crash, but it's OK
+ // since it's used only for a single request to fetch the worker's main
+ // script during startup. If the network service crashes, worker startup
+ // should simply fail.
+ network::mojom::URLLoaderFactoryPtr network_factory_ptr;
+ loader_factory_getter->CloneNetworkFactory(
+ mojo::MakeRequest(&network_factory_ptr));
+ factory_bundle_for_browser_info->pending_default_factory() =
+ network_factory_ptr.PassInterface();
+ }
url_loader_factory = base::MakeRefCounted<blink::URLLoaderFactoryBundle>(
std::move(factory_bundle_for_browser_info));
}
@@ -476,34 +505,56 @@ void WorkerScriptFetchInitiator::CreateScriptLoaderOnIO(
&ServiceWorkerContextWrapper::resource_context, service_worker_context);
// Start loading a web worker main script.
- // TODO(nhiroki): Figure out what we should do in |wc_getter| for loading web
- // worker's main script. Returning the WebContents of the closest ancestor's
- // frame is a possible option, but it doesn't work when a shared worker
- // creates a dedicated worker after the closest ancestor's frame is gone. The
- // frame tree node ID has the same issue.
- base::RepeatingCallback<WebContents*()> wc_getter =
- base::BindRepeating([]() -> WebContents* { return nullptr; });
- std::vector<std::unique_ptr<URLLoaderThrottle>> throttles =
- GetContentClient()->browser()->CreateURLLoaderThrottlesOnIO(
- *resource_request, resource_context, wc_getter,
- nullptr /* navigation_ui_data */,
- RenderFrameHost::kNoFrameTreeNodeId);
+ if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ // TODO(nhiroki): Figure out what we should do in |wc_getter| for loading web
+ // worker's main script. Returning the WebContents of the closest ancestor's
+ // frame is a possible option, but it doesn't work when a shared worker
+ // creates a dedicated worker after the closest ancestor's frame is gone. The
+ // frame tree node ID has the same issue.
+ base::RepeatingCallback<WebContents*()> wc_getter =
+ base::BindRepeating([]() -> WebContents* { return nullptr; });
+ std::vector<std::unique_ptr<URLLoaderThrottle>> throttles =
+ GetContentClient()->browser()->CreateURLLoaderThrottlesOnIO(
+ *resource_request, resource_context, wc_getter,
+ nullptr /* navigation_ui_data */,
+ RenderFrameHost::kNoFrameTreeNodeId);
+
+ WorkerScriptFetcher::CreateAndStart(
+ std::make_unique<WorkerScriptLoaderFactory>(
+ worker_process_id,
+ /*service_worker_handle=*/nullptr, service_worker_handle_core,
+ std::move(appcache_host),
+ base::RepeatingCallback<BrowserContext*(void)>(),
+ resource_context_getter, std::move(url_loader_factory)),
+ std::move(throttles), std::move(resource_request),
+ base::BindOnce(WorkerScriptFetchInitiator::DidCreateScriptLoader,
+ std::move(callback), nullptr,
+ std::move(subresource_loader_factories)));
+ return;
+ }
- WorkerScriptFetcher::CreateAndStart(
+ // Create the WorkerScriptLoaderFactory.
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory;
+ mojo::MakeStrongBinding(
std::make_unique<WorkerScriptLoaderFactory>(
worker_process_id,
/*service_worker_handle=*/nullptr, service_worker_handle_core,
std::move(appcache_host),
base::RepeatingCallback<BrowserContext*(void)>(),
resource_context_getter, std::move(url_loader_factory)),
- std::move(throttles), std::move(resource_request),
- base::BindOnce(WorkerScriptFetchInitiator::DidCreateScriptLoader,
- std::move(callback),
- std::move(subresource_loader_factories)));
+ mojo::MakeRequest(&main_script_loader_factory));
+
+ DidCreateScriptLoader(std::move(callback),
+ std::move(main_script_loader_factory),
+ std::move(subresource_loader_factories),
+ nullptr /* main_script_load_params */,
+ base::nullopt /* subresource_loader_params */,
+ true /* success */);
}
void WorkerScriptFetchInitiator::DidCreateScriptLoader(
CompletionCallback callback,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
@@ -512,18 +563,25 @@ void WorkerScriptFetchInitiator::DidCreateScriptLoader(
// This can be the UI thread or IO thread.
DCHECK_CURRENTLY_ON(GetLoaderThreadID());
+ // NetworkService (PlzWorker):
// If a URLLoaderFactory for AppCache is supplied, use that.
if (subresource_loader_params &&
subresource_loader_params->pending_appcache_loader_factory) {
+ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
subresource_loader_factories->pending_appcache_factory() =
std::move(subresource_loader_params->pending_appcache_loader_factory);
}
- // Prepare the controller service worker info to pass to the renderer.
+ // NetworkService (PlzWorker):
+ // Prepare the controller service worker info to pass to the renderer. This is
+ // only provided if NetworkService is enabled. In the non-NetworkService case,
+ // the controller is sent in SetController IPCs during the request for the web
+ // worker script.
blink::mojom::ControllerServiceWorkerInfoPtr controller;
base::WeakPtr<ServiceWorkerObjectHost> controller_service_worker_object_host;
if (subresource_loader_params &&
subresource_loader_params->controller_service_worker_info) {
+ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
controller =
std::move(subresource_loader_params->controller_service_worker_info);
controller_service_worker_object_host =
@@ -533,7 +591,9 @@ void WorkerScriptFetchInitiator::DidCreateScriptLoader(
RunOrPostTask(
FROM_HERE, BrowserThread::UI,
base::BindOnce(
- std::move(callback), std::move(subresource_loader_factories),
+ std::move(callback),
+ std::move(main_script_loader_factory),
+ std::move(subresource_loader_factories),
std::move(main_script_load_params), std::move(controller),
std::move(controller_service_worker_object_host), success));
}
diff --git a/chromium/content/browser/worker_host/worker_script_fetch_initiator.h b/chromium/content/browser/worker_host/worker_script_fetch_initiator.h
index 5142cb3d066..85a900a7c27 100644
--- a/chromium/content/browser/worker_host/worker_script_fetch_initiator.h
+++ b/chromium/content/browser/worker_host/worker_script_fetch_initiator.h
@@ -52,6 +52,7 @@ struct SubresourceLoaderParams;
class WorkerScriptFetchInitiator {
public:
using CompletionCallback = base::OnceCallback<void(
+ network::mojom::URLLoaderFactoryPtr,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>,
blink::mojom::WorkerMainScriptLoadParamsPtr,
blink::mojom::ControllerServiceWorkerInfoPtr,
@@ -135,6 +136,7 @@ class WorkerScriptFetchInitiator {
static void DidCreateScriptLoader(
CompletionCallback callback,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
diff --git a/chromium/content/browser/worker_host/worker_script_loader_factory.cc b/chromium/content/browser/worker_host/worker_script_loader_factory.cc
index c72ef924057..49472c875f0 100644
--- a/chromium/content/browser/worker_host/worker_script_loader_factory.cc
+++ b/chromium/content/browser/worker_host/worker_script_loader_factory.cc
@@ -36,7 +36,6 @@ WorkerScriptLoaderFactory::WorkerScriptLoaderFactory(
resource_context_getter_(resource_context_getter),
loader_factory_(std::move(loader_factory)) {
DCHECK_CURRENTLY_ON(WorkerScriptFetchInitiator::GetLoaderThreadID());
- DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
if (service_worker_handle) {
service_worker_handle_ = service_worker_handle->AsWeakPtr();
@@ -59,6 +58,28 @@ void WorkerScriptLoaderFactory::CreateLoaderAndStart(
network::mojom::URLLoaderClientPtr client,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
DCHECK_CURRENTLY_ON(WorkerScriptFetchInitiator::GetLoaderThreadID());
+
+ // When NetworkService is not enabled, this function is called from the
+ // renderer process, so use ReportBadMessage() instead of DCHECK().
+ if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ // Handle only the main script. Import scripts (ResourceType::kScript)
+ // should go to the network loader or controller.
+ if (resource_request.resource_type !=
+ static_cast<int>(ResourceType::kWorker) &&
+ resource_request.resource_type !=
+ static_cast<int>(ResourceType::kSharedWorker)) {
+ mojo::ReportBadMessage(
+ "WorkerScriptLoaderFactory should only get requests for worker "
+ "scripts");
+ return;
+ }
+ if (script_loader_) {
+ mojo::ReportBadMessage(
+ "WorkerScriptLoaderFactory should be used only one time");
+ return;
+ }
+ }
+
DCHECK(resource_request.resource_type ==
static_cast<int>(ResourceType::kWorker) ||
resource_request.resource_type ==
diff --git a/chromium/content/renderer/worker/embedded_shared_worker_stub.cc b/chromium/content/renderer/worker/embedded_shared_worker_stub.cc
index f2c31602a45..0136d9ae959 100644
--- a/chromium/content/renderer/worker/embedded_shared_worker_stub.cc
+++ b/chromium/content/renderer/worker/embedded_shared_worker_stub.cc
@@ -53,6 +53,7 @@ EmbeddedSharedWorkerStub::EmbeddedSharedWorkerStub(
blink::mojom::ServiceWorkerProviderInfoForClientPtr
service_worker_provider_info,
const base::UnguessableToken& appcache_host_id,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factory_bundle_info,
@@ -66,8 +67,11 @@ EmbeddedSharedWorkerStub::EmbeddedSharedWorkerStub(
url_(info->url),
renderer_preferences_(renderer_preferences),
preference_watcher_request_(std::move(preference_watcher_request)) {
- DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
DCHECK(subresource_loader_factory_bundle_info);
+ // The ID of the precreated AppCacheHost can be valid only when the
+ // NetworkService is enabled.
+ DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService) ||
+ appcache_host_id.is_empty());
if (main_script_load_params) {
response_override_ =
@@ -91,6 +95,7 @@ EmbeddedSharedWorkerStub::EmbeddedSharedWorkerStub(
}
service_worker_provider_info_ = std::move(service_worker_provider_info);
+ main_script_loader_factory_ = std::move(main_script_loader_factory);
controller_info_ = std::move(controller_info);
// If the network service crashes, then self-destruct so clients don't get
@@ -168,20 +173,35 @@ void EmbeddedSharedWorkerStub::WorkerContextDestroyed() {
std::unique_ptr<blink::WebServiceWorkerNetworkProvider>
EmbeddedSharedWorkerStub::CreateServiceWorkerNetworkProvider() {
if (blink::features::IsOffMainThreadSharedWorkerScriptFetchEnabled()) {
- // Off-the-main-thread shared worker script fetch:
+ // PlzSharedWorker w/ off-the-main-thread shared worker script fetch:
// |response_override_| will be passed to WebWorkerFetchContextImpl in
// CreateWorkerFetchContext() and consumed during off-the-main-thread
// shared worker script fetch.
+ DCHECK(response_override_);
return ServiceWorkerNetworkProviderForSharedWorker::Create(
- std::move(service_worker_provider_info_), std::move(controller_info_),
+ std::move(service_worker_provider_info_),
+ std::move(main_script_loader_factory_), std::move(controller_info_),
subresource_loader_factory_bundle_, IsOriginSecure(url_),
nullptr /* response_override */);
}
- // |response_override_| is passed to DocumentLoader and consumed during
- // on-the-main-thread shared worker script fetch.
+#if DCHECK_IS_ON()
+ if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+ // PlzSharedWorker:
+ // |response_override_| is passed to DocumentLoader and consumed during
+ // on-the-main-thread shared worker script fetch.
+ DCHECK(response_override_);
+ } else {
+ // Legacy loading path:
+ // This path will be removed once PlzSharedWorker and off-the-main-thread
+ // shared worker script fetch are enabled by default.
+ DCHECK(!response_override_);
+ }
+#endif // DCHECK_IS_ON()
+
return ServiceWorkerNetworkProviderForSharedWorker::Create(
- std::move(service_worker_provider_info_), std::move(controller_info_),
+ std::move(service_worker_provider_info_),
+ std::move(main_script_loader_factory_), std::move(controller_info_),
subresource_loader_factory_bundle_, IsOriginSecure(url_),
std::move(response_override_));
}
@@ -193,7 +213,10 @@ void EmbeddedSharedWorkerStub::WaitForServiceWorkerControllerInfo(
static_cast<ServiceWorkerNetworkProviderForSharedWorker*>(
web_network_provider)
->context();
- context->PingContainerHost(std::move(callback));
+ if (context)
+ context->PingContainerHost(std::move(callback));
+ else
+ std::move(callback).Run();
}
scoped_refptr<blink::WebWorkerFetchContext>
diff --git a/chromium/content/renderer/worker/embedded_shared_worker_stub.h b/chromium/content/renderer/worker/embedded_shared_worker_stub.h
index c4d4a615dae..4b41a7c3d99 100644
--- a/chromium/content/renderer/worker/embedded_shared_worker_stub.h
+++ b/chromium/content/renderer/worker/embedded_shared_worker_stub.h
@@ -63,6 +63,7 @@ class EmbeddedSharedWorkerStub : public blink::WebSharedWorkerClient,
blink::mojom::ServiceWorkerProviderInfoForClientPtr
service_worker_provider_info,
const base::UnguessableToken& appcache_host_id,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factory_bundle_info,
@@ -119,13 +120,18 @@ class EmbeddedSharedWorkerStub : public blink::WebSharedWorkerClient,
blink::mojom::ServiceWorkerProviderInfoForClientPtr
service_worker_provider_info_;
+ // NetworkService: The URLLoaderFactory used for loading the shared worker
+ // main script.
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory_;
+
+ // NetworkService:
blink::mojom::ControllerServiceWorkerInfoPtr controller_info_;
// The factory bundle used for loading subresources for this shared worker.
scoped_refptr<ChildURLLoaderFactoryBundle> subresource_loader_factory_bundle_;
- // The response override parameters used for taking a resource pre-requested
- // by the browser process.
+ // NetworkService (PlzWorker): The response override parameters used for
+ // taking a resource pre-requested by the browser process.
std::unique_ptr<NavigationResponseOverrideParameters> response_override_;
// Out-of-process NetworkService:
diff --git a/chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.cc b/chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.cc
index 0984b8164f1..1f53830a86a 100644
--- a/chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.cc
+++ b/chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.cc
@@ -10,8 +10,11 @@
#include "content/public/common/origin_util.h"
#include "content/renderer/loader/navigation_response_override_parameters.h"
#include "content/renderer/loader/request_extra_data.h"
+#include "content/renderer/loader/web_url_loader_impl.h"
+#include "content/renderer/render_thread_impl.h"
#include "content/renderer/service_worker/service_worker_provider_context.h"
#include "services/network/public/cpp/features.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
@@ -20,6 +23,7 @@ namespace content {
std::unique_ptr<ServiceWorkerNetworkProviderForSharedWorker>
ServiceWorkerNetworkProviderForSharedWorker::Create(
blink::mojom::ServiceWorkerProviderInfoForClientPtr info,
+ network::mojom::URLLoaderFactoryPtr script_loader_factory,
blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory,
bool is_secure_context,
@@ -33,6 +37,9 @@ ServiceWorkerNetworkProviderForSharedWorker::Create(
std::move(info->client_request), std::move(info->host_ptr_info),
std::move(controller_info), std::move(fallback_loader_factory));
}
+ if (script_loader_factory)
+ provider->script_loader_factory_ = std::move(script_loader_factory);
+
return provider;
}
@@ -68,6 +75,22 @@ ServiceWorkerNetworkProviderForSharedWorker::CreateURLLoader(
return nullptr;
}
+ // If the |script_loader_factory_| exists, use it.
+ if (script_loader_factory_) {
+ RenderThreadImpl* render_thread = RenderThreadImpl::current();
+ if (!render_thread) {
+ // RenderThreadImpl is nullptr in some tests.
+ return nullptr;
+ }
+
+ // TODO(crbug.com/796425): Temporarily wrap the raw
+ // mojom::URLLoaderFactory pointer into SharedURLLoaderFactory.
+ return std::make_unique<WebURLLoaderImpl>(
+ render_thread->resource_dispatcher(), std::move(task_runner_handle),
+ base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+ script_loader_factory_.get()));
+ }
+
// Otherwise go to default resource loading.
return nullptr;
}
diff --git a/chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.h b/chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.h
index c98f6ceb357..0bce68b3e92 100644
--- a/chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.h
+++ b/chromium/content/renderer/worker/service_worker_network_provider_for_shared_worker.h
@@ -28,6 +28,8 @@ class ServiceWorkerNetworkProviderForSharedWorker final
public:
// Creates a new instance.
// - |info|: provider info from the browser
+ // - |script_loader_factory|: the factory for loading the worker's
+ // scripts
// - |controller_info|: info about controller service worker
// - |fallback_loader_factory|: the factory to use when a service worker falls
// back to network (unlike the default factory of this renderer, it skips
@@ -36,6 +38,7 @@ class ServiceWorkerNetworkProviderForSharedWorker final
// - |response_override|: the main script response
static std::unique_ptr<ServiceWorkerNetworkProviderForSharedWorker> Create(
blink::mojom::ServiceWorkerProviderInfoForClientPtr info,
+ network::mojom::URLLoaderFactoryPtr script_loader_factory,
blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory,
bool is_secure_context,
@@ -66,6 +69,9 @@ class ServiceWorkerNetworkProviderForSharedWorker final
// |context_| is null if |this| is an invalid instance, in which case there is
// no connection to the browser process.
scoped_refptr<ServiceWorkerProviderContext> context_;
+
+ // The URL loader factory for loading the worker's scripts.
+ network::mojom::URLLoaderFactoryPtr script_loader_factory_;
};
} // namespace content
diff --git a/chromium/content/renderer/worker/shared_worker_factory_impl.cc b/chromium/content/renderer/worker/shared_worker_factory_impl.cc
index 0fd5d46ac86..fbf3aeaaa8c 100644
--- a/chromium/content/renderer/worker/shared_worker_factory_impl.cc
+++ b/chromium/content/renderer/worker/shared_worker_factory_impl.cc
@@ -31,6 +31,7 @@ void SharedWorkerFactoryImpl::CreateSharedWorker(
blink::mojom::ServiceWorkerProviderInfoForClientPtr
service_worker_provider_info,
const base::Optional<base::UnguessableToken>& appcache_host_id,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
@@ -44,7 +45,7 @@ void SharedWorkerFactoryImpl::CreateSharedWorker(
*renderer_preferences, std::move(preference_watcher_request),
std::move(content_settings), std::move(service_worker_provider_info),
appcache_host_id.value_or(base::UnguessableToken()),
- std::move(main_script_load_params),
+ std::move(main_script_loader_factory), std::move(main_script_load_params),
std::move(subresource_loader_factories), std::move(controller_info),
std::move(host), std::move(request), std::move(interface_provider));
}
diff --git a/chromium/content/renderer/worker/shared_worker_factory_impl.h b/chromium/content/renderer/worker/shared_worker_factory_impl.h
index 42036a1cf92..5a1c84b80ff 100644
--- a/chromium/content/renderer/worker/shared_worker_factory_impl.h
+++ b/chromium/content/renderer/worker/shared_worker_factory_impl.h
@@ -6,6 +6,7 @@
#define CONTENT_RENDERER_WORKER_SHARED_WORKER_FACTORY_IMPL_H_
#include "base/macros.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
#include "third_party/blink/public/mojom/worker/shared_worker_factory.mojom.h"
@@ -33,6 +34,7 @@ class SharedWorkerFactoryImpl : public blink::mojom::SharedWorkerFactory {
blink::mojom::ServiceWorkerProviderInfoForClientPtr
service_worker_provider_info,
const base::Optional<base::UnguessableToken>& appcache_host_id,
+ network::mojom::URLLoaderFactoryPtr main_script_loader_factory,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factories,
diff --git a/chromium/third_party/blink/common/features.cc b/chromium/third_party/blink/common/features.cc
index 91eec38eb8e..634ec75d04c 100644
--- a/chromium/third_party/blink/common/features.cc
+++ b/chromium/third_party/blink/common/features.cc
@@ -118,12 +118,12 @@ const base::Feature kOffMainThreadDedicatedWorkerScriptFetch{
// Enable off-the-main-thread service worker script fetch.
// (https://crbug.com/924043)
const base::Feature kOffMainThreadServiceWorkerScriptFetch{
- "OffMainThreadServiceWorkerScriptFetch", base::FEATURE_ENABLED_BY_DEFAULT};
+ "OffMainThreadServiceWorkerScriptFetch", base::FEATURE_DISABLED_BY_DEFAULT};
// Enable off-the-main-thread shared worker script fetch.
// (https://crbug.com/924041)
const base::Feature kOffMainThreadSharedWorkerScriptFetch{
- "OffMainThreadSharedWorkerScriptFetch", base::FEATURE_ENABLED_BY_DEFAULT};
+ "OffMainThreadSharedWorkerScriptFetch", base::FEATURE_DISABLED_BY_DEFAULT};
// Enable browser-initiated dedicated worker script loading
// (PlzDedicatedWorker). https://crbug.com/906991
diff --git a/chromium/third_party/blink/public/mojom/worker/shared_worker_factory.mojom b/chromium/third_party/blink/public/mojom/worker/shared_worker_factory.mojom
index c05ed087b05..e119d0f3288 100644
--- a/chromium/third_party/blink/public/mojom/worker/shared_worker_factory.mojom
+++ b/chromium/third_party/blink/public/mojom/worker/shared_worker_factory.mojom
@@ -5,6 +5,7 @@
module blink.mojom;
import "mojo/public/mojom/base/unguessable_token.mojom";
+import "services/network/public/mojom/url_loader_factory.mojom";
import "services/service_manager/public/mojom/interface_provider.mojom";
import "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom";
import "third_party/blink/public/mojom/renderer_preference_watcher.mojom";
@@ -46,21 +47,40 @@ interface SharedWorkerFactory {
// not http(s) or another service worker supported scheme.
ServiceWorkerProviderInfoForClient? service_worker_provider_info,
+ // NetworkService:
// The ID of the AppCacheHost in the browser process that serves resources
// for this shared worker. This is not specified when AppCache doesn't
// serve resources for this shared worker.
mojo_base.mojom.UnguessableToken? appcache_host_id,
+ // Non-NetworkService:
+ // The URLLoaderFactory to use to request the shared worker's script
+ // (just the main script resource; importScripts() should go through the
+ // usual loader or the controller service worker if appropriate).
+ //
+ // This is only non-null when NetworkService is disabled.
+ network.mojom.URLLoaderFactory? main_script_loader_factory,
+
+ // NetworkService (PlzWorker):
// Used for passing the main script pre-requested by the browser process
// and its redirect information.
- WorkerMainScriptLoadParams main_script_load_params,
+ WorkerMainScriptLoadParams? main_script_load_params,
- // Used for loading subresources. This also supports non-network URLs like
- // chrome-extension:// URLs.
- URLLoaderFactoryBundle subresource_loader_factories,
+ // NetworkService:
+ // When the Network Service is enabled, |subresource_loader_factories|
+ // may also be provided a means for the shared worker to load
+ // subresources where applicable. For example, this allows the shared
+ // worker to load chrome-extension:// URLs which the renderer's default
+ // loader factory can't load.
+ URLLoaderFactoryBundle? subresource_loader_factories,
+ // NetworkService (PlzWorker):
// Used to make fetches from the worker go through the controller service
- // worker. This is null when there're no controller service worker.
+ // worker. This is null when
+ // NetworkService is disabled or there is no controller service worker.
+ //
+ // In non-NetworkService, the controller is sent via
+ // ServiceWorkerContainer.SetController().
ControllerServiceWorkerInfo? controller_info,
SharedWorkerHost host,