From df292a21035fbcc1b324269f3c30eb5ca244d4a7 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 8 Aug 2025 17:05:22 +0800 Subject: [PATCH] Add DocumentFragment getElementById --- src/browser/dom/document_fragment.zig | 5 +++++ src/browser/dom/shadow_root.zig | 12 +++++++++++- src/browser/netsurf.zig | 7 +++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/browser/dom/document_fragment.zig b/src/browser/dom/document_fragment.zig index 10245624..d447c687 100644 --- a/src/browser/dom/document_fragment.zig +++ b/src/browser/dom/document_fragment.zig @@ -83,6 +83,11 @@ pub const DocumentFragment = struct { .include_root = false, }); } + + pub fn _getElementById(self: *parser.DocumentFragment, id: []const u8) !?ElementUnion { + const e = try parser.nodeGetElementById(@alignCast(@ptrCast(self)), id) orelse return null; + return try Element.toInterface(e); + } }; const testing = @import("../../testing.zig"); diff --git a/src/browser/dom/shadow_root.zig b/src/browser/dom/shadow_root.zig index 45305923..7d806855 100644 --- a/src/browser/dom/shadow_root.zig +++ b/src/browser/dom/shadow_root.zig @@ -44,7 +44,9 @@ const testing = @import("../../testing.zig"); test "Browser.DOM.ShadowRoot" { defer testing.reset(); - var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = "" }); + var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = + \\
nope
+ }); defer runner.deinit(); try runner.testCases(&.{ @@ -70,4 +72,12 @@ test "Browser.DOM.ShadowRoot" { .{ "sr2.host == div2", "true" }, .{ "div2.shadowRoot", "null" }, // null when attached with 'closed' }, .{}); + + try runner.testCases(&.{ + .{ "sr2.getElementById('conflict')", "null" }, + .{ "const n1 = document.createElement('div')", null }, + .{ "n1.id = 'conflict'", null}, + .{ "sr2.append(n1)", null}, + .{ "sr2.getElementById('conflict') == n1", "true" }, + }, .{}); } diff --git a/src/browser/netsurf.zig b/src/browser/netsurf.zig index 72eedee7..a8099c07 100644 --- a/src/browser/netsurf.zig +++ b/src/browser/netsurf.zig @@ -1418,6 +1418,13 @@ pub fn nodeSetEmbedderData(node: *Node, data: *anyopaque) void { c._dom_node_set_embedder_data(node, data); } +pub fn nodeGetElementById(node: *Node, id: []const u8) !?*Element { + var el: ?*Element = undefined; + const str_id = try strFromData(id); + try DOMErr(c._dom_find_element_by_id(node, str_id, &el)); + return el; +} + // nodeToElement is an helper to convert a node to an element. pub inline fn nodeToElement(node: *Node) *Element { return @as(*Element, @ptrCast(node));