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));