From ca574df3beb6ada903229f0f5b8fe1fd84274a82 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 22 Jul 2025 07:54:39 +0800 Subject: [PATCH] Prevent double-execution of script tags. Depends on https://github.com/lightpanda-io/libdom/pull/31 --- src/browser/netsurf.zig | 12 ++++++++++++ src/browser/page.zig | 21 +++++++++++++++++++++ vendor/netsurf/libdom | 2 +- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/browser/netsurf.zig b/src/browser/netsurf.zig index abec0859..6de7ea90 100644 --- a/src/browser/netsurf.zig +++ b/src/browser/netsurf.zig @@ -2885,3 +2885,15 @@ pub fn buttonGetType(button: *Button) ![]const u8 { const s = s_ orelse return "button"; return strToData(s); } + +pub fn scriptGetProcessed(script: *Script) !bool { + var processed: bool = false; + const err = c.dom_html_script_element_get_processed(script, &processed); + try DOMErr(err); + return processed; +} + +pub fn scriptSetProcessed(script: *Script, processed: bool) !void { + const err = c.dom_html_script_element_set_processed(script, processed); + try DOMErr(err); +} diff --git a/src/browser/page.zig b/src/browser/page.zig index f96d5791..aece1cbe 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -451,6 +451,12 @@ pub const Page = struct { // if no src is present, we evaluate the text source. // https://html.spec.whatwg.org/multipage/scripting.html#script-processing-model fn tryEvalScript(self: *Page, script: *const Script) !void { + if (try script.alreadyProcessed()) { + return; + } + + try script.markAsProcessed(); + const html_doc = self.window.document; try parser.documentHTMLSetCurrentScript(html_doc, @ptrCast(script.element)); @@ -998,6 +1004,21 @@ const Script = struct { return null; } + // If a script tag gets dynamically created and added to the dom: + // document.getElementsByTagName('head')[0].appendChild(script) + // that script tag will immediately get executed by our scriptAddedCallback. + // However, if the location where the script tag is inserted happens to be + // below where processHTMLDoc curently is, then we'll re-run that same script + // again in processHTMLDoc. This flag is used to let us know if a specific + //