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

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

Issue 2826313003: Worklet: Enable module script loading for main thread worklets (Closed)
Patch Set: rebase 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/MainThreadWorkletGlobalScope.cpp
diff --git a/third_party/WebKit/Source/core/workers/MainThreadWorkletGlobalScope.cpp b/third_party/WebKit/Source/core/workers/MainThreadWorkletGlobalScope.cpp
index c91165cfbcdabafb90c1713a189f6cdbbd77fa73..4d20ca7c9e0e41accc19df433ac856f2498065d9 100644
--- a/third_party/WebKit/Source/core/workers/MainThreadWorkletGlobalScope.cpp
+++ b/third_party/WebKit/Source/core/workers/MainThreadWorkletGlobalScope.cpp
@@ -7,14 +7,62 @@
#include "bindings/core/v8/ScriptSourceCode.h"
#include "bindings/core/v8/WorkerOrWorkletScriptController.h"
#include "core/dom/Document.h"
+#include "core/dom/Modulator.h"
+#include "core/dom/ModuleScript.h"
#include "core/frame/Deprecation.h"
#include "core/frame/FrameConsole.h"
#include "core/frame/LocalFrame.h"
#include "core/inspector/MainThreadDebugger.h"
+#include "core/loader/modulescript/ModuleScriptFetchRequest.h"
#include "core/probe/CoreProbes.h"
+#include "public/platform/WebURLRequest.h"
namespace blink {
+class WorkletModuleTreeClient final
+ : public GarbageCollectedFinalized<WorkletModuleTreeClient>,
+ public ModuleTreeClient {
+ USING_GARBAGE_COLLECTED_MIXIN(WorkletModuleTreeClient);
+
+ public:
+ explicit WorkletModuleTreeClient(WorkletPendingTasks* pending_tasks)
+ : pending_tasks_(pending_tasks) {}
+
+ // ModuleTreeClient
+ // 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 NotifyModuleTreeLoadFinished(ModuleScript* module_script) final {
+ DCHECK(IsMainThread());
+ if (!module_script) {
+ // 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().
+ // TODO(nhiroki): Queue a task instead of executing this here.
+ pending_tasks_->Abort();
+ return;
+ }
+
+ // Step 4: "Run a module script given script."
+ Script* script = module_script;
+ script->RunScript(nullptr, nullptr);
+
+ // Step 5: "Queue a task on outsideSettings's responsible event loop to run
+ // these steps:"
+ // The steps are implemented in WorkletPendingTasks::DecrementCounter().
+ // TODO(nhiroki): Queue a task instead of executing this here.
+ pending_tasks_->DecrementCounter();
+ };
+
+ DEFINE_INLINE_VIRTUAL_TRACE() {
+ visitor->Trace(pending_tasks_);
+ ModuleTreeClient::Trace(visitor);
+ }
+
+ private:
+ Member<WorkletPendingTasks> pending_tasks_;
+};
+
MainThreadWorkletGlobalScope::MainThreadWorkletGlobalScope(
LocalFrame* frame,
const KURL& url,
@@ -60,10 +108,16 @@ void MainThreadWorkletGlobalScope::FetchAndInvokeScript(
// moduleURLRecord, moduleResponsesMap, credentialOptions, outsideSettings,
// and insideSettings when it asynchronously completes."
// TODO(nhiroki): Replace this with module script loading.
- WorkletScriptLoader* script_loader =
- WorkletScriptLoader::Create(GetFrame()->GetDocument()->Fetcher(), this);
- loader_map_.Set(script_loader, pending_tasks);
- script_loader->FetchScript(module_url_record);
+ String nonce = "";
+ ParserDisposition parser_state = kNotParserInserted;
+ WebURLRequest::FetchCredentialsMode credentials_mode =
+ WebURLRequest::kFetchCredentialsModeOmit;
+ Modulator* modulator = Modulator::From(ScriptController()->GetScriptState());
+ ModuleScriptFetchRequest module_request(module_url_record, nonce,
+ parser_state, credentials_mode);
+
+ WorkletModuleTreeClient* client = new WorkletModuleTreeClient(pending_tasks);
+ modulator->FetchTree(module_request, client);
}
void MainThreadWorkletGlobalScope::EvaluateScript(
@@ -73,49 +127,10 @@ void MainThreadWorkletGlobalScope::EvaluateScript(
NOTREACHED();
}
-// TODO(nhiroki): Add tests for termination.
void MainThreadWorkletGlobalScope::TerminateWorkletGlobalScope() {
- for (auto it = loader_map_.begin(); it != loader_map_.end();) {
- WorkletScriptLoader* script_loader = it->key;
- // Cancel() eventually calls NotifyWorkletScriptLoadingFinished() and
- // removes |it| from |loader_map_|, so increment it in advance.
- ++it;
- script_loader->Cancel();
- }
Dispose();
}
-// 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 MainThreadWorkletGlobalScope::NotifyWorkletScriptLoadingFinished(
- WorkletScriptLoader* script_loader,
- const ScriptSourceCode& source_code) {
- DCHECK(IsMainThread());
- auto it = loader_map_.find(script_loader);
- DCHECK(it != loader_map_.end());
- WorkletPendingTasks* pending_tasks = it->value;
- loader_map_.erase(it);
-
- 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().
- // TODO(nhiroki): Queue a task instead of executing this here.
- pending_tasks->Abort();
- return;
- }
-
- // Step 4: "Run a module script given script."
- ScriptController()->Evaluate(source_code);
-
- // Step 5: "Queue a task on outsideSettings's responsible event loop to run
- // these steps:"
- // The steps are implemented in WorkletPendingTasks::DecrementCounter().
- // TODO(nhiroki): Queue a task instead of executing this here.
- pending_tasks->DecrementCounter();
-}
-
void MainThreadWorkletGlobalScope::AddConsoleMessage(
ConsoleMessage* console_message) {
GetFrame()->Console().AddMessage(console_message);
@@ -130,7 +145,6 @@ CoreProbeSink* MainThreadWorkletGlobalScope::GetProbeSink() {
}
DEFINE_TRACE(MainThreadWorkletGlobalScope) {
- visitor->Trace(loader_map_);
WorkletGlobalScope::Trace(visitor);
ContextClient::Trace(visitor);
}

Powered by Google App Engine
This is Rietveld 408576698