From 0f9df733499da4dea563342fc19e842f04bd7a40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 8 Mar 2023 21:08:54 -0400 Subject: 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). --- ext/web/02_event.js | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'ext') 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); -- cgit v1.2.3