diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-09-24 15:25:25 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-10-02 11:32:01 +0000 |
commit | 5a85b3ecb42ec36336254a0ab6e92604ba4aa9e6 (patch) | |
tree | c208f09a59de708a0539448218945ea079d3ca91 | |
parent | 84e109fd9995b73c29d8e43e1ff84b608479fcf7 (diff) | |
download | qtwebengine-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>
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, |