Browse Source

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.
Timothy Flynn 7 tháng trước cách đây
mục cha
commit
b99a3ec2df

+ 11 - 5
Libraries/LibWeb/DOM/Node.cpp

@@ -1057,15 +1057,21 @@ WebIDL::ExceptionOr<GC::Ref<Node>> Node::clone_node(Document* document, bool clo
         // Set copy’s 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 copy’s 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);

+ 1 - 1
Tests/LibWeb/Text/expected/DOM/CDATASection-cloneNode.txt

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

+ 1 - 1
Tests/LibWeb/Text/input/DOM/CDATASection-cloneNode.html

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