From 0d9482ccbf7e856a74abfde860a11cb00e1c273f Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 25 May 2026 18:16:44 +0800 Subject: [PATCH] Immediately run deferred inline scripts after "load" is fired Currently, any inline deferred script, e.g: That happens AFTER load, never executes. Unclear how serious an issue this is, but it _does_ cause problems for some WPT tests which use document.write to inject a block after an iframe is loaded. --- src/browser/ScriptManager.zig | 10 ++++- .../tests/element/html/script/postload.html | 37 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/browser/tests/element/html/script/postload.html diff --git a/src/browser/ScriptManager.zig b/src/browser/ScriptManager.zig index 742a38e2..445b41f6 100644 --- a/src/browser/ScriptManager.zig +++ b/src/browser/ScriptManager.zig @@ -210,7 +210,13 @@ pub fn addFromElement(self: *ScriptManager, comptime from_parser: bool, script_e }; const is_blocking = mode == .normal; - if (is_blocking == false) { + + // Once parsing is done, the deferred-script batch has already drained and + // won't run again, so a non-blocking script inserted afterwards would go + // unprocessed. Run it immediately instead. Remote scripts still need to + // be queued so they execute when their fetch completes. + const run_immediately = is_blocking or (self.base.static_scripts_done and remote_url == null); + if (run_immediately == false) { self.base.scriptList(script).append(&script.node); } @@ -278,7 +284,7 @@ pub fn addFromElement(self: *ScriptManager, comptime from_parser: bool, script_e handover = true; } - if (is_blocking == false) { + if (run_immediately == false) { return; } diff --git a/src/browser/tests/element/html/script/postload.html b/src/browser/tests/element/html/script/postload.html new file mode 100644 index 00000000..b56933d4 --- /dev/null +++ b/src/browser/tests/element/html/script/postload.html @@ -0,0 +1,37 @@ + + + + + +