diff --git a/src/browser/tests/node/node.html b/src/browser/tests/node/node.html index 9305bf87..72c51748 100644 --- a/src/browser/tests/node/node.html +++ b/src/browser/tests/node/node.html @@ -189,3 +189,24 @@ testing.expectEqual(8, Node.COMMENT_NODE); testing.expectEqual(11, Node.DOCUMENT_FRAGMENT_NODE); + +
+ diff --git a/src/browser/webapi/Node.zig b/src/browser/webapi/Node.zig index 8e65a5e9..596dc554 100644 --- a/src/browser/webapi/Node.zig +++ b/src/browser/webapi/Node.zig @@ -259,14 +259,23 @@ const GetRootNodeOpts = struct { }; pub fn getRootNode(self: *const Node, opts_: ?GetRootNodeOpts) *const Node { const opts = opts_ orelse GetRootNodeOpts{}; - if (opts.composed) { - log.warn(.not_implemented, "Node.getRootNode", .{ .feature = "composed" }); - } var root = self; while (root._parent) |parent| { root = parent; } + + // If composed is true, traverse through shadow boundaries + if (opts.composed) { + while (true) { + const shadow_root = @constCast(root).is(ShadowRoot) orelse break; + root = shadow_root.getHost().asNode(); + while (root._parent) |parent| { + root = parent; + } + } + } + return root; }