Skip to content

Commit b4014e8

Browse files
Fix: Properly handle node ownership when using appendChild and insertBefore
1 parent 478f3a5 commit b4014e8

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/browser/dom/node.zig

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,20 @@ pub const Node = struct {
198198
// Methods
199199

200200
pub fn _appendChild(self: *parser.Node, child: *parser.Node) !Union {
201+
const self_owner = try parser.nodeOwnerDocument(self);
202+
const new_node_owner = try parser.nodeOwnerDocument(child);
203+
204+
if (new_node_owner == null or (new_node_owner.? != self_owner.?)) {
205+
child.owner = self_owner;
206+
// recursively set the owner for all children
207+
var next: ?*parser.Node = child;
208+
while (next) |n| {
209+
next = try parser.nodeFirstChild(n) orelse break;
210+
if (next) |child_next| {
211+
child_next.owner = self_owner;
212+
}
213+
}
214+
}
201215
// TODO: DocumentFragment special case
202216
const res = try parser.nodeAppendChild(self, child);
203217
return try Node.toInterface(res);
@@ -290,6 +304,18 @@ pub const Node = struct {
290304
}
291305

292306
pub fn _insertBefore(self: *parser.Node, new_node: *parser.Node, ref_node_: ?*parser.Node) !Union {
307+
const self_owner = try parser.nodeOwnerDocument(self);
308+
const new_node_owner = try parser.nodeOwnerDocument(new_node);
309+
if (new_node_owner == null or (new_node_owner.? != self_owner.?)) {
310+
new_node.owner = self_owner;
311+
var next: ?*parser.Node = new_node;
312+
while (next) |n| {
313+
next = try parser.nodeFirstChild(n) orelse break;
314+
if (next) |child_next| {
315+
child_next.owner = self_owner;
316+
}
317+
}
318+
}
293319
if (ref_node_) |ref_node| {
294320
return Node.toInterface(try parser.nodeInsertBefore(self, new_node, ref_node));
295321
}

0 commit comments

Comments
 (0)