blob: 5243166227932ece83f8757612cf4a94f6a6f1a4 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.h"
#include <utility>
#include "base/single_thread_task_runner.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
#include "third_party/blink/public/mojom/v8_cache_options.mojom-blink.h"
#include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/execution_context/security_context.h"
#include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
#include "third_party/blink/renderer/core/inspector/thread_debugger.h"
#include "third_party/blink/renderer/core/loader/worker_fetch_context.h"
#include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
#include "third_party/blink/renderer/core/script/script.h"
#include "third_party/blink/renderer/core/workers/global_scope_creation_params.h"
#include "third_party/blink/renderer/core/workers/threaded_worklet_object_proxy.h"
#include "third_party/blink/renderer/core/workers/worker_clients.h"
#include "third_party/blink/renderer/core/workers/worklet_global_scope.h"
#include "third_party/blink/renderer/core/workers/worklet_module_responses_map.h"
#include "third_party/blink/renderer/core/workers/worklet_pending_tasks.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
#include "third_party/blink/renderer/platform/loader/fetch/worker_resource_timing_notifier.h"
#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
namespace blink {
ThreadedWorkletMessagingProxy::ThreadedWorkletMessagingProxy(
ExecutionContext* execution_context)
: ThreadedMessagingProxyBase(execution_context) {}
void ThreadedWorkletMessagingProxy::Initialize(
WorkerClients* worker_clients,
WorkletModuleResponsesMap* module_responses_map,
const base::Optional<WorkerBackingThreadStartupData>& thread_startup_data) {
DCHECK(IsMainThread());
if (AskedToTerminate())
return;
worklet_object_proxy_ =
CreateObjectProxy(this, GetParentExecutionContextTaskRunners());
// For now we don't use global scope name for threaded worklets.
// TODO(nhiroki): Threaded worklets may want to have the global scope name to
// distinguish multiple worklets created from the same script URL like
// LayoutWorklet and PaintWorklet.
const String global_scope_name = g_empty_string;
LocalDOMWindow* window = To<LocalDOMWindow>(GetExecutionContext());
ContentSecurityPolicy* csp = window->GetContentSecurityPolicy();
DCHECK(csp);
auto global_scope_creation_params =
std::make_unique<GlobalScopeCreationParams>(
window->Url(), mojom::blink::ScriptType::kModule, global_scope_name,
window->UserAgent(),
window->GetFrame()->Client()->UserAgentMetadata(),
window->GetFrame()->Client()->CreateWorkerFetchContext(),
mojo::Clone(csp->GetParsedPolicies()), window->GetReferrerPolicy(),
window->GetSecurityOrigin(), window->IsSecureContext(),
window->GetHttpsState(), worker_clients,
window->GetFrame()->Client()->CreateWorkerContentSettingsClient(),
window->AddressSpace(), OriginTrialContext::GetTokens(window).get(),
base::UnguessableToken::Create(),
std::make_unique<WorkerSettings>(window->GetFrame()->GetSettings()),
mojom::blink::V8CacheOptions::kDefault, module_responses_map,
mojo::NullRemote() /* browser_interface_broker */,
BeginFrameProviderParams(), nullptr /* parent_feature_policy */,
window->GetAgentClusterID(), ukm::kInvalidSourceId,
window->GetExecutionContextToken(),
window->CrossOriginIsolatedCapability());
// Worklets share the pre-initialized backing thread so that we don't have to
// specify the backing thread startup data.
InitializeWorkerThread(std::move(global_scope_creation_params),
thread_startup_data, base::nullopt);
}
void ThreadedWorkletMessagingProxy::Trace(Visitor* visitor) const {
ThreadedMessagingProxyBase::Trace(visitor);
}
void ThreadedWorkletMessagingProxy::FetchAndInvokeScript(
const KURL& module_url_record,
network::mojom::CredentialsMode credentials_mode,
const FetchClientSettingsObjectSnapshot& outside_settings_object,
WorkerResourceTimingNotifier& outside_resource_timing_notifier,
scoped_refptr<base::SingleThreadTaskRunner> outside_settings_task_runner,
WorkletPendingTasks* pending_tasks) {
DCHECK(IsMainThread());
PostCrossThreadTask(
*GetWorkerThread()->GetTaskRunner(TaskType::kInternalLoading), FROM_HERE,
CrossThreadBindOnce(
&ThreadedWorkletObjectProxy::FetchAndInvokeScript,
CrossThreadUnretained(worklet_object_proxy_.get()), module_url_record,
credentials_mode, outside_settings_object.CopyData(),
WrapCrossThreadPersistent(&outside_resource_timing_notifier),
std::move(outside_settings_task_runner),
WrapCrossThreadPersistent(pending_tasks),
CrossThreadUnretained(GetWorkerThread())));
}
void ThreadedWorkletMessagingProxy::WorkletObjectDestroyed() {
DCHECK(IsMainThread());
ParentObjectDestroyed();
}
void ThreadedWorkletMessagingProxy::TerminateWorkletGlobalScope() {
DCHECK(IsMainThread());
TerminateGlobalScope();
}
std::unique_ptr<ThreadedWorkletObjectProxy>
ThreadedWorkletMessagingProxy::CreateObjectProxy(
ThreadedWorkletMessagingProxy* messaging_proxy,
ParentExecutionContextTaskRunners* parent_execution_context_task_runners) {
return ThreadedWorkletObjectProxy::Create(
messaging_proxy, parent_execution_context_task_runners);
}
ThreadedWorkletObjectProxy&
ThreadedWorkletMessagingProxy::WorkletObjectProxy() {
DCHECK(worklet_object_proxy_);
return *worklet_object_proxy_;
}
} // namespace blink