Add DocumentFragment getElementById

This commit is contained in:
Karl Seguin
2025-08-08 17:05:22 +08:00
parent fbd40a6514
commit df292a2103
3 changed files with 23 additions and 1 deletions

View File

@@ -83,6 +83,11 @@ pub const DocumentFragment = struct {
.include_root = false, .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"); const testing = @import("../../testing.zig");

View File

@@ -44,7 +44,9 @@ const testing = @import("../../testing.zig");
test "Browser.DOM.ShadowRoot" { test "Browser.DOM.ShadowRoot" {
defer testing.reset(); defer testing.reset();
var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = "" }); var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html =
\\ <div id=conflict>nope</div>
});
defer runner.deinit(); defer runner.deinit();
try runner.testCases(&.{ try runner.testCases(&.{
@@ -70,4 +72,12 @@ test "Browser.DOM.ShadowRoot" {
.{ "sr2.host == div2", "true" }, .{ "sr2.host == div2", "true" },
.{ "div2.shadowRoot", "null" }, // null when attached with 'closed' .{ "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" },
}, .{});
} }

View File

@@ -1418,6 +1418,13 @@ pub fn nodeSetEmbedderData(node: *Node, data: *anyopaque) void {
c._dom_node_set_embedder_data(node, data); 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. // nodeToElement is an helper to convert a node to an element.
pub inline fn nodeToElement(node: *Node) *Element { pub inline fn nodeToElement(node: *Node) *Element {
return @as(*Element, @ptrCast(node)); return @as(*Element, @ptrCast(node));