From eb453f471b451eb3ab75b8fde22f31cac3be9990 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 5 Sep 2025 23:23:31 +0800 Subject: [PATCH] Inline script tags ignore defer/async According to MDN, inline script tags should not have defer/async attributes. But some do. This ignores those attributes for inline script tags. (Previously, we were only half ignoring them. We were treating them as inline, but flagging them as deferred or async, which was causing issues with cleanup) Fixes: https://github.com/lightpanda-io/browser/issues/1014 --- src/browser/ScriptManager.zig | 4 ++-- src/browser/html/elements.zig | 4 ++++ src/tests/html/script/inline_defer.html | 27 +++++++++++++++++++++++++ src/tests/html/script/inline_defer.js | 1 + 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/tests/html/script/inline_defer.html create mode 100644 src/tests/html/script/inline_defer.js diff --git a/src/browser/ScriptManager.zig b/src/browser/ScriptManager.zig index 36d47778..780d2e67 100644 --- a/src/browser/ScriptManager.zig +++ b/src/browser/ScriptManager.zig @@ -162,8 +162,8 @@ pub fn addFromElement(self: *ScriptManager, element: *parser.Element) !void { .element = element, .source = source, .url = remote_url orelse page.url.raw, - .is_defer = try parser.elementGetAttribute(element, "defer") != null, - .is_async = try parser.elementGetAttribute(element, "async") != null, + .is_defer = if (remote_url == null) false else try parser.elementGetAttribute(element, "defer") != null, + .is_async = if (remote_url == null) false else try parser.elementGetAttribute(element, "async") != null, }; if (source == .@"inline" and self.scripts.first == null) { diff --git a/src/browser/html/elements.zig b/src/browser/html/elements.zig index c9494578..a3f667df 100644 --- a/src/browser/html/elements.zig +++ b/src/browser/html/elements.zig @@ -1480,6 +1480,10 @@ test "Browser.HTML.HTMLStyleElement" { }, .{}); } +test "Browser: HTML.HTMLScriptElement" { + try testing.htmlRunner("html/script/inline_defer.html"); +} + const Check = struct { input: []const u8, expected: ?[]const u8 = null, // Needed when input != expected diff --git a/src/tests/html/script/inline_defer.html b/src/tests/html/script/inline_defer.html new file mode 100644 index 00000000..c69c775d --- /dev/null +++ b/src/tests/html/script/inline_defer.html @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/src/tests/html/script/inline_defer.js b/src/tests/html/script/inline_defer.js new file mode 100644 index 00000000..1e0ee1a4 --- /dev/null +++ b/src/tests/html/script/inline_defer.js @@ -0,0 +1 @@ +dyn1_loaded += 1;