1
0
Fork 0
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:
Bartek Iwańczuk 2022-01-18 00:13:14 +01:00 committed by GitHub
parent bc666e42a8
commit b10563cb20
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 4 deletions

View file

@ -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
View file

@ -0,0 +1 @@
console.log(delete globalThis.window);

View file

@ -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)) {

View file

@ -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'))",
)
}
}