Commit e2468717 authored by Hiroki Nakagawa's avatar Hiroki Nakagawa Committed by Commit Bot

Worker: Stop passing creator's origin for starting a dedicated worker

This CL makes DedicatedWorkerHostFactoryImpl use its
|parent_execution_origin_| (renamed to |creator_origin| by this CL) for
starting a dedicated worker instead of an origin passed from a renderer
process.

This was not feasible before because |parent_execution_origin_| is
provided from parent's |RenderFrameHostImpl::last_committed_origin_|
that is set during navigation commit. Worker creation IPC from the
renderer to browser could race with navigation commit, and could see the
wrong last committed origin.

Now this is feasible. This is because worker creation IPC is now tied
with RenderFrameHostImpl's BrowserInterfaceBroker that is re-bound
during navigation commit[*]. This ensures that worker creation requests
issued before the navigation commit are discarded by the previous
BrowserInterfaceBroker, and new requests via the new
BrowserInterfaceBroker are scoped to the new last committed origin.

[*] The call path between binding BrowserInterfaceBroker and updating
the last committed origin is as follows. These are synchronously done.

- RenderFrameHostImpl::DidCommitNavigation() re-binds the interface broker
https://source.chromium.org/chromium/chromium/src/+/master:content/browser/frame_host/render_frame_host_impl.cc;l=7489;drc=d54ee0c3d25dfc644282b50c5f57e23b7ab4dda4?originalUrl=https:%2F%2Fcs.chromium.org%2F
  -> RenderFrameHostImpl::DidCommitNavigationInternal()
    -> NavigatorImpl::DidNavigate()
      -> RenderFrameHostImpl::DidNavigate()
        -> RenderFrameHostImpl::SetLastCommittedOrigin()

Change-Id: Id69c3d66e50aa8cbb7fee520a1479b28970de1c6
Bug: 906991, 1030909
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1971660Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748127}
parent 758d885f
...@@ -748,7 +748,7 @@ RenderFrameHost* GetContextForHost(RenderFrameHostImpl* host) { ...@@ -748,7 +748,7 @@ RenderFrameHost* GetContextForHost(RenderFrameHostImpl* host) {
// Dedicated workers // Dedicated workers
const url::Origin& GetContextForHost(DedicatedWorkerHost* host) { const url::Origin& GetContextForHost(DedicatedWorkerHost* host) {
return host->GetOrigin(); return host->GetWorkerOrigin();
} }
void PopulateDedicatedWorkerBinders(DedicatedWorkerHost* host, void PopulateDedicatedWorkerBinders(DedicatedWorkerHost* host,
......
...@@ -54,7 +54,7 @@ CONTENT_EXPORT void CreateDedicatedWorkerHostFactory( ...@@ -54,7 +54,7 @@ CONTENT_EXPORT void CreateDedicatedWorkerHostFactory(
int worker_process_id, int worker_process_id,
base::Optional<GlobalFrameRoutingId> creator_render_frame_host_id, base::Optional<GlobalFrameRoutingId> creator_render_frame_host_id,
GlobalFrameRoutingId ancestor_render_frame_host_id, GlobalFrameRoutingId ancestor_render_frame_host_id,
const url::Origin& origin, const url::Origin& creator_origin,
const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy,
mojo::PendingReceiver<blink::mojom::DedicatedWorkerHostFactory> receiver); mojo::PendingReceiver<blink::mojom::DedicatedWorkerHostFactory> receiver);
...@@ -70,7 +70,7 @@ class DedicatedWorkerHost final : public blink::mojom::DedicatedWorkerHost, ...@@ -70,7 +70,7 @@ class DedicatedWorkerHost final : public blink::mojom::DedicatedWorkerHost,
RenderProcessHost* worker_process_host, RenderProcessHost* worker_process_host,
base::Optional<GlobalFrameRoutingId> creator_render_frame_host_id, base::Optional<GlobalFrameRoutingId> creator_render_frame_host_id,
GlobalFrameRoutingId ancestor_render_frame_host_id, GlobalFrameRoutingId ancestor_render_frame_host_id,
const url::Origin& origin, const url::Origin& creator_origin,
const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy,
mojo::PendingReceiver<blink::mojom::DedicatedWorkerHost> host); mojo::PendingReceiver<blink::mojom::DedicatedWorkerHost> host);
~DedicatedWorkerHost() final; ~DedicatedWorkerHost() final;
...@@ -79,7 +79,7 @@ class DedicatedWorkerHost final : public blink::mojom::DedicatedWorkerHost, ...@@ -79,7 +79,7 @@ class DedicatedWorkerHost final : public blink::mojom::DedicatedWorkerHost,
mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker> receiver); mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker> receiver);
RenderProcessHost* GetProcessHost() { return worker_process_host_; } RenderProcessHost* GetProcessHost() { return worker_process_host_; }
const url::Origin& GetOrigin() { return origin_; } const url::Origin& GetWorkerOrigin() { return worker_origin_; }
const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy() const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy()
const { const {
return cross_origin_embedder_policy_; return cross_origin_embedder_policy_;
...@@ -114,7 +114,6 @@ class DedicatedWorkerHost final : public blink::mojom::DedicatedWorkerHost, ...@@ -114,7 +114,6 @@ class DedicatedWorkerHost final : public blink::mojom::DedicatedWorkerHost,
// PlzDedicatedWorker: // PlzDedicatedWorker:
void StartScriptLoad( void StartScriptLoad(
const GURL& script_url, const GURL& script_url,
const url::Origin& request_initiator_origin,
network::mojom::CredentialsMode credentials_mode, network::mojom::CredentialsMode credentials_mode,
blink::mojom::FetchClientSettingsObjectPtr blink::mojom::FetchClientSettingsObjectPtr
outside_fetch_client_settings_object, outside_fetch_client_settings_object,
...@@ -195,7 +194,12 @@ class DedicatedWorkerHost final : public blink::mojom::DedicatedWorkerHost, ...@@ -195,7 +194,12 @@ class DedicatedWorkerHost final : public blink::mojom::DedicatedWorkerHost,
// of nested workers) indirectly via a tree of dedicated workers. // of nested workers) indirectly via a tree of dedicated workers.
const GlobalFrameRoutingId ancestor_render_frame_host_id_; const GlobalFrameRoutingId ancestor_render_frame_host_id_;
const url::Origin origin_; // The origin of the frame or dedicated worker that starts this worker.
const url::Origin creator_origin_;
// The origin of this worker.
// https://html.spec.whatwg.org/C/#concept-settings-object-origin
const url::Origin worker_origin_;
// The network isolation key to be used for both the worker script and the // The network isolation key to be used for both the worker script and the
// worker's subresources. // worker's subresources.
......
...@@ -36,14 +36,14 @@ class MockDedicatedWorker ...@@ -36,14 +36,14 @@ class MockDedicatedWorker
if (base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker)) { if (base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker)) {
factory_->CreateWorkerHostAndStartScriptLoad( factory_->CreateWorkerHostAndStartScriptLoad(
GURL(), url::Origin(), network::mojom::CredentialsMode::kSameOrigin, /*script_url=*/GURL(), network::mojom::CredentialsMode::kSameOrigin,
blink::mojom::FetchClientSettingsObject::New(), blink::mojom::FetchClientSettingsObject::New(),
mojo::PendingRemote<blink::mojom::BlobURLToken>(), mojo::PendingRemote<blink::mojom::BlobURLToken>(),
receiver_.BindNewPipeAndPassRemote(), receiver_.BindNewPipeAndPassRemote(),
remote_host_.BindNewPipeAndPassReceiver()); remote_host_.BindNewPipeAndPassReceiver());
} else { } else {
factory_->CreateWorkerHost( factory_->CreateWorkerHost(
url::Origin(), browser_interface_broker_.BindNewPipeAndPassReceiver(), browser_interface_broker_.BindNewPipeAndPassReceiver(),
remote_host_.BindNewPipeAndPassReceiver()); remote_host_.BindNewPipeAndPassReceiver());
} }
} }
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
#include "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom.h" #include "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom.h"
#include "third_party/blink/public/platform/web_dedicated_worker.h" #include "third_party/blink/public/platform/web_dedicated_worker.h"
#include "third_party/blink/public/platform/web_security_origin.h"
#include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url.h"
namespace content { namespace content {
...@@ -32,28 +31,25 @@ DedicatedWorkerHostFactoryClient::DedicatedWorkerHostFactoryClient( ...@@ -32,28 +31,25 @@ DedicatedWorkerHostFactoryClient::DedicatedWorkerHostFactoryClient(
DedicatedWorkerHostFactoryClient::~DedicatedWorkerHostFactoryClient() = default; DedicatedWorkerHostFactoryClient::~DedicatedWorkerHostFactoryClient() = default;
void DedicatedWorkerHostFactoryClient::CreateWorkerHostDeprecated( void DedicatedWorkerHostFactoryClient::CreateWorkerHostDeprecated() {
const blink::WebSecurityOrigin& script_origin) {
DCHECK(!base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker)); DCHECK(!base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker> mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
browser_interface_broker; browser_interface_broker;
factory_->CreateWorkerHost( factory_->CreateWorkerHost(
script_origin, browser_interface_broker.InitWithNewPipeAndPassReceiver(), browser_interface_broker.InitWithNewPipeAndPassReceiver(),
remote_host_.BindNewPipeAndPassReceiver()); remote_host_.BindNewPipeAndPassReceiver());
OnWorkerHostCreated(std::move(browser_interface_broker)); OnWorkerHostCreated(std::move(browser_interface_broker));
} }
void DedicatedWorkerHostFactoryClient::CreateWorkerHost( void DedicatedWorkerHostFactoryClient::CreateWorkerHost(
const blink::WebURL& script_url, const blink::WebURL& script_url,
const blink::WebSecurityOrigin& script_origin,
network::mojom::CredentialsMode credentials_mode, network::mojom::CredentialsMode credentials_mode,
const blink::WebSecurityOrigin& fetch_client_security_origin,
const blink::WebFetchClientSettingsObject& fetch_client_settings_object, const blink::WebFetchClientSettingsObject& fetch_client_settings_object,
mojo::ScopedMessagePipeHandle blob_url_token) { mojo::ScopedMessagePipeHandle blob_url_token) {
DCHECK(base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker)); DCHECK(base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
factory_->CreateWorkerHostAndStartScriptLoad( factory_->CreateWorkerHostAndStartScriptLoad(
script_url, script_origin, credentials_mode, script_url, credentials_mode,
FetchClientSettingsObjectFromWebToMojom(fetch_client_settings_object), FetchClientSettingsObjectFromWebToMojom(fetch_client_settings_object),
mojo::PendingRemote<blink::mojom::BlobURLToken>( mojo::PendingRemote<blink::mojom::BlobURLToken>(
std::move(blob_url_token), blink::mojom::BlobURLToken::Version_), std::move(blob_url_token), blink::mojom::BlobURLToken::Version_),
......
...@@ -43,13 +43,10 @@ class DedicatedWorkerHostFactoryClient final ...@@ -43,13 +43,10 @@ class DedicatedWorkerHostFactoryClient final
~DedicatedWorkerHostFactoryClient() override; ~DedicatedWorkerHostFactoryClient() override;
// Implements blink::WebDedicatedWorkerHostFactoryClient. // Implements blink::WebDedicatedWorkerHostFactoryClient.
void CreateWorkerHostDeprecated( void CreateWorkerHostDeprecated() override;
const blink::WebSecurityOrigin& script_origin) override;
void CreateWorkerHost( void CreateWorkerHost(
const blink::WebURL& script_url, const blink::WebURL& script_url,
const blink::WebSecurityOrigin& script_origin,
network::mojom::CredentialsMode credentials_mode, network::mojom::CredentialsMode credentials_mode,
const blink::WebSecurityOrigin& fetch_client_security_origin,
const blink::WebFetchClientSettingsObject& fetch_client_settings_object, const blink::WebFetchClientSettingsObject& fetch_client_settings_object,
mojo::ScopedMessagePipeHandle blob_url_token) override; mojo::ScopedMessagePipeHandle blob_url_token) override;
scoped_refptr<blink::WebWorkerFetchContext> CloneWorkerFetchContext( scoped_refptr<blink::WebWorkerFetchContext> CloneWorkerFetchContext(
......
...@@ -14,7 +14,6 @@ import "third_party/blink/public/mojom/worker/dedicated_worker_host.mojom"; ...@@ -14,7 +14,6 @@ import "third_party/blink/public/mojom/worker/dedicated_worker_host.mojom";
import "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom"; import "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom";
import "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom"; import "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom";
import "url/mojom/origin.mojom";
import "url/mojom/url.mojom"; import "url/mojom/url.mojom";
// The name of the InterfaceProviderSpec in service manifests used by the // The name of the InterfaceProviderSpec in service manifests used by the
...@@ -74,11 +73,7 @@ interface DedicatedWorkerHostFactory { ...@@ -74,11 +73,7 @@ interface DedicatedWorkerHostFactory {
// //
// Creates a new DedicatedWorkerHost, and requests |browser_interface_broker| // Creates a new DedicatedWorkerHost, and requests |browser_interface_broker|
// to provide the worker access to mojo interfaces. // to provide the worker access to mojo interfaces.
// |origin| must either be
// unique or match the origin of the creating context (Document or
// DedicatedWorkerGlobalScope).
CreateWorkerHost( CreateWorkerHost(
url.mojom.Origin origin,
pending_receiver<blink.mojom.BrowserInterfaceBroker> pending_receiver<blink.mojom.BrowserInterfaceBroker>
browser_interface_broker, browser_interface_broker,
pending_receiver<DedicatedWorkerHost> host); pending_receiver<DedicatedWorkerHost> host);
...@@ -90,14 +85,11 @@ interface DedicatedWorkerHostFactory { ...@@ -90,14 +85,11 @@ interface DedicatedWorkerHostFactory {
// Creates a new DedicatedWorkerHost, and requests to start top-level worker // Creates a new DedicatedWorkerHost, and requests to start top-level worker
// script loading for |script_url| using |credentials_mode| and // script loading for |script_url| using |credentials_mode| and
// |outside_fetch_client_settings_object|. // |outside_fetch_client_settings_object|.
// |origin| must either be unique or match the origin of the creating context
// (Document or DedicatedWorkerGlobalScope).
// |blob_url_token| should be non-null when |script_url| is a blob URL. // |blob_url_token| should be non-null when |script_url| is a blob URL.
// |client| is used for notifying the renderer process of results of worker // |client| is used for notifying the renderer process of results of worker
// host creation and script loading. // host creation and script loading.
CreateWorkerHostAndStartScriptLoad( CreateWorkerHostAndStartScriptLoad(
url.mojom.Url script_url, url.mojom.Url script_url,
url.mojom.Origin origin,
network.mojom.CredentialsMode credentials_mode, network.mojom.CredentialsMode credentials_mode,
blink.mojom.FetchClientSettingsObject blink.mojom.FetchClientSettingsObject
outside_fetch_client_settings_object, outside_fetch_client_settings_object,
......
...@@ -18,7 +18,6 @@ class SingleThreadTaskRunner; ...@@ -18,7 +18,6 @@ class SingleThreadTaskRunner;
namespace blink { namespace blink {
class WebSecurityOrigin;
class WebURL; class WebURL;
class WebWorkerFetchContext; class WebWorkerFetchContext;
...@@ -31,17 +30,11 @@ class WebDedicatedWorkerHostFactoryClient { ...@@ -31,17 +30,11 @@ class WebDedicatedWorkerHostFactoryClient {
// Requests the creation of DedicatedWorkerHost in the browser process. // Requests the creation of DedicatedWorkerHost in the browser process.
// For non-PlzDedicatedWorker. This will be removed once PlzDedicatedWorker is // For non-PlzDedicatedWorker. This will be removed once PlzDedicatedWorker is
// enabled by default. // enabled by default.
virtual void CreateWorkerHostDeprecated( virtual void CreateWorkerHostDeprecated() = 0;
const blink::WebSecurityOrigin& script_origin) = 0;
// For PlzDedicatedWorker. // For PlzDedicatedWorker.
// |fetch_client_security_origin| is intentionally separated from
// |fetch_client_settings_object| as it shouldn't be passed from renderer
// process from the security perspective.
virtual void CreateWorkerHost( virtual void CreateWorkerHost(
const blink::WebURL& script_url, const blink::WebURL& script_url,
const blink::WebSecurityOrigin& script_origin,
network::mojom::CredentialsMode credentials_mode, network::mojom::CredentialsMode credentials_mode,
const blink::WebSecurityOrigin& fetch_client_security_origin,
const blink::WebFetchClientSettingsObject& fetch_client_settings_object, const blink::WebFetchClientSettingsObject& fetch_client_settings_object,
mojo::ScopedMessagePipeHandle blob_url_token) = 0; mojo::ScopedMessagePipeHandle blob_url_token) = 0;
......
...@@ -194,18 +194,14 @@ void DedicatedWorker::Start() { ...@@ -194,18 +194,14 @@ void DedicatedWorker::Start() {
factory_client_->CreateWorkerHost( factory_client_->CreateWorkerHost(
script_request_url_, script_request_url_,
WebSecurityOrigin(GetExecutionContext()->GetSecurityOrigin()),
credentials_mode, credentials_mode,
WebSecurityOrigin(
outside_fetch_client_settings_object_->GetSecurityOrigin()),
WebFetchClientSettingsObject(*outside_fetch_client_settings_object_), WebFetchClientSettingsObject(*outside_fetch_client_settings_object_),
blob_url_token.PassPipe()); blob_url_token.PassPipe());
// Continue in OnScriptLoadStarted() or OnScriptLoadStartFailed(). // Continue in OnScriptLoadStarted() or OnScriptLoadStartFailed().
return; return;
} }
factory_client_->CreateWorkerHostDeprecated( factory_client_->CreateWorkerHostDeprecated();
WebSecurityOrigin(GetExecutionContext()->GetSecurityOrigin()));
if (options_->type() == "classic") { if (options_->type() == "classic") {
// Legacy code path (to be deprecated, see https://crbug.com/835717): // Legacy code path (to be deprecated, see https://crbug.com/835717):
......
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