node: add cloneNode method

Signed-off-by: Francis Bouvier <francis.bouvier@gmail.com>
This commit is contained in:
Francis Bouvier
2023-09-26 16:23:11 +02:00
parent 07c4779676
commit 7fc6f290e7
2 changed files with 22 additions and 0 deletions

View File

@@ -129,6 +129,12 @@ pub const Node = struct {
const res = parser.nodeAppendChild(self, child);
return Node.toInterface(res);
}
pub fn _cloneNode(self: *parser.Node, deep: ?bool) Union {
const is_deep = if (deep) |deep_set| deep_set else false;
const clone = parser.nodeCloneNode(self, is_deep);
return Node.toInterface(clone);
}
};
pub const Types = generate.Tuple(.{
@@ -253,4 +259,14 @@ pub fn testExecFn(
.{ .src = "content.appendChild(link).toString()", .ex = "[object HTMLAnchorElement]" },
};
try checkCases(js_env, &node_append_child);
var node_clone = [_]Case{
.{ .src = "let clone = link.cloneNode()", .ex = "undefined" },
.{ .src = "clone.toString()", .ex = "[object HTMLAnchorElement]" },
.{ .src = "clone.parentNode === null", .ex = "true" },
.{ .src = "clone.firstChild === null", .ex = "true" },
.{ .src = "let clone_deep = link.cloneNode(true)", .ex = "undefined" },
.{ .src = "clone_deep.firstChild.nodeName === '#text'", .ex = "true" },
};
try checkCases(js_env, &node_clone);
}

View File

@@ -340,6 +340,12 @@ pub fn nodeAppendChild(node: *Node, child: *Node) *Node {
return res.?;
}
pub fn nodeCloneNode(node: *Node, is_deep: bool) *Node {
var res: ?*Node = undefined;
_ = nodeVtable(node).dom_node_clone_node.?(node, is_deep, &res);
return res.?;
}
// CharacterData
pub const CharacterData = c.dom_characterdata;