summaryrefslogtreecommitdiff
path: root/ext/web/02_event.js
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-03-08 21:08:54 -0400
committerGitHub <noreply@github.com>2023-03-09 01:08:54 +0000
commit0f9df733499da4dea563342fc19e842f04bd7a40 (patch)
tree80706ade73ecb407072fbce133065b2c7ce37cea /ext/web/02_event.js
parent25d98ca289af64f85759fe10c8808afbfb7011e3 (diff)
perf: don't add unload event listener (#18082)
This commit changes how "unload" event is handled - before this commit an event listener was added unconditionally in the runtime bootstrapping function, which for some reason was very expensive (0.3ms). Instead of adding an event listener, a check was added to "dispatchEvent" function that performs the same action (so it's only called if there's an event dispatched).
Diffstat (limited to 'ext/web/02_event.js')
-rw-r--r--ext/web/02_event.js9
1 files changed, 9 insertions, 0 deletions
diff --git a/ext/web/02_event.js b/ext/web/02_event.js
index 40731af4c..dd8b4f57b 100644
--- a/ext/web/02_event.js
+++ b/ext/web/02_event.js
@@ -1056,6 +1056,15 @@ class EventTarget {
prefix: "Failed to execute 'dispatchEvent' on 'EventTarget'",
});
+ // This is an optimization to avoid creating an event listener
+ // on each startup.
+ // Stores the flag for checking whether unload is dispatched or not.
+ // This prevents the recursive dispatches of unload events.
+ // See https://github.com/denoland/deno/issues/9201.
+ if (event.type === "unload" && self === globalThis_) {
+ globalThis_[SymbolFor("isUnloadDispatched")] = true;
+ }
+
const { listeners } = self[eventTargetData];
if (!ReflectHas(listeners, event.type)) {
setTarget(event, this);