diff options
-rw-r--r-- | cli/tests/integration/run_tests.rs | 5 | ||||
-rw-r--r-- | cli/tests/testdata/delete_window.js | 1 | ||||
-rw-r--r-- | ext/web/02_event.js | 6 | ||||
-rw-r--r-- | runtime/worker.rs | 17 |
4 files changed, 25 insertions, 4 deletions
diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index 2f32fd67f..74a03e055 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -2480,6 +2480,11 @@ itest!(import_assertions_type_check { exit_code: 1, }); +itest!(delete_window { + args: "run delete_window.js", + output_str: Some("true\n"), +}); + itest!(colors_without_global_this { args: "run colors_without_globalThis.js", output_str: Some("true\n"), diff --git a/cli/tests/testdata/delete_window.js b/cli/tests/testdata/delete_window.js new file mode 100644 index 000000000..f2f16820d --- /dev/null +++ b/cli/tests/testdata/delete_window.js @@ -0,0 +1 @@ +console.log(delete globalThis.window); diff --git a/ext/web/02_event.js b/ext/web/02_event.js index f9a69c625..7ba5afa27 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -970,7 +970,11 @@ webidl.requiredArguments(arguments.length, 1, { prefix: "Failed to execute 'dispatchEvent' on 'EventTarget'", }); - const self = this ?? globalThis; + // If `this` is not present, then fallback to global scope. We don't use + // `globalThis` directly here, because it could be deleted by user. + // Instead use saved reference to global scope when the script was + // executed. + const self = this ?? window; const { listeners } = self[eventTargetData]; if (!(event.type in listeners)) { diff --git a/runtime/worker.rs b/runtime/worker.rs index ad31cacc6..7a3a6c1c3 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -313,7 +313,13 @@ impl MainWorker { &mut self, script_name: &str, ) -> Result<(), AnyError> { - self.execute_script(script_name, "window.dispatchEvent(new Event('load'))") + self.execute_script( + script_name, + // NOTE(@bartlomieju): not using `globalThis` here, because user might delete + // it. Instead we're using global `dispatchEvent` function which will + // used a saved reference to global scope. + "dispatchEvent(new Event('load'))", + ) } /// Dispatches "unload" event to the JavaScript runtime. @@ -323,8 +329,13 @@ impl MainWorker { &mut self, script_name: &str, ) -> Result<(), AnyError> { - self - .execute_script(script_name, "window.dispatchEvent(new Event('unload'))") + self.execute_script( + script_name, + // NOTE(@bartlomieju): not using `globalThis` here, because user might delete + // it. Instead we're using global `dispatchEvent` function which will + // used a saved reference to global scope. + "dispatchEvent(new Event('unload'))", + ) } } |