[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