diff --git a/src/browser/tests/node/replace_child.html b/src/browser/tests/node/replace_child.html index 18832fd9..45ed1bc5 100644 --- a/src/browser/tests/node/replace_child.html +++ b/src/browser/tests/node/replace_child.html @@ -37,4 +37,7 @@ testing.expectEqual(null, c2.parentNode); assertChildren([c3, c4], d1) assertChildren([], d2) + + testing.expectEqual(c3, d1.replaceChild(c3, c3)); + assertChildren([c3, c4], d1) diff --git a/src/browser/webapi/Node.zig b/src/browser/webapi/Node.zig index 79277f07..7db3d4aa 100644 --- a/src/browser/webapi/Node.zig +++ b/src/browser/webapi/Node.zig @@ -500,6 +500,21 @@ pub fn replaceChild(self: *Node, new_child: *Node, old_child: *Node, page: *Page try validateNodeInsertion(self, new_child); + // special case: we replace a node by itself + if (new_child == old_child) { + page.domChanged(); + + if (page.hasMutationObservers()) { + const parent = new_child._parent.?; + const previous_sibling = new_child.previousSibling(); + const next_sibling = new_child.nextSibling(); + const replaced = [_]*Node{new_child}; + page.childListChange(parent, &replaced, &replaced, previous_sibling, next_sibling); + } + + return old_child; + } + _ = try self.insertBefore(new_child, old_child, page); page.removeNode(self, old_child, .{ .will_be_reconnected = false }); return old_child;