mirror of
https://github.com/denoland/deno.git
synced 2025-01-11 08:33:43 -05:00
fix(runtime): don't crash when window is deleted (#13392)
This commit fixes an error when user deletes "window" global JS variable. Instead of relying on "window" or "globalThis" to dispatch "load" and "unload" events, we are default to global scope of the worker.
This commit is contained in:
parent
bc666e42a8
commit
b10563cb20
4 changed files with 25 additions and 4 deletions
|
@ -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"),
|
||||
|
|
1
cli/tests/testdata/delete_window.js
vendored
Normal file
1
cli/tests/testdata/delete_window.js
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
console.log(delete globalThis.window);
|
|
@ -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)) {
|
||||
|
|
|
@ -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'))",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue