Skip to content

Commit df292a2

Browse files
committed
Add DocumentFragment getElementById
1 parent fbd40a6 commit df292a2

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

src/browser/dom/document_fragment.zig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ pub const DocumentFragment = struct {
8383
.include_root = false,
8484
});
8585
}
86+
87+
pub fn _getElementById(self: *parser.DocumentFragment, id: []const u8) !?ElementUnion {
88+
const e = try parser.nodeGetElementById(@alignCast(@ptrCast(self)), id) orelse return null;
89+
return try Element.toInterface(e);
90+
}
8691
};
8792

8893
const testing = @import("../../testing.zig");

src/browser/dom/shadow_root.zig

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ const testing = @import("../../testing.zig");
4444
test "Browser.DOM.ShadowRoot" {
4545
defer testing.reset();
4646

47-
var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = "" });
47+
var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html =
48+
\\ <div id=conflict>nope</div>
49+
});
4850
defer runner.deinit();
4951

5052
try runner.testCases(&.{
@@ -70,4 +72,12 @@ test "Browser.DOM.ShadowRoot" {
7072
.{ "sr2.host == div2", "true" },
7173
.{ "div2.shadowRoot", "null" }, // null when attached with 'closed'
7274
}, .{});
75+
76+
try runner.testCases(&.{
77+
.{ "sr2.getElementById('conflict')", "null" },
78+
.{ "const n1 = document.createElement('div')", null },
79+
.{ "n1.id = 'conflict'", null},
80+
.{ "sr2.append(n1)", null},
81+
.{ "sr2.getElementById('conflict') == n1", "true" },
82+
}, .{});
7383
}

src/browser/netsurf.zig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1418,6 +1418,13 @@ pub fn nodeSetEmbedderData(node: *Node, data: *anyopaque) void {
14181418
c._dom_node_set_embedder_data(node, data);
14191419
}
14201420

1421+
pub fn nodeGetElementById(node: *Node, id: []const u8) !?*Element {
1422+
var el: ?*Element = undefined;
1423+
const str_id = try strFromData(id);
1424+
try DOMErr(c._dom_find_element_by_id(node, str_id, &el));
1425+
return el;
1426+
}
1427+
14211428
// nodeToElement is an helper to convert a node to an element.
14221429
pub inline fn nodeToElement(node: *Node) *Element {
14231430
return @as(*Element, @ptrCast(node));

0 commit comments

Comments
 (0)