LibWeb: Clone CDATASection nodes with the correct node type

We were cloning these as plain Text nodes, but the clone must also be a
CDATASection node.
This commit is contained in:
Timothy Flynn 2024-11-20 08:37:14 -05:00 committed by Andreas Kling
parent 74b27d620d
commit b99a3ec2df
Notes: github-actions[bot] 2024-11-20 14:16:51 +00:00
3 changed files with 13 additions and 7 deletions

View file

@ -1057,15 +1057,21 @@ WebIDL::ExceptionOr<GC::Ref<Node>> Node::clone_node(Document* document, bool clo
// Set copys namespace, namespace prefix, local name, and value to those of node.
auto& attr = static_cast<Attr&>(*this);
copy = attr.clone(*document);
}
// NOTE: is<Text>() currently returns true only for text nodes, not for descendant types of Text.
else if (is<Text>(this) || is<CDATASection>(this)) {
} else if (is<Text>(this)) {
// Text
auto& text = static_cast<Text&>(*this);
// Set copys data to that of node.
auto text_copy = realm().create<Text>(*document, text.data());
copy = move(text_copy);
copy = [&]() -> GC::Ref<Text> {
switch (type()) {
case NodeType::TEXT_NODE:
return realm().create<Text>(*document, text.data());
case NodeType::CDATA_SECTION_NODE:
return realm().create<CDATASection>(*document, text.data());
default:
VERIFY_NOT_REACHED();
}
}();
} else if (is<Comment>(this)) {
// Comment
auto comment = verify_cast<Comment>(this);

View file

@ -1 +1 @@
Cloned CDATASection node data: PASS
Cloned #cdata-section node data: PASS

View file

@ -4,6 +4,6 @@
const xmlDocument = new DOMParser().parseFromString(`<xml></xml>`, "application/xml");
const cdata = xmlDocument.createCDATASection("PASS");
const clone = cdata.cloneNode();
println(`Cloned CDATASection node data: ${clone.data}`);
println(`Cloned ${clone.nodeName} node data: ${clone.data}`);
});
</script>