@@ -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