diff options
author | Andreu Botella <abb@randomunok.com> | 2021-10-11 09:50:18 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-11 18:50:18 +0200 |
commit | fbcbbd7ae3fa2d57e8ad026a1f9f01c6d07fd80b (patch) | |
tree | 807662617f36ec1da967c4c56733307fffe25a81 | |
parent | c40d5040cd577aa4ebe552242a06163fbcbc3d4b (diff) |
fix(runtime): Declare `Window.self` and `DedicatedWorkerGlobalScope.name` with `util.writable()` (#12378)
`Window`'s `self` property and `DedicatedWorkerGlobalScope`'s `name`
property are defined as Web IDL read-only attributes with the
`[Replaceable]` extended attribute, meaning that their setter will
redefine the property as a data property with the set value, rather than
changing some internal state. Deno currently defines them as read-only
data properties instead.
Given that Web IDL requires all attributes to be accessor properties
rather than data properties, but Deno exposes almost all of those
properties as either read-only or writable data properties, it makes
sense to expose `[Replaceable]` properties as writable as well – as is
already the case with `WindowOrWorkerGlobalScope`'s `performance`
property.
-rw-r--r-- | cli/tests/integration/run_tests.rs | 7 | ||||
-rw-r--r-- | cli/tests/testdata/replace_self.js | 21 | ||||
-rw-r--r-- | cli/tests/testdata/replace_self.js.out | 4 | ||||
-rw-r--r-- | runtime/js/99_main.js | 4 | ||||
-rw-r--r-- | tools/wpt/expectation.json | 2 |
5 files changed, 35 insertions, 3 deletions
diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index f247aa93f..f469bb364 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -1185,6 +1185,13 @@ itest!(error_import_map_unable_to_load { exit_code: 1, }); +// Test that setting `self` in the main thread to some other value doesn't break +// the world. +itest!(replace_self { + args: "run replace_self.js", + output: "replace_self.js.out", +}); + itest!(worker_event_handler_test { args: "run --quiet --reload --allow-read worker_event_handler_test.js", output: "worker_event_handler_test.js.out", diff --git a/cli/tests/testdata/replace_self.js b/cli/tests/testdata/replace_self.js new file mode 100644 index 000000000..cfd473cd3 --- /dev/null +++ b/cli/tests/testdata/replace_self.js @@ -0,0 +1,21 @@ +// Test that setting `self` in the main thread to some other value doesn't break +// the world, in particular for events fired on the global scope. + +// deno-lint-ignore no-global-assign +self = null; + +addEventListener("load", () => { + console.log("load event (event listener)"); +}); + +addEventListener("unload", () => { + console.log("unload event (event listener)"); +}); + +globalThis.onload = () => { + console.log("load event (event handler)"); +}; + +globalThis.onunload = () => { + console.log("unload event (event handler)"); +}; diff --git a/cli/tests/testdata/replace_self.js.out b/cli/tests/testdata/replace_self.js.out new file mode 100644 index 000000000..aaffb5a62 --- /dev/null +++ b/cli/tests/testdata/replace_self.js.out @@ -0,0 +1,4 @@ +load event (event listener) +load event (event handler) +unload event (event listener) +unload event (event handler) diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 32732923b..a895b0c57 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -475,7 +475,7 @@ delete Object.prototype.__proto__; location: location.locationDescriptor, Window: globalInterfaces.windowConstructorDescriptor, window: util.readOnly(globalThis), - self: util.readOnly(globalThis), + self: util.writable(globalThis), Navigator: util.nonEnumerable(Navigator), navigator: { configurable: true, @@ -628,7 +628,7 @@ delete Object.prototype.__proto__; ObjectDefineProperties(globalThis, unstableWindowOrWorkerGlobalScope); } ObjectDefineProperties(globalThis, workerRuntimeGlobalProperties); - ObjectDefineProperties(globalThis, { name: util.readOnly(name) }); + ObjectDefineProperties(globalThis, { name: util.writable(name) }); if (runtimeOptions.enableTestingFeaturesFlag) { ObjectDefineProperty( globalThis, diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json index 511e1ddad..8e631f471 100644 --- a/tools/wpt/expectation.json +++ b/tools/wpt/expectation.json @@ -27840,7 +27840,7 @@ "headers-normalize.any.html": true, "headers-record.any.html": true, "headers-structure.any.html": true, - "headers-basic.any.worker.html": false, + "headers-basic.any.worker.html": true, "headers-casing.any.worker.html": true, "headers-combine.any.worker.html": true, "headers-errors.any.worker.html": true, |