Index: third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp |
diff --git a/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp b/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp |
index cf38c7bf066aa0296bf946b9d00c5807689826f9..06f8a4e21a2c412a9a1e44eff446fea22145fd01 100644 |
--- a/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp |
+++ b/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp |
@@ -9,6 +9,7 @@ |
#include "core/dom/SecurityContext.h" |
#include "core/dom/TaskRunnerHelper.h" |
#include "core/frame/csp/ContentSecurityPolicy.h" |
+#include "core/loader/WorkletScriptLoader.h" |
#include "core/origin_trials/OriginTrialContext.h" |
#include "core/workers/ThreadedWorkletObjectProxy.h" |
#include "core/workers/WorkerInspectorProxy.h" |
@@ -19,6 +20,64 @@ |
namespace blink { |
+namespace { |
+ |
+// Implementation of the second half of the "fetch and invoke a worklet script" |
+// algorithm: |
+// https://drafts.css-houdini.org/worklets/#fetch-and-invoke-a-worklet-script |
+// TODO(nhiroki): This should be in sync with WorkletModuleTreeClient as much as |
+// possible because this will be replaced with that when module loading is ready |
+// for threaded worklets (https://crbug.com/727194). |
+class LoaderClient final : public GarbageCollectedFinalized<LoaderClient>, |
+ public WorkletScriptLoader::Client { |
+ USING_GARBAGE_COLLECTED_MIXIN(LoaderClient); |
+ |
+ public: |
+ LoaderClient(RefPtr<WebTaskRunner> outside_settings_task_runner, |
+ WorkletPendingTasks* pending_tasks, |
+ ThreadedWorkletMessagingProxy* proxy) |
+ : outside_settings_task_runner_(std::move(outside_settings_task_runner)), |
+ pending_tasks_(pending_tasks), |
+ proxy_(proxy) {} |
+ |
+ // Implementation of the second half of the "fetch and invoke a worklet |
+ // script" algorithm: |
+ // https://drafts.css-houdini.org/worklets/#fetch-and-invoke-a-worklet-script |
+ void NotifyWorkletScriptLoadingFinished( |
+ WorkletScriptLoader* script_loader, |
+ const ScriptSourceCode& source_code) final { |
+ DCHECK(IsMainThread()); |
+ if (!script_loader->WasScriptLoadSuccessful()) { |
+ // Step 3: "If script is null, then queue a task on outsideSettings's |
+ // responsible event loop to run these steps:" |
+ // The steps are implemented in WorkletPendingTasks::Abort(). |
+ outside_settings_task_runner_->PostTask( |
+ BLINK_FROM_HERE, WTF::Bind(&WorkletPendingTasks::Abort, |
+ WrapPersistent(pending_tasks_.Get()))); |
+ return; |
+ } |
+ |
+ // Step 4: "Run a module script given script." |
+ proxy_->EvaluateScript(source_code); |
+ |
+ // Step 5: "Queue a task on outsideSettings's responsible event loop to run |
+ // these steps:" |
+ // The steps are implemented in WorkletPendingTasks::DecrementCounter(). |
+ outside_settings_task_runner_->PostTask( |
+ BLINK_FROM_HERE, WTF::Bind(&WorkletPendingTasks::DecrementCounter, |
+ WrapPersistent(pending_tasks_.Get()))); |
+ } |
+ |
+ DEFINE_INLINE_TRACE() { visitor->Trace(pending_tasks_); } |
+ |
+ private: |
+ RefPtr<WebTaskRunner> outside_settings_task_runner_; |
+ Member<WorkletPendingTasks> pending_tasks_; |
+ ThreadedWorkletMessagingProxy* proxy_; |
+}; |
+ |
+} // namespace |
+ |
ThreadedWorkletMessagingProxy::ThreadedWorkletMessagingProxy( |
ExecutionContext* execution_context) |
: ThreadedMessagingProxyBase(execution_context), weak_ptr_factory_(this) { |
@@ -27,7 +86,7 @@ ThreadedWorkletMessagingProxy::ThreadedWorkletMessagingProxy( |
} |
void ThreadedWorkletMessagingProxy::Initialize() { |
- DCHECK(IsParentContextThread()); |
+ DCHECK(IsMainThread()); |
if (AskedToTerminate()) |
return; |
@@ -57,8 +116,22 @@ void ThreadedWorkletMessagingProxy::Initialize() { |
script_url); |
} |
+void ThreadedWorkletMessagingProxy::FetchAndInvokeScript( |
+ const KURL& module_url_record, |
+ WebURLRequest::FetchCredentialsMode credentials_mode, |
+ RefPtr<WebTaskRunner> outside_settings_task_runner, |
+ WorkletPendingTasks* pending_tasks) { |
+ DCHECK(IsMainThread()); |
+ LoaderClient* client = new LoaderClient( |
+ std::move(outside_settings_task_runner), pending_tasks, this); |
+ WorkletScriptLoader* script_loader = WorkletScriptLoader::Create( |
+ ToDocument(GetExecutionContext())->Fetcher(), client); |
+ script_loader->FetchScript(module_url_record); |
+} |
+ |
void ThreadedWorkletMessagingProxy::EvaluateScript( |
const ScriptSourceCode& script_source_code) { |
+ DCHECK(IsMainThread()); |
TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI, GetWorkerThread()) |
->PostTask( |
BLINK_FROM_HERE, |
@@ -69,6 +142,7 @@ void ThreadedWorkletMessagingProxy::EvaluateScript( |
} |
void ThreadedWorkletMessagingProxy::TerminateWorkletGlobalScope() { |
+ DCHECK(IsMainThread()); |
TerminateGlobalScope(); |
} |