diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/workers/dedicated_worker.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/workers/dedicated_worker.cc | 153 |
1 files changed, 61 insertions, 92 deletions
diff --git a/chromium/third_party/blink/renderer/core/workers/dedicated_worker.cc b/chromium/third_party/blink/renderer/core/workers/dedicated_worker.cc index 19da6821016..86f200fecc0 100644 --- a/chromium/third_party/blink/renderer/core/workers/dedicated_worker.cc +++ b/chromium/third_party/blink/renderer/core/workers/dedicated_worker.cc @@ -5,7 +5,9 @@ #include "third_party/blink/renderer/core/workers/dedicated_worker.h" #include <utility> + #include "base/feature_list.h" +#include "base/optional.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/fetch_api.mojom-blink.h" #include "third_party/blink/public/common/blob/blob_utils.h" @@ -15,7 +17,9 @@ #include "third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom-blink.h" #include "third_party/blink/public/platform/web_content_settings_client.h" #include "third_party/blink/public/platform/web_fetch_client_settings_object.h" +#include "third_party/blink/public/web/web_widget_client.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/post_message_helper.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_post_message_options.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/events/message_event.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" @@ -30,7 +34,6 @@ #include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" #include "third_party/blink/renderer/core/loader/worker_fetch_context.h" -#include "third_party/blink/renderer/core/messaging/post_message_options.h" #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/probe/core_probes.h" @@ -41,7 +44,6 @@ #include "third_party/blink/renderer/core/workers/worker_global_scope.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" -#include "third_party/blink/renderer/platform/instrumentation/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties.h" @@ -49,50 +51,6 @@ namespace blink { -namespace { - -// Indicates whether the origin of worker top-level script's request URL is -// same-origin as the parent execution context's origin or not. -// This is used for UMA and thus the existing values should not be changed. -enum class WorkerTopLevelScriptOriginType { - kSameOrigin = 0, - kDataUrl = 1, - - // Cross-origin worker request URL (e.g. https://example.com/worker.js) - // from an chrome-extension: page. - kCrossOriginFromExtension = 2, - - // Cross-origin worker request URL from a non chrome-extension: page. - // There are no known cases for this, and we investigate whether there are - // really no occurrences. - kCrossOriginOthers = 3, - - kMaxValue = kCrossOriginOthers -}; - -void CountTopLevelScriptRequestUrlOriginType( - const SecurityOrigin& context_origin, - const KURL& request_url) { - WorkerTopLevelScriptOriginType origin_type; - if (request_url.ProtocolIsData()) { - origin_type = WorkerTopLevelScriptOriginType::kDataUrl; - } else if (context_origin.IsSameOriginWith( - SecurityOrigin::Create(request_url).get())) { - origin_type = WorkerTopLevelScriptOriginType::kSameOrigin; - } else if (context_origin.Protocol() == "chrome-extension") { - // Note: using "chrome-extension" scheme check here is a layering - // violation. Do not use this except for UMA purpose. - origin_type = WorkerTopLevelScriptOriginType::kCrossOriginFromExtension; - } else { - origin_type = WorkerTopLevelScriptOriginType::kCrossOriginOthers; - } - UMA_HISTOGRAM_ENUMERATION( - "Worker.TopLevelScript.OriginType.RequestUrl.DedicatedWorker", - origin_type); -} - -} // namespace - DedicatedWorker* DedicatedWorker::Create(ExecutionContext* context, const String& url, const WorkerOptions* options, @@ -113,17 +71,6 @@ DedicatedWorker* DedicatedWorker::Create(ExecutionContext* context, return nullptr; } - // TODO(nhiroki): Remove this flag check once module loading for - // DedicatedWorker is enabled by default (https://crbug.com/680046). - if (options->type() == "module" && - !RuntimeEnabledFeatures::ModuleDedicatedWorkerEnabled()) { - exception_state.ThrowTypeError( - "Module scripts are not supported on DedicatedWorker yet. You can try " - "the feature with '--enable-experimental-web-platform-features' flag " - "(see https://crbug.com/680046)"); - return nullptr; - } - if (context->IsWorkerGlobalScope()) UseCounter::Count(context, WebFeature::kNestedDedicatedWorker); @@ -233,9 +180,10 @@ void DedicatedWorker::Start() { // https://html.spec.whatwg.org/C/#workeroptions auto credentials_mode = network::mojom::CredentialsMode::kSameOrigin; if (options_->type() == "module") { - bool result = Request::ParseCredentialsMode(options_->credentials(), - &credentials_mode); + base::Optional<network::mojom::CredentialsMode> result = + Request::ParseCredentialsMode(options_->credentials()); DCHECK(result); + credentials_mode = result.value(); } mojo::PendingRemote<mojom::blink::BlobURLToken> blob_url_token; @@ -253,8 +201,26 @@ void DedicatedWorker::Start() { return; } - factory_client_->CreateWorkerHostDeprecated(); + mojo::PendingRemote<network::mojom::blink::URLLoaderFactory> + blob_url_loader_factory; + if (script_request_url_.ProtocolIs("blob")) { + GetExecutionContext()->GetPublicURLManager().Resolve( + script_request_url_, + blob_url_loader_factory.InitWithNewPipeAndPassReceiver()); + } + factory_client_->CreateWorkerHostDeprecated( + WTF::Bind(&DedicatedWorker::OnHostCreated, WrapWeakPersistent(this), + std::move(blob_url_loader_factory))); +} +void DedicatedWorker::OnHostCreated( + mojo::PendingRemote<network::mojom::blink::URLLoaderFactory> + blob_url_loader_factory, + const network::CrossOriginEmbedderPolicy& parent_coep) { + DCHECK(!base::FeatureList::IsEnabled(features::kPlzDedicatedWorker)); + const RejectCoepUnsafeNone reject_coep_unsafe_none( + parent_coep.value == + network::mojom::CrossOriginEmbedderPolicyValue::kRequireCorp); if (options_->type() == "classic") { // Legacy code path (to be deprecated, see https://crbug.com/835717): // A worker thread will start after scripts are fetched on the current @@ -263,19 +229,20 @@ void DedicatedWorker::Start() { classic_script_loader_->LoadTopLevelScriptAsynchronously( *GetExecutionContext(), GetExecutionContext()->Fetcher(), script_request_url_, mojom::RequestContextType::WORKER, + network::mojom::RequestDestination::kWorker, network::mojom::RequestMode::kSameOrigin, network::mojom::CredentialsMode::kSameOrigin, WTF::Bind(&DedicatedWorker::OnResponse, WrapPersistent(this)), - WTF::Bind(&DedicatedWorker::OnFinished, WrapPersistent(this))); + WTF::Bind(&DedicatedWorker::OnFinished, WrapPersistent(this)), + reject_coep_unsafe_none, std::move(blob_url_loader_factory)); return; } if (options_->type() == "module") { // Specify empty source code here because scripts will be fetched on the // worker thread. - ContinueStart( - script_request_url_, OffMainThreadWorkerScriptFetchOption::kEnabled, - network::mojom::ReferrerPolicy::kDefault, - base::nullopt /* response_address_space */, String() /* source_code */); + ContinueStart(script_request_url_, network::mojom::ReferrerPolicy::kDefault, + base::nullopt /* response_address_space */, + String() /* source_code */, reject_coep_unsafe_none); return; } NOTREACHED() << "Invalid type: " << options_->type(); @@ -292,7 +259,7 @@ BeginFrameProviderParams DedicatedWorker::CreateBeginFrameProviderParams() { // won't be initialized. If that's the case, the Worker will initialize it by // itself later. BeginFrameProviderParams begin_frame_provider_params; - if (auto* document = DynamicTo<Document>(GetExecutionContext())) { + if (auto* document = Document::DynamicFrom(GetExecutionContext())) { LocalFrame* frame = document->GetFrame(); if (frame) { WebFrameWidgetBase* widget = @@ -307,7 +274,7 @@ BeginFrameProviderParams DedicatedWorker::CreateBeginFrameProviderParams() { return begin_frame_provider_params; } -void DedicatedWorker::ContextDestroyed(ExecutionContext*) { +void DedicatedWorker::ContextDestroyed() { DCHECK(GetExecutionContext()->IsContextThread()); if (classic_script_loader_) classic_script_loader_->Cancel(); @@ -335,10 +302,9 @@ void DedicatedWorker::OnScriptLoadStarted() { DCHECK(base::FeatureList::IsEnabled(features::kPlzDedicatedWorker)); // Specify empty source code here because scripts will be fetched on the // worker thread. - ContinueStart( - script_request_url_, OffMainThreadWorkerScriptFetchOption::kEnabled, - network::mojom::ReferrerPolicy::kDefault, - base::nullopt /* response_address_space */, String() /* source_code */); + ContinueStart(script_request_url_, network::mojom::ReferrerPolicy::kDefault, + base::nullopt /* response_address_space */, + String() /* source_code */, RejectCoepUnsafeNone(false)); } void DedicatedWorker::OnScriptLoadStartFailed() { @@ -356,7 +322,7 @@ void DedicatedWorker::DispatchErrorEventForScriptFetchFailure() { std::unique_ptr<WebContentSettingsClient> DedicatedWorker::CreateWebContentSettingsClient() { std::unique_ptr<WebContentSettingsClient> content_settings_client; - if (auto* document = DynamicTo<Document>(GetExecutionContext())) { + if (auto* document = Document::DynamicFrom(GetExecutionContext())) { LocalFrame* frame = document->GetFrame(); return frame->Client()->CreateWorkerContentSettingsClient(); } else if (GetExecutionContext()->IsWorkerGlobalScope()) { @@ -381,9 +347,6 @@ void DedicatedWorker::OnFinished() { } else if (classic_script_loader_->Failed()) { context_proxy_->DidFailToFetchScript(); } else { - CountTopLevelScriptRequestUrlOriginType( - *GetExecutionContext()->GetSecurityOrigin(), script_request_url_); - network::mojom::ReferrerPolicy referrer_policy = network::mojom::ReferrerPolicy::kDefault; if (!classic_script_loader_->GetReferrerPolicy().IsNull()) { @@ -395,10 +358,10 @@ void DedicatedWorker::OnFinished() { DCHECK(script_request_url_ == script_response_url || SecurityOrigin::AreSameOrigin(script_request_url_, script_response_url)); - ContinueStart( - script_response_url, OffMainThreadWorkerScriptFetchOption::kDisabled, - referrer_policy, classic_script_loader_->ResponseAddressSpace(), - classic_script_loader_->SourceText()); + ContinueStart(script_response_url, referrer_policy, + classic_script_loader_->ResponseAddressSpace(), + classic_script_loader_->SourceText(), + RejectCoepUnsafeNone(false)); probe::ScriptImported(GetExecutionContext(), classic_script_loader_->Identifier(), classic_script_loader_->SourceText()); @@ -408,34 +371,39 @@ void DedicatedWorker::OnFinished() { void DedicatedWorker::ContinueStart( const KURL& script_url, - OffMainThreadWorkerScriptFetchOption off_main_thread_fetch_option, network::mojom::ReferrerPolicy referrer_policy, base::Optional<network::mojom::IPAddressSpace> response_address_space, - const String& source_code) { + const String& source_code, + RejectCoepUnsafeNone reject_coep_unsafe_none) { context_proxy_->StartWorkerGlobalScope( - CreateGlobalScopeCreationParams(script_url, off_main_thread_fetch_option, - referrer_policy, response_address_space), + CreateGlobalScopeCreationParams(script_url, referrer_policy, + response_address_space), options_, script_url, *outside_fetch_client_settings_object_, - v8_stack_trace_id_, source_code); + v8_stack_trace_id_, source_code, reject_coep_unsafe_none); } std::unique_ptr<GlobalScopeCreationParams> DedicatedWorker::CreateGlobalScopeCreationParams( const KURL& script_url, - OffMainThreadWorkerScriptFetchOption off_main_thread_fetch_option, network::mojom::ReferrerPolicy referrer_policy, base::Optional<network::mojom::IPAddressSpace> response_address_space) { base::UnguessableToken parent_devtools_token; std::unique_ptr<WorkerSettings> settings; - if (auto* document = DynamicTo<Document>(GetExecutionContext())) { - if (document->GetFrame()) - parent_devtools_token = document->GetFrame()->GetDevToolsFrameToken(); + UserAgentMetadata ua_metadata; + if (auto* document = Document::DynamicFrom(GetExecutionContext())) { + auto* frame = document->GetFrame(); + if (frame) { + parent_devtools_token = frame->GetDevToolsFrameToken(); + ua_metadata = frame->Loader().UserAgentMetadata().value_or( + blink::UserAgentMetadata()); + } settings = std::make_unique<WorkerSettings>(document->GetSettings()); } else { WorkerGlobalScope* worker_global_scope = To<WorkerGlobalScope>(GetExecutionContext()); parent_devtools_token = worker_global_scope->GetThread()->GetDevToolsWorkerToken(); + ua_metadata = worker_global_scope->GetUserAgentMetadata(); settings = WorkerSettings::Copy(worker_global_scope->GetWorkerSettings()); } @@ -444,8 +412,9 @@ DedicatedWorker::CreateGlobalScopeCreationParams( : mojom::ScriptType::kModule; return std::make_unique<GlobalScopeCreationParams>( - script_url, script_type, off_main_thread_fetch_option, options_->name(), - GetExecutionContext()->UserAgent(), CreateWebWorkerFetchContext(), + script_url, script_type, options_->name(), + GetExecutionContext()->UserAgent(), ua_metadata, + CreateWebWorkerFetchContext(), GetExecutionContext()->GetContentSecurityPolicy()->Headers(), referrer_policy, GetExecutionContext()->GetSecurityOrigin(), GetExecutionContext()->IsSecureContext(), @@ -463,7 +432,7 @@ DedicatedWorker::CreateGlobalScopeCreationParams( scoped_refptr<WebWorkerFetchContext> DedicatedWorker::CreateWebWorkerFetchContext() { // This worker is being created by the document. - if (auto* document = DynamicTo<Document>(GetExecutionContext())) { + if (auto* document = Document::DynamicFrom(GetExecutionContext())) { scoped_refptr<WebWorkerFetchContext> web_worker_fetch_context; LocalFrame* frame = document->GetFrame(); if (base::FeatureList::IsEnabled(features::kPlzDedicatedWorker)) { @@ -517,7 +486,7 @@ void DedicatedWorker::ContextLifecycleStateChanged( } } -void DedicatedWorker::Trace(blink::Visitor* visitor) { +void DedicatedWorker::Trace(Visitor* visitor) { visitor->Trace(options_); visitor->Trace(outside_fetch_client_settings_object_); visitor->Trace(context_proxy_); |