Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save nicolo-ribaudo/2e1ac26f562d18578d19e268006e6559 to your computer and use it in GitHub Desktop.
Save nicolo-ribaudo/2e1ac26f562d18578d19e268006e6559 to your computer and use it in GitHub Desktop.
chrome worker import map
From bc1e34f1a3be4cd8ab92f35c67c9ac7306da934d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= <[email protected]>
Date: Sun, 16 Feb 2025 01:17:14 +0100
Subject: [PATCH 1/2] Define `importMap` option in webidl
---
.../renderer/bindings/generated_in_core.gni | 4 +++
.../blink/renderer/core/workers/worker.idl | 2 +-
.../renderer/core/workers/worker_options.idl | 5 ++++
.../constructors/Worker/importMap-option.html | 29 +++++++++++++++++++
4 files changed, 39 insertions(+), 1 deletion(-)
create mode 100644 third_party/blink/web_tests/external/wpt/workers/constructors/Worker/importMap-option.html
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni
index 3f2171dcaaff5..caf4e2ef4aa3d 100644
--- a/third_party/blink/renderer/bindings/generated_in_core.gni
+++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -160,6 +160,8 @@ generated_dictionary_sources_in_core = [
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_custom_event_init.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_custom_layout_constraints_options.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_custom_layout_constraints_options.h",
+ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_dedicated_worker_options.cc",
+ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_dedicated_worker_options.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_deferred_request_init.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_deferred_request_init.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_timeline_options.cc",
@@ -667,6 +669,8 @@ generated_enumeration_sources_in_core = [
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_url_pattern_component.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_visibility_state.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_visibility_state.h",
+ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker_import_map_inheritance.cc",
+ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker_import_map_inheritance.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker_type.cc",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker_type.h",
"$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_xml_http_request_response_type.cc",
diff --git a/third_party/blink/renderer/core/workers/worker.idl b/third_party/blink/renderer/core/workers/worker.idl
index f7c33042177e3..24bf59ee784d4 100644
--- a/third_party/blink/renderer/core/workers/worker.idl
+++ b/third_party/blink/renderer/core/workers/worker.idl
@@ -32,7 +32,7 @@
Exposed=(Window,DedicatedWorker),
ImplementedAs=DedicatedWorker
] interface Worker : EventTarget {
- [CallWith=ExecutionContext, RaisesException] constructor(ScriptURLString scriptURL, optional WorkerOptions options = {});
+ [CallWith=ExecutionContext, RaisesException] constructor(ScriptURLString scriptURL, optional DedicatedWorkerOptions options = {});
void terminate();
[CallWith=ScriptState, RaisesException] void postMessage(any message, sequence<object> transfer);
diff --git a/third_party/blink/renderer/core/workers/worker_options.idl b/third_party/blink/renderer/core/workers/worker_options.idl
index 69c1ba949f97d..ff21de947bb6e 100644
--- a/third_party/blink/renderer/core/workers/worker_options.idl
+++ b/third_party/blink/renderer/core/workers/worker_options.idl
@@ -9,4 +9,9 @@ dictionary WorkerOptions {
DOMString name = "";
};
+dictionary DedicatedWorkerOptions : WorkerOptions {
+ WorkerImportMapInheritance importMap = "none";
+};
+
enum WorkerType { "classic", "module" };
+enum WorkerImportMapInheritance { "none", "clone" };
diff --git a/third_party/blink/web_tests/external/wpt/workers/constructors/Worker/importMap-option.html b/third_party/blink/web_tests/external/wpt/workers/constructors/Worker/importMap-option.html
new file mode 100644
index 0000000000000..e6f967e9fd3f4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/workers/constructors/Worker/importMap-option.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>Test values passed to Worker's importMap option.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ test(() => {
+ new Worker("../../support/Worker-common.js", {
+ importMap: "none",
+ });
+ }, "Test .importMap: 'none'.");
+
+ test(() => {
+ new Worker("../../support/Worker-common.js", {
+ importMap: "clone",
+ });
+ }, "Test .importMap: 'clone'.");
+
+ test(() => {
+ assert_throws_js(
+ TypeError,
+ function () {
+ new Worker("../../support/Worker-common.js", {
+ importMap: "invalid",
+ });
+ },
+ "Should throw for invalid values"
+ );
+ }, "Test invalid .importMap value.");
+</script>
--
2.49.0
From 7f00d3b8126cf73107ac4b8269551aa3f477f206 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= <[email protected]>
Date: Mon, 10 Mar 2025 18:57:34 +0100
Subject: [PATCH 2/2] wip
---
.../blink/renderer/core/script/import_map.cc | 11 +++++++++++
.../blink/renderer/core/script/import_map.h | 2 ++
.../blink/renderer/core/script/modulator.cc | 5 +++++
.../blink/renderer/core/script/modulator.h | 2 ++
.../renderer/core/workers/dedicated_worker.cc | 17 ++++++++++++++---
.../renderer/core/workers/dedicated_worker.h | 10 +++++-----
6 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/third_party/blink/renderer/core/script/import_map.cc b/third_party/blink/renderer/core/script/import_map.cc
index e3c8f1b7ecb9c..4b73ffe778638 100644
--- a/third_party/blink/renderer/core/script/import_map.cc
+++ b/third_party/blink/renderer/core/script/import_map.cc
@@ -835,4 +835,15 @@ void ImportMap::InitializeScopesVector() {
});
}
+
+ImportMap* ImportMap::Clone() const {
+ SpecifierMap sorted_and_normalized_imports(imports_);
+ ScopesMap normalized_scopes_map(scopes_map_);
+ IntegrityMap normalized_integrity_map(integrity_);
+ return MakeGarbageCollected<ImportMap>(
+ std::move(sorted_and_normalized_imports),
+ std::move(normalized_scopes_map),
+ std::move(normalized_integrity_map));
+}
+
} // namespace blink
diff --git a/third_party/blink/renderer/core/script/import_map.h b/third_party/blink/renderer/core/script/import_map.h
index d77f4ae7fd87c..15615a77d1d77 100644
--- a/third_party/blink/renderer/core/script/import_map.h
+++ b/third_party/blink/renderer/core/script/import_map.h
@@ -82,6 +82,8 @@ class CORE_EXPORT ImportMap final : public GarbageCollected<ImportMap> {
void Trace(Visitor*) const {}
+ ImportMap* Clone() const;
+
private:
using MatchResult = SpecifierMap::const_iterator;
diff --git a/third_party/blink/renderer/core/script/modulator.cc b/third_party/blink/renderer/core/script/modulator.cc
index 7cb702648bac7..98ea72d0d2fa2 100644
--- a/third_party/blink/renderer/core/script/modulator.cc
+++ b/third_party/blink/renderer/core/script/modulator.cc
@@ -72,4 +72,9 @@ void Modulator::Trace(Visitor* visitor) const {
visitor->Trace(import_map_);
}
+
+ImportMap* Modulator::CloneImportMap() const {
+ return import_map_.Get()->Clone();
+}
+
} // namespace blink
diff --git a/third_party/blink/renderer/core/script/modulator.h b/third_party/blink/renderer/core/script/modulator.h
index ee325168ec6a0..8c8f2a3279ed1 100644
--- a/third_party/blink/renderer/core/script/modulator.h
+++ b/third_party/blink/renderer/core/script/modulator.h
@@ -192,6 +192,8 @@ class CORE_EXPORT Modulator : public GarbageCollected<Modulator>,
const ImportMap* GetImportMapForTest() const { return import_map_.Get(); }
+ ImportMap* CloneImportMap() const;
+
enum class AcquiringImportMapsState {
// The flag is true.
kAcquiring,
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.cc b/third_party/blink/renderer/core/workers/dedicated_worker.cc
index 592879c725828..94406b495dfde 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker.cc
@@ -46,6 +46,7 @@
#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"
+#include "third_party/blink/renderer/core/script/pending_import_map.h"
#include "third_party/blink/renderer/core/script/script.h"
#include "third_party/blink/renderer/core/script_type_names.h"
#include "third_party/blink/renderer/core/workers/custom_event_message.h"
@@ -70,7 +71,7 @@ namespace blink {
DedicatedWorker* DedicatedWorker::Create(ExecutionContext* context,
const String& url,
- const WorkerOptions* options,
+ const DedicatedWorkerOptions* options,
ExceptionState& exception_state) {
DCHECK(context->IsContextThread());
UseCounter::Count(context, WebFeature::kWorkerStart);
@@ -87,6 +88,16 @@ DedicatedWorker* DedicatedWorker::Create(ExecutionContext* context,
return nullptr;
}
+ ImportMap* import_map = nullptr;
+ if (options->importMap() == V8WorkerImportMapInheritance::Enum::kClone) {
+ Modulator* modulator = Modulator::From(
+ // TODO: To<LocalDOMWindow> -- what about nested workers?
+ ToScriptStateForMainWorld(To<LocalDOMWindow>(context)->GetFrame()));
+ if (!modulator)
+ return nullptr; // TODO: Correct?
+ import_map = modulator->CloneImportMap();
+ }
+
if (context->IsWorkerGlobalScope())
UseCounter::Count(context, WebFeature::kNestedDedicatedWorker);
@@ -99,7 +110,7 @@ DedicatedWorker* DedicatedWorker::Create(ExecutionContext* context,
DedicatedWorker::DedicatedWorker(ExecutionContext* context,
const KURL& script_request_url,
- const WorkerOptions* options)
+ const DedicatedWorkerOptions* options)
: DedicatedWorker(
context,
script_request_url,
@@ -112,7 +123,7 @@ DedicatedWorker::DedicatedWorker(ExecutionContext* context,
DedicatedWorker::DedicatedWorker(
ExecutionContext* context,
const KURL& script_request_url,
- const WorkerOptions* options,
+ const DedicatedWorkerOptions* options,
base::FunctionRef<DedicatedWorkerMessagingProxy*(DedicatedWorker*)>
context_proxy_factory)
: AbstractWorker(context),
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.h b/third_party/blink/renderer/core/workers/dedicated_worker.h
index 080ae5a831156..0d862357bc683 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker.h
+++ b/third_party/blink/renderer/core/workers/dedicated_worker.h
@@ -23,7 +23,7 @@
#include "third_party/blink/public/platform/web_dedicated_worker_host_factory_client.h"
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_structured_serialize_options.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_worker_options.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_dedicated_worker_options.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/dom/events/event_listener.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h"
@@ -68,17 +68,17 @@ class CORE_EXPORT DedicatedWorker final
public:
static DedicatedWorker* Create(ExecutionContext*,
const String& url,
- const WorkerOptions*,
+ const DedicatedWorkerOptions*,
ExceptionState&);
DedicatedWorker(ExecutionContext*,
const KURL& script_request_url,
- const WorkerOptions*);
+ const DedicatedWorkerOptions*);
// Exposed for testing.
DedicatedWorker(
ExecutionContext*,
const KURL& script_request_url,
- const WorkerOptions*,
+ const DedicatedWorkerOptions*,
base::FunctionRef<DedicatedWorkerMessagingProxy*(DedicatedWorker*)>
context_proxy_factory);
~DedicatedWorker() override;
@@ -217,7 +217,7 @@ class CORE_EXPORT DedicatedWorker final
blink::DedicatedWorkerToken token_;
const KURL script_request_url_;
- Member<const WorkerOptions> options_;
+ Member<const DedicatedWorkerOptions> options_;
Member<const FetchClientSettingsObjectSnapshot>
outside_fetch_client_settings_object_;
const Member<DedicatedWorkerMessagingProxy> context_proxy_;
--
2.49.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment