summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/workers/dedicated_worker.cc
diff options
context:
space:
mode:
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.cc153
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_);