[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

ap at apple.com ap at apple.com
Wed Dec 22 13:40:10 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit b4aa58a4ac4ed3ba0863f5bf5bfd57c8efe108a9
Author: ap at apple.com <ap at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Sep 22 23:12:06 2010 +0000

            Reviewed by Adam Barth.
    
            https://bugs.webkit.org/show_bug.cgi?id=46222
            <rdar://problem/8461701> Document.getElementById() malfunctions if ID was changed via Attr node modification.
    
            Test: fast/dom/Attr/change-id-via-attr-node-value.html
    
            * dom/Attr.h:
            * dom/Attr.cpp:
            (WebCore::Attr::setValue): Separated a version callable from WebCore from one avaiable to JS.
            Attr::setValue() can be called from Element::setAttribute(), and we don't want to update
            m_elementsById (or to call attributeChanged()) twice in that case.
            (WebCore::Attr::childrenChanged): If Attr's node children change, id changes.
    
            * dom/Document.cpp: (WebCore::Document::removeElementById): Added an assertion that we are
            not trying to remove something that isn't there. If we are, we probably failed to update
            m_elementsById earlier.
    
            * dom/Element.cpp: (WebCore::Element::setAttribute): If the attribute has an Attr node, its
            children should be updated to match attribute value.
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68096 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index bc228a3..382348a 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,16 @@
+2010-09-22  Alexey Proskuryakov  <ap at apple.com>
+
+        Reviewed by Adam Barth.
+
+        https://bugs.webkit.org/show_bug.cgi?id=46222
+        <rdar://problem/8461701> Document.getElementById() malfunctions if ID was changed via Attr node modification.
+
+        Firefox fails many of the subtests, because it doesn't let one manipulate child nodes of Attr.
+        We allow that, so we need to pass them.
+
+        * fast/dom/Attr/change-id-via-attr-node-value-expected.txt: Added.
+        * fast/dom/Attr/change-id-via-attr-node-value.html: Added.
+
 2010-09-22  Tony Chang  <tony at chromium.org>
 
         Reviewed by Dimitri Glazkov.
diff --git a/LayoutTests/fast/dom/Attr/change-id-via-attr-node-value-expected.txt b/LayoutTests/fast/dom/Attr/change-id-via-attr-node-value-expected.txt
new file mode 100644
index 0000000..62fb9a8
--- /dev/null
+++ b/LayoutTests/fast/dom/Attr/change-id-via-attr-node-value-expected.txt
@@ -0,0 +1,170 @@
+Test that different ways of changing an element's id all work properly.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+1. Check id after parsing.
+PASS document.getElementById("a") is document.body
+PASS document.body.id is "a"
+PASS document.body.getAttributeNode("id").isId is true
+PASS document.body.getAttributeNode("id").textContent is "a"
+
+2. Change Attr.value.
+PASS document.getElementById("a") is null
+PASS document.getElementById("b") is document.body
+PASS document.body.getAttributeNode("id").textContent is "b"
+
+3. Change HTMLElement.id.
+PASS document.getElementById("b") is null
+PASS document.getElementById("c") is document.body
+PASS document.body.getAttributeNode("id").textContent is "c"
+
+4. Change id attribute via setAttribute().
+PASS document.getElementById("c") is null
+PASS document.getElementById("d") is document.body
+PASS document.body.getAttributeNode("id").textContent is "d"
+
+5. Change id attribute via setAttributeNS().
+PASS document.getElementById("d") is null
+PASS document.getElementById("e") is document.body
+PASS document.body.getAttributeNode("id").textContent is "e"
+
+6. Change Attr.nodeValue.
+PASS document.getElementById("e") is null
+PASS document.getElementById("f") is document.body
+PASS document.body.id is "f"
+PASS document.body.getAttribute("id") is "f"
+PASS attrNode.textContent is "f"
+PASS attrNode.childNodes.length is 1
+
+7. Attr.replaceChild().
+PASS document.getElementById("f") is null
+PASS document.getElementById("g") is document.body
+PASS document.body.id is "g"
+PASS document.body.getAttribute("id") is "g"
+PASS attrNode.textContent is "g"
+PASS attrNode.childNodes.length is 1
+
+8. Attr.insertBefore().
+PASS document.getElementById("g") is null
+PASS document.getElementById("0g") is document.body
+PASS document.body.id is "0g"
+PASS document.body.getAttribute("id") is "0g"
+PASS attrNode.textContent is "0g"
+PASS attrNode.childNodes.length is 2
+
+9. attr.appendChild().
+PASS document.getElementById("0g") is null
+PASS document.getElementById("0g2") is document.body
+PASS document.body.id is "0g2"
+PASS document.body.getAttribute("id") is "0g2"
+PASS attrNode.textContent is "0g2"
+PASS attrNode.childNodes.length is 3
+
+10. Attr.removeChild()
+PASS document.body.getAttributeNode("id").childNodes.length is 0
+PASS document.getElementById("h") is null
+PASS document.getElementById("") is null
+PASS document.body.id is ""
+PASS document.body.getAttribute("id") is ""
+PASS document.body.getAttributeNode("id").textContent is ""
+
+11. Changing Text.nodeValue.
+PASS attrNode.firstChild.nodeValue is "i"
+PASS document.getElementById("i") is document.body
+PASS document.body.id is "i"
+PASS document.body.getAttribute("id") is "i"
+PASS attrNode.textContent is "i"
+PASS attrNode.childNodes.length is 1
+
+12. Chnaging Attr.textContent.
+PASS document.getElementById("i") is null
+PASS document.getElementById("hi") is document.body
+PASS document.body.id is "hi"
+PASS document.body.getAttribute("id") is "hi"
+PASS attrNode.textContent is "hi"
+PASS attrNode.childNodes.length is 1
+
+13. Text.splitText().
+PASS document.getElementById("hi") is document.body
+PASS document.body.id is "hi"
+PASS document.body.getAttribute("id") is "hi"
+PASS document.body.getAttributeNode("id").textContent is "hi"
+PASS document.body.getAttributeNode("id").childNodes.length is 2
+
+14. Node.normalize(), joining text nodes.
+PASS document.getElementById("hi") is document.body
+PASS document.body.id is "hi"
+PASS document.body.getAttribute("id") is "hi"
+PASS document.body.getAttributeNode("id").textContent is "hi"
+PASS document.body.getAttributeNode("id").childNodes.length is 1
+
+15. Changing Attr.nodeValue.
+PASS document.getElementById("hi") is null
+PASS document.getElementById("j") is document.body
+PASS document.body.id is "j"
+PASS document.body.getAttribute("id") is "j"
+PASS attrNode.textContent is "j"
+PASS attrNode.childNodes.length is 1
+
+16. Changing Text.data.
+PASS document.getElementById("j") is null
+PASS document.getElementById("k") is document.body
+PASS document.body.id is "k"
+PASS document.body.getAttribute("id") is "k"
+PASS attrNode.textContent is "k"
+PASS attrNode.childNodes.length is 1
+
+17. Changing text child with appendData().
+PASS document.getElementById("k") is null
+PASS document.getElementById("kl") is document.body
+PASS document.body.id is "kl"
+PASS document.body.getAttribute("id") is "kl"
+PASS attrNode.textContent is "kl"
+PASS attrNode.childNodes.length is 1
+
+18. Changing text child with insertData().
+PASS document.getElementById("kl") is null
+PASS document.getElementById("k1l") is document.body
+PASS document.body.id is "k1l"
+PASS document.body.getAttribute("id") is "k1l"
+PASS attrNode.textContent is "k1l"
+PASS attrNode.childNodes.length is 1
+
+19. Changing text child with deleteData().
+PASS document.getElementById("k1l") is null
+PASS document.getElementById("l") is document.body
+PASS document.body.id is "l"
+PASS document.body.getAttribute("id") is "l"
+PASS attrNode.textContent is "l"
+PASS attrNode.childNodes.length is 1
+
+20. Changing text child with replaceData().
+PASS document.getElementById("l") is null
+PASS document.getElementById("mn") is document.body
+PASS document.body.id is "mn"
+PASS document.body.getAttribute("id") is "mn"
+PASS attrNode.textContent is "mn"
+PASS attrNode.childNodes.length is 1
+
+21. Remove an Attr node.
+PASS document.body.id is ""
+PASS document.getElementById("mn") is null
+PASS document.body.getAttribute("id") is null
+PASS document.body.getAttributeNode("id") is null
+
+22. Add an Attr node.
+PASS document.getElementById("o") is document.body
+PASS document.body.id is "o"
+PASS document.body.getAttribute("id") is "o"
+
+23. Add an Attr node over an existing one.
+PASS document.getElementById("o") is null
+PASS document.getElementById("p") is document.body
+PASS document.body.id is "p"
+PASS document.body.getAttribute("id") is "p"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/Attr/change-id-via-attr-node-value.html b/LayoutTests/fast/dom/Attr/change-id-via-attr-node-value.html
new file mode 100644
index 0000000..c4e97bd
--- /dev/null
+++ b/LayoutTests/fast/dom/Attr/change-id-via-attr-node-value.html
@@ -0,0 +1,223 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body id="a">
+<p id="description"></p>
+<div id="console"></div>
+<script>
+
+description("Test that different ways of changing an element's id all work properly.");
+
+debug("\n1. Check id after parsing.");
+shouldBe('document.getElementById("a")', 'document.body');
+shouldBe('document.body.id', '"a"');
+shouldBe('document.body.getAttributeNode("id").isId', 'true');
+shouldBe('document.body.getAttributeNode("id").textContent', '"a"');
+
+debug("\n2. Change Attr.value.");
+document.body.getAttributeNode("id").value = "b";
+shouldBe('document.getElementById("a")', 'null');
+shouldBe('document.getElementById("b")', 'document.body');
+shouldBe('document.body.getAttributeNode("id").textContent', '"b"');
+
+debug("\n3. Change HTMLElement.id.");
+document.body.id = "c";
+shouldBe('document.getElementById("b")', 'null');
+shouldBe('document.getElementById("c")', 'document.body');
+shouldBe('document.body.getAttributeNode("id").textContent', '"c"');
+
+debug("\n4. Change id attribute via setAttribute().");
+document.body.setAttribute("id", "d");
+shouldBe('document.getElementById("c")', 'null');
+shouldBe('document.getElementById("d")', 'document.body');
+shouldBe('document.body.getAttributeNode("id").textContent', '"d"');
+
+debug("\n5. Change id attribute via setAttributeNS().");
+document.body.setAttributeNS(null, "id", "e");
+shouldBe('document.getElementById("d")', 'null');
+shouldBe('document.getElementById("e")', 'document.body');
+shouldBe('document.body.getAttributeNode("id").textContent', '"e"');
+
+var attrNode = document.body.getAttributeNode("id");
+
+debug("\n6. Change Attr.nodeValue.");
+document.body.getAttributeNode("id").nodeValue = "f";
+shouldBe('document.getElementById("e")', 'null');
+shouldBe('document.getElementById("f")', 'document.body');
+shouldBe('document.body.id', '"f"');
+shouldBe('document.body.getAttribute("id")', '"f"');
+shouldBe('attrNode.textContent', '"f"');
+shouldBe('attrNode.childNodes.length', '1');
+
+// Firefox doesn't support these for Attr nodes.
+debug("\n7. Attr.replaceChild().");
+try {
+    attrNode.replaceChild(document.createTextNode("g"), attrNode.firstChild);
+    shouldBe('document.getElementById("f")', 'null');
+    shouldBe('document.getElementById("g")', 'document.body');
+    shouldBe('document.body.id', '"g"');
+    shouldBe('document.body.getAttribute("id")', '"g"');
+    shouldBe('attrNode.textContent', '"g"');
+    shouldBe('attrNode.childNodes.length', '1');
+} catch (ex) {
+    debug(ex);
+}
+
+debug("\n8. Attr.insertBefore().");
+try {
+    attrNode.insertBefore(document.createTextNode("0"), attrNode.firstChild);
+    shouldBe('document.getElementById("g")', 'null');
+    shouldBe('document.getElementById("0g")', 'document.body');
+    shouldBe('document.body.id', '"0g"');
+    shouldBe('document.body.getAttribute("id")', '"0g"');
+    shouldBe('attrNode.textContent', '"0g"');
+    shouldBe('attrNode.childNodes.length', '2');
+} catch (ex) {
+    debug(ex);
+}
+
+debug("\n9. attr.appendChild().");
+try {
+    attrNode.appendChild(document.createTextNode("2"));
+    shouldBe('document.getElementById("0g")', 'null');
+    shouldBe('document.getElementById("0g2")', 'document.body');
+    shouldBe('document.body.id', '"0g2"');
+    shouldBe('document.body.getAttribute("id")', '"0g2"');
+    shouldBe('attrNode.textContent', '"0g2"');
+    shouldBe('attrNode.childNodes.length', '3');
+} catch (ex) {
+    debug(ex);
+}
+
+debug("\n10. Attr.removeChild()");
+attrNode.nodeValue = "h";
+attrNode.removeChild(attrNode.firstChild);
+shouldBe('document.body.getAttributeNode("id").childNodes.length', '0');
+shouldBe('document.getElementById("h")', 'null');
+shouldBe('document.getElementById("")', 'null');
+shouldBe('document.body.id', '""');
+shouldBe('document.body.getAttribute("id")', '""');
+shouldBe('document.body.getAttributeNode("id").textContent', '""');
+
+debug("\n11. Changing Text.nodeValue.");
+attrNode.nodeValue = "h";
+attrNode.firstChild.nodeValue = "i";
+shouldBe('attrNode.firstChild.nodeValue', '"i"');
+shouldBe('document.getElementById("i")', 'document.body');
+shouldBe('document.body.id', '"i"');
+shouldBe('document.body.getAttribute("id")', '"i"');
+shouldBe('attrNode.textContent', '"i"');
+shouldBe('attrNode.childNodes.length', '1');
+
+debug("\n12. Chnaging Attr.textContent.");
+attrNode.textContent = "hi";
+shouldBe('document.getElementById("i")', 'null');
+shouldBe('document.getElementById("hi")', 'document.body');
+shouldBe('document.body.id', '"hi"');
+shouldBe('document.body.getAttribute("id")', '"hi"');
+shouldBe('attrNode.textContent', '"hi"');
+shouldBe('attrNode.childNodes.length', '1');
+
+debug("\n13. Text.splitText().");
+attrNode.firstChild.splitText(1);
+shouldBe('document.getElementById("hi")', 'document.body');
+shouldBe('document.body.id', '"hi"');
+shouldBe('document.body.getAttribute("id")', '"hi"');
+shouldBe('document.body.getAttributeNode("id").textContent', '"hi"');
+shouldBe('document.body.getAttributeNode("id").childNodes.length', '2');
+
+debug("\n14. Node.normalize(), joining text nodes.");
+attrNode.normalize();
+shouldBe('document.getElementById("hi")', 'document.body');
+shouldBe('document.body.id', '"hi"');
+shouldBe('document.body.getAttribute("id")', '"hi"');
+shouldBe('document.body.getAttributeNode("id").textContent', '"hi"');
+shouldBe('document.body.getAttributeNode("id").childNodes.length', '1');
+
+debug("\n15. Changing Attr.nodeValue.");
+attrNode.nodeValue = "foo";
+attrNode.firstChild.replaceWholeText("j");
+shouldBe('document.getElementById("hi")', 'null');
+shouldBe('document.getElementById("j")', 'document.body');
+shouldBe('document.body.id', '"j"');
+shouldBe('document.body.getAttribute("id")', '"j"');
+shouldBe('attrNode.textContent', '"j"');
+shouldBe('attrNode.childNodes.length', '1');
+
+debug("\n16. Changing Text.data.");
+attrNode.firstChild.data = "k";
+shouldBe('document.getElementById("j")', 'null');
+shouldBe('document.getElementById("k")', 'document.body');
+shouldBe('document.body.id', '"k"');
+shouldBe('document.body.getAttribute("id")', '"k"');
+shouldBe('attrNode.textContent', '"k"');
+shouldBe('attrNode.childNodes.length', '1');
+
+debug("\n17. Changing text child with appendData().");
+attrNode.firstChild.appendData("l");
+shouldBe('document.getElementById("k")', 'null');
+shouldBe('document.getElementById("kl")', 'document.body');
+shouldBe('document.body.id', '"kl"');
+shouldBe('document.body.getAttribute("id")', '"kl"');
+shouldBe('attrNode.textContent', '"kl"');
+shouldBe('attrNode.childNodes.length', '1');
+
+debug("\n18. Changing text child with insertData().");
+attrNode.firstChild.insertData(1, "1");
+shouldBe('document.getElementById("kl")', 'null');
+shouldBe('document.getElementById("k1l")', 'document.body');
+shouldBe('document.body.id', '"k1l"');
+shouldBe('document.body.getAttribute("id")', '"k1l"');
+shouldBe('attrNode.textContent', '"k1l"');
+shouldBe('attrNode.childNodes.length', '1');
+
+debug("\n19. Changing text child with deleteData().");
+attrNode.firstChild.deleteData(0, 2);
+shouldBe('document.getElementById("k1l")', 'null');
+shouldBe('document.getElementById("l")', 'document.body');
+shouldBe('document.body.id', '"l"');
+shouldBe('document.body.getAttribute("id")', '"l"');
+shouldBe('attrNode.textContent', '"l"');
+shouldBe('attrNode.childNodes.length', '1');
+
+debug("\n20. Changing text child with replaceData().");
+attrNode.firstChild.replaceData(0, 1, "mn");
+shouldBe('document.getElementById("l")', 'null');
+shouldBe('document.getElementById("mn")', 'document.body');
+shouldBe('document.body.id', '"mn"');
+shouldBe('document.body.getAttribute("id")', '"mn"');
+shouldBe('attrNode.textContent', '"mn"');
+shouldBe('attrNode.childNodes.length', '1');
+
+debug("\n21. Remove an Attr node.");
+document.body.removeAttributeNode(attrNode);
+shouldBe('document.body.id', '""');
+shouldBe('document.getElementById("mn")', 'null');
+shouldBe('document.body.getAttribute("id")', 'null');
+shouldBe('document.body.getAttributeNode("id")', 'null');
+
+debug("\n22. Add an Attr node.");
+var attrNode = document.createAttribute("id");
+attrNode.value = "o";
+document.body.setAttributeNode(attrNode);
+shouldBe('document.getElementById("o")', 'document.body');
+shouldBe('document.body.id', '"o"');
+shouldBe('document.body.getAttribute("id")', '"o"');
+
+debug("\n23. Add an Attr node over an existing one.");
+var attrNode = document.createAttribute("id");
+attrNode.value = "p";
+document.body.setAttributeNode(attrNode);
+shouldBe('document.getElementById("o")', 'null');
+shouldBe('document.getElementById("p")', 'document.body');
+shouldBe('document.body.id', '"p"');
+shouldBe('document.body.getAttribute("id")', '"p"');
+
+var successfullyParsed = true;
+</script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 1bf3720..38d3110 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,26 @@
+2010-09-22  Alexey Proskuryakov  <ap at apple.com>
+
+        Reviewed by Adam Barth.
+
+        https://bugs.webkit.org/show_bug.cgi?id=46222
+        <rdar://problem/8461701> Document.getElementById() malfunctions if ID was changed via Attr node modification.
+
+        Test: fast/dom/Attr/change-id-via-attr-node-value.html
+
+        * dom/Attr.h:
+        * dom/Attr.cpp:
+        (WebCore::Attr::setValue): Separated a version callable from WebCore from one avaiable to JS.
+        Attr::setValue() can be called from Element::setAttribute(), and we don't want to update
+        m_elementsById (or to call attributeChanged()) twice in that case.
+        (WebCore::Attr::childrenChanged): If Attr's node children change, id changes.
+
+        * dom/Document.cpp: (WebCore::Document::removeElementById): Added an assertion that we are
+        not trying to remove something that isn't there. If we are, we probably failed to update
+        m_elementsById earlier.
+
+        * dom/Element.cpp: (WebCore::Element::setAttribute): If the attribute has an Attr node, its
+        children should be updated to match attribute value.
+
 2010-09-22  David Hyatt  <hyatt at apple.com>
 
         Reviewed by Dan Bernstein.
diff --git a/WebCore/dom/Attr.cpp b/WebCore/dom/Attr.cpp
index 59daa59..f497394 100644
--- a/WebCore/dom/Attr.cpp
+++ b/WebCore/dom/Attr.cpp
@@ -117,13 +117,21 @@ String Attr::nodeValue() const
     return value();
 }
 
-void Attr::setValue(const AtomicString& value, ExceptionCode&)
+void Attr::setValue(const AtomicString& value)
 {
     m_ignoreChildrenChanged++;
     removeChildren();
     m_attribute->setValue(value);
     createTextChild();
     m_ignoreChildrenChanged--;
+}
+
+void Attr::setValue(const AtomicString& value, ExceptionCode&)
+{
+    if (m_element && m_element->isIdAttributeName(m_attribute->name()))
+        m_element->updateId(m_element->getIdAttribute(), value);
+
+    setValue(value);
 
     if (m_element)
         m_element->attributeChanged(m_attribute.get());
@@ -167,7 +175,10 @@ void Attr::childrenChanged(bool changedByParser, Node* beforeChange, Node* after
         if (n->isTextNode())
             val += static_cast<Text *>(n)->data();
     }
-    
+
+    if (m_element && m_element->isIdAttributeName(m_attribute->name()))
+        m_element->updateId(m_attribute->value(), val);
+
     m_attribute->setValue(val.impl());
     if (m_element)
         m_element->attributeChanged(m_attribute.get());
diff --git a/WebCore/dom/Attr.h b/WebCore/dom/Attr.h
index 2e02a02..e76d2fa 100644
--- a/WebCore/dom/Attr.h
+++ b/WebCore/dom/Attr.h
@@ -48,6 +48,7 @@ public:
 
     const AtomicString& value() const { return m_attribute->value(); }
     void setValue(const AtomicString&, ExceptionCode&);
+    void setValue(const AtomicString&);
 
     Attribute* attr() const { return m_attribute.get(); }
     const QualifiedName& qualifiedName() const { return m_attribute->name(); }
diff --git a/WebCore/dom/Document.cpp b/WebCore/dom/Document.cpp
index 194d4e1..1bac384 100644
--- a/WebCore/dom/Document.cpp
+++ b/WebCore/dom/Document.cpp
@@ -1208,8 +1208,10 @@ void Document::removeElementById(const AtomicString& elementId, Element* element
 
     if (m_elementsById.get(elementId.impl()) == element)
         m_elementsById.remove(elementId.impl());
-    else
+    else {
+        ASSERT(m_inRemovedLastRefFunction || m_duplicateIds.contains(elementId.impl()));
         m_duplicateIds.remove(elementId.impl());
+    }
 }
 
 Element* Document::getElementByAccessKey(const String& key) const
diff --git a/WebCore/dom/Element.cpp b/WebCore/dom/Element.cpp
index 5f53c2d..0ba2e88 100644
--- a/WebCore/dom/Element.cpp
+++ b/WebCore/dom/Element.cpp
@@ -578,7 +578,10 @@ void Element::setAttribute(const AtomicString& name, const AtomicString& value,
     else if (!old && !value.isNull())
         m_attributeMap->addAttribute(createAttribute(QualifiedName(nullAtom, localName, nullAtom), value));
     else if (old && !value.isNull()) {
-        old->setValue(value);
+        if (Attr* attrNode = old->attr())
+            attrNode->setValue(value);
+        else
+            old->setValue(value);
         attributeChanged(old);
     }
 
@@ -608,7 +611,10 @@ void Element::setAttribute(const QualifiedName& name, const AtomicString& value,
     else if (!old && !value.isNull())
         m_attributeMap->addAttribute(createAttribute(name, value));
     else if (old) {
-        old->setValue(value);
+        if (Attr* attrNode = old->attr())
+            attrNode->setValue(value);
+        else
+            old->setValue(value);
         attributeChanged(old);
     }
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list