Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(952)

Unified Diff: third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp

Issue 2839123003: Worklet: Introduce "pending tasks struct" concept defined in the Worklet spec (Closed)
Patch Set: address review comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp
diff --git a/third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp b/third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp
index b3ffe3bec9481ff04fadb12b4fb0ac8651013d69..b7743e59b5feb1689beb7bb013f0c9a0770dfc44 100644
--- a/third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp
+++ b/third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp
@@ -11,27 +11,17 @@
#include "core/dom/ExceptionCode.h"
#include "core/frame/LocalFrame.h"
#include "core/workers/WorkletGlobalScopeProxy.h"
+#include "core/workers/WorkletPendingTasks.h"
#include "platform/wtf/WTF.h"
namespace blink {
-namespace {
-
-int32_t GetNextRequestId() {
- DCHECK(IsMainThread());
- static int32_t next_request_id = 1;
- CHECK_LT(next_request_id, std::numeric_limits<int32_t>::max());
- return next_request_id++;
-}
-
-} // namespace
-
-MainThreadWorklet::MainThreadWorklet(LocalFrame* frame) : Worklet(frame) {
- DCHECK(resolver_map_.IsEmpty());
-}
+MainThreadWorklet::MainThreadWorklet(LocalFrame* frame) : Worklet(frame) {}
+// Implementation of the "addModule(moduleURL, options)" algorithm:
+// https://drafts.css-houdini.org/worklets/#dom-worklet-addmodule
ScriptPromise MainThreadWorklet::addModule(ScriptState* script_state,
- const String& url) {
+ const String& module_url) {
DCHECK(IsMainThread());
if (!GetExecutionContext()) {
return ScriptPromise::RejectWithDOMException(
@@ -39,44 +29,44 @@ ScriptPromise MainThreadWorklet::addModule(ScriptState* script_state,
"This frame is already detached"));
}
- KURL script_url = GetExecutionContext()->CompleteURL(url);
- if (!script_url.IsValid()) {
+ KURL module_url_record = GetExecutionContext()->CompleteURL(module_url);
+ if (!module_url_record.IsValid()) {
return ScriptPromise::RejectWithDOMException(
- script_state, DOMException::Create(
- kSyntaxError, "'" + url + "' is not a valid URL."));
+ script_state,
+ DOMException::Create(kSyntaxError,
+ "'" + module_url + "' is not a valid URL."));
}
- int32_t request_id = GetNextRequestId();
ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
ScriptPromise promise = resolver->Promise();
- resolver_map_.Set(request_id, resolver);
- GetWorkletGlobalScopeProxy()->FetchAndInvokeScript(request_id, script_url);
- return promise;
-}
-void MainThreadWorklet::DidFetchAndInvokeScript(int32_t request_id,
- bool success) {
- DCHECK(IsMainThread());
- ScriptPromiseResolver* resolver = resolver_map_.at(request_id);
- if (!resolver)
- return;
- resolver_map_.erase(request_id);
- if (!success) {
- resolver->Reject(DOMException::Create(kNetworkError));
- return;
- }
- resolver->Resolve();
+ // Step 11: "Let pendingTaskStruct be a new pending tasks struct with counter
+ // initialized to the length of worklet's WorkletGlobalScopes."
+ // TODO(nhiroki): Introduce the concept of "worklet's WorkletGlobalScopes" and
+ // use the length of it here.
+ constexpr int number_of_global_scopes = 1;
+ WorkletPendingTasks* pending_tasks =
+ new WorkletPendingTasks(number_of_global_scopes, resolver);
+
+ // Step 12: "For each workletGlobalScope in the worklet's
+ // WorkletGlobalScopes, queue a task on the workletGlobalScope to fetch and
+ // invoke a worklet script given workletGlobalScope, moduleURLRecord,
+ // moduleResponsesMap, credentialOptions, outsideSettings, pendingTaskStruct,
+ // and promise."
+ // TODO(nhiroki): Pass the remaining parameters (e.g., credentialOptions).
+ // TODO(nhiroki): Queue a task instead of executing this here.
+ GetWorkletGlobalScopeProxy()->FetchAndInvokeScript(module_url_record,
+ pending_tasks);
+ return promise;
}
void MainThreadWorklet::ContextDestroyed(ExecutionContext* execution_context) {
DCHECK(IsMainThread());
- resolver_map_.clear();
GetWorkletGlobalScopeProxy()->TerminateWorkletGlobalScope();
Worklet::ContextDestroyed(execution_context);
}
DEFINE_TRACE(MainThreadWorklet) {
- visitor->Trace(resolver_map_);
Worklet::Trace(visitor);
}

Powered by Google App Engine
This is Rietveld 408576698