Commit 5c7645a6 authored by Makoto Shimazu's avatar Makoto Shimazu Committed by Commit Bot

ServiceWorker understands COEP header if it's installed or being updated

This CL plumbs the COEP value to the URLLoaderFactory going to the
NetworkService. However, COEP doesn't take effect if it's being
registered.

Bug: 1039613
Change-Id: Id6ca28b686db82b3479becc1e927c8d7ff2e2c34
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2065696
Auto-Submit: Makoto Shimazu <shimazu@chromium.org>
Commit-Queue: Peter Marshall <petermarshall@chromium.org>
Reviewed-by: default avatarPeter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#744657}
parent 76d24e31
...@@ -205,11 +205,15 @@ void ServiceWorkerDevToolsAgentHost::UpdateLoaderFactories( ...@@ -205,11 +205,15 @@ void ServiceWorkerDevToolsAgentHost::UpdateLoaderFactories(
return; return;
} }
const url::Origin origin = url::Origin::Create(url_); const url::Origin origin = url::Origin::Create(url_);
// TODO(https://crbug.com/1039613): Get the COEP value for the service worker
// and pass it to each factory bundle.
auto script_bundle = EmbeddedWorkerInstance::CreateFactoryBundleOnUI( auto script_bundle = EmbeddedWorkerInstance::CreateFactoryBundleOnUI(
rph, worker_route_id_, origin, rph, worker_route_id_, origin,
network::mojom::CrossOriginEmbedderPolicyValue::kNone,
ContentBrowserClient::URLLoaderFactoryType::kServiceWorkerScript); ContentBrowserClient::URLLoaderFactoryType::kServiceWorkerScript);
auto subresource_bundle = EmbeddedWorkerInstance::CreateFactoryBundleOnUI( auto subresource_bundle = EmbeddedWorkerInstance::CreateFactoryBundleOnUI(
rph, worker_route_id_, origin, rph, worker_route_id_, origin,
network::mojom::CrossOriginEmbedderPolicyValue::kNone,
ContentBrowserClient::URLLoaderFactoryType::kServiceWorkerSubResource); ContentBrowserClient::URLLoaderFactoryType::kServiceWorkerSubResource);
if (ServiceWorkerContext::IsServiceWorkerOnUIEnabled()) { if (ServiceWorkerContext::IsServiceWorkerOnUIEnabled()) {
......
...@@ -117,12 +117,14 @@ using SetupProcessCallback = base::OnceCallback<void( ...@@ -117,12 +117,14 @@ using SetupProcessCallback = base::OnceCallback<void(
// //
// This also sets up two URLLoaderFactoryBundles, one for // This also sets up two URLLoaderFactoryBundles, one for
// ServiceWorkerScriptLoaderFactory and the other is for passing to the // ServiceWorkerScriptLoaderFactory and the other is for passing to the
// renderer. These bundles include factories for non-network URLs like // renderer. |cross_origin_embedder_policy| is respected to make these bundles.
// chrome-extension:// as needed. // These bundles include factories for non-network URLs like chrome-extension://
// as needed.
void SetupOnUIThread( void SetupOnUIThread(
int embedded_worker_id, int embedded_worker_id,
base::WeakPtr<ServiceWorkerProcessManager> process_manager, base::WeakPtr<ServiceWorkerProcessManager> process_manager,
bool can_use_existing_process, bool can_use_existing_process,
network::mojom::CrossOriginEmbedderPolicyValue cross_origin_embedder_policy,
blink::mojom::EmbeddedWorkerStartParamsPtr params, blink::mojom::EmbeddedWorkerStartParamsPtr params,
mojo::PendingReceiver<blink::mojom::EmbeddedWorkerInstanceClient> receiver, mojo::PendingReceiver<blink::mojom::EmbeddedWorkerInstanceClient> receiver,
ServiceWorkerContextCore* context, ServiceWorkerContextCore* context,
...@@ -229,7 +231,7 @@ void SetupOnUIThread( ...@@ -229,7 +231,7 @@ void SetupOnUIThread(
if (!params->is_installed) { if (!params->is_installed) {
factory_bundle_for_new_scripts = factory_bundle_for_new_scripts =
EmbeddedWorkerInstance::CreateFactoryBundleOnUI( EmbeddedWorkerInstance::CreateFactoryBundleOnUI(
rph, routing_id, origin, rph, routing_id, origin, cross_origin_embedder_policy,
ContentBrowserClient::URLLoaderFactoryType::kServiceWorkerScript); ContentBrowserClient::URLLoaderFactoryType::kServiceWorkerScript);
} }
...@@ -239,7 +241,7 @@ void SetupOnUIThread( ...@@ -239,7 +241,7 @@ void SetupOnUIThread(
// service worker terminates itself when the connection breaks, so a new // service worker terminates itself when the connection breaks, so a new
// instance can be started. // instance can be started.
factory_bundle_for_renderer = EmbeddedWorkerInstance::CreateFactoryBundleOnUI( factory_bundle_for_renderer = EmbeddedWorkerInstance::CreateFactoryBundleOnUI(
rph, routing_id, origin, rph, routing_id, origin, cross_origin_embedder_policy,
ContentBrowserClient::URLLoaderFactoryType::kServiceWorkerSubResource); ContentBrowserClient::URLLoaderFactoryType::kServiceWorkerSubResource);
// TODO(crbug.com/862854): Support changes to // TODO(crbug.com/862854): Support changes to
...@@ -527,6 +529,8 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -527,6 +529,8 @@ class EmbeddedWorkerInstance::StartTask {
} }
void Start(blink::mojom::EmbeddedWorkerStartParamsPtr params, void Start(blink::mojom::EmbeddedWorkerStartParamsPtr params,
network::mojom::CrossOriginEmbedderPolicyValue
cross_origin_embedder_policy,
StatusCallback sent_start_callback) { StatusCallback sent_start_callback) {
DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
DCHECK(instance_->context_); DCHECK(instance_->context_);
...@@ -555,8 +559,9 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -555,8 +559,9 @@ class EmbeddedWorkerInstance::StartTask {
if (ServiceWorkerContext::IsServiceWorkerOnUIEnabled()) { if (ServiceWorkerContext::IsServiceWorkerOnUIEnabled()) {
SetupOnUIThread( SetupOnUIThread(
instance_->embedded_worker_id(), process_manager, instance_->embedded_worker_id(), process_manager,
can_use_existing_process, std::move(params), std::move(receiver_), can_use_existing_process, std::move(cross_origin_embedder_policy),
context.get(), context, base::nullopt, std::move(params), std::move(receiver_), context.get(), context,
base::nullopt,
base::BindOnce(&StartTask::OnSetupCompleted, base::BindOnce(&StartTask::OnSetupCompleted,
weak_factory_.GetWeakPtr(), process_manager)); weak_factory_.GetWeakPtr(), process_manager));
} else { } else {
...@@ -564,7 +569,8 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -564,7 +569,8 @@ class EmbeddedWorkerInstance::StartTask {
FROM_HERE, FROM_HERE,
base::BindOnce( base::BindOnce(
&SetupOnUIThread, instance_->embedded_worker_id(), &SetupOnUIThread, instance_->embedded_worker_id(),
process_manager, can_use_existing_process, std::move(params), process_manager, can_use_existing_process,
std::move(cross_origin_embedder_policy), std::move(params),
std::move(receiver_), context.get(), context, std::move(receiver_), context.get(), context,
base::make_optional<base::Time>(base::Time::Now()), base::make_optional<base::Time>(base::Time::Now()),
base::BindOnce(&StartTask::OnSetupCompleted, base::BindOnce(&StartTask::OnSetupCompleted,
...@@ -730,7 +736,9 @@ void EmbeddedWorkerInstance::Start( ...@@ -730,7 +736,9 @@ void EmbeddedWorkerInstance::Start(
base::BindOnce(&EmbeddedWorkerInstance::Detach, base::Unretained(this))); base::BindOnce(&EmbeddedWorkerInstance::Detach, base::Unretained(this)));
inflight_start_task_.reset( inflight_start_task_.reset(
new StartTask(this, params->script_url, std::move(receiver), start_time)); new StartTask(this, params->script_url, std::move(receiver), start_time));
inflight_start_task_->Start(std::move(params), std::move(callback)); inflight_start_task_->Start(std::move(params),
owner_version_->cross_origin_embedder_policy(),
std::move(callback));
} }
void EmbeddedWorkerInstance::Stop() { void EmbeddedWorkerInstance::Stop() {
...@@ -1029,6 +1037,7 @@ EmbeddedWorkerInstance::CreateFactoryBundleOnUI( ...@@ -1029,6 +1037,7 @@ EmbeddedWorkerInstance::CreateFactoryBundleOnUI(
RenderProcessHost* rph, RenderProcessHost* rph,
int routing_id, int routing_id,
const url::Origin& origin, const url::Origin& origin,
network::mojom::CrossOriginEmbedderPolicyValue cross_origin_embedder_policy,
ContentBrowserClient::URLLoaderFactoryType factory_type) { ContentBrowserClient::URLLoaderFactoryType factory_type) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
auto factory_bundle = auto factory_bundle =
...@@ -1056,7 +1065,12 @@ EmbeddedWorkerInstance::CreateFactoryBundleOnUI( ...@@ -1056,7 +1065,12 @@ EmbeddedWorkerInstance::CreateFactoryBundleOnUI(
devtools_instrumentation::WillCreateURLLoaderFactoryForServiceWorker( devtools_instrumentation::WillCreateURLLoaderFactoryForServiceWorker(
rph, routing_id, &default_factory_receiver); rph, routing_id, &default_factory_receiver);
// TODO(yhirano): Support COEP. factory_params->client_security_state =
network::mojom::ClientSecurityState::New();
// TODO(https://crbug.com/1056122): Plumb other fields to support report only
// mode.
factory_params->client_security_state->cross_origin_embedder_policy.value =
std::move(cross_origin_embedder_policy);
rph->CreateURLLoaderFactory(std::move(default_factory_receiver), rph->CreateURLLoaderFactory(std::move(default_factory_receiver),
std::move(factory_params)); std::move(factory_params));
......
...@@ -226,6 +226,8 @@ class CONTENT_EXPORT EmbeddedWorkerInstance ...@@ -226,6 +226,8 @@ class CONTENT_EXPORT EmbeddedWorkerInstance
RenderProcessHost* rph, RenderProcessHost* rph,
int routing_id, int routing_id,
const url::Origin& origin, const url::Origin& origin,
network::mojom::CrossOriginEmbedderPolicyValue
cross_origin_embedder_policy,
ContentBrowserClient::URLLoaderFactoryType factory_type); ContentBrowserClient::URLLoaderFactoryType factory_type);
private: private:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment