WebCore:
authorandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 May 2006 16:27:49 +0000 (16:27 +0000)
committerandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 May 2006 16:27:49 +0000 (16:27 +0000)
2006-05-23  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Maciej.

        http://bugzilla.opendarwin.org/show_bug.cgi?id=9017
        Weather2.css incorrectly treated as JavaScript file @ www.live.com

        * dom/Element.cpp:
        (WebCore::Element::getAttribute):
        (WebCore::Element::setAttribute):
        (WebCore::Element::removeAttribute):
        (WebCore::Element::getAttributeNode):
        (WebCore::Element::hasAttribute):
        Use new getAttributeItem method.

        * dom/NamedAttrMap.cpp:
        (WebCore::NamedAttrMap::getNamedItem):
        (WebCore::NamedAttrMap::removeNamedItem):
        Use new getAttributeItem method.

        (WebCore::NamedAttrMap::getAttributeItem):
        * dom/NamedAttrMap.h:
        New method which returns the attribute based on the nodeName.

LayoutTests:

2006-05-23  Anders Carlsson  <acarlsson@apple.com>

        Reviewed by Maciej.

        Update tests for http://bugzilla.opendarwin.org/show_bug.cgi?id=9017
        Weather2.css incorrectly treated as JavaScript file @ www.live.com

        * dom/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_nist_dmstc-expected.txt:
        This fails in a different way now.

        * dom/xhtml/level3/core/nodelookupnamespaceuri17-expected.txt:
        * dom/xhtml/level3/core/nodelookupnamespaceuri20-expected.txt:
        * dom/xhtml/level3/core/nodelookupprefix17-expected.txt:
        * dom/xhtml/level3/core/nodelookupprefix20-expected.txt:
        * dom/xhtml/level3/core/noderemovechild28-expected.txt:
        * dom/xhtml/level3/core/noderemovechild29-expected.txt:
        These now pass.

        * fast/dom/attribute-namespaces-get-set-expected.txt: Added.
        * fast/dom/attribute-namespaces-get-set.html: Added.
        Add new tests.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@14534 268f45cc-cd09-0410-ab3c-d52691b4dbfc

14 files changed:
LayoutTests/ChangeLog
LayoutTests/dom/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_nist_dmstc-expected.txt
LayoutTests/dom/xhtml/level3/core/nodelookupnamespaceuri17-expected.txt
LayoutTests/dom/xhtml/level3/core/nodelookupnamespaceuri20-expected.txt
LayoutTests/dom/xhtml/level3/core/nodelookupprefix17-expected.txt
LayoutTests/dom/xhtml/level3/core/nodelookupprefix20-expected.txt
LayoutTests/dom/xhtml/level3/core/noderemovechild28-expected.txt
LayoutTests/dom/xhtml/level3/core/noderemovechild29-expected.txt
LayoutTests/fast/dom/attribute-namespaces-get-set-expected.txt [new file with mode: 0644]
LayoutTests/fast/dom/attribute-namespaces-get-set.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/dom/Element.cpp
WebCore/dom/NamedAttrMap.cpp
WebCore/dom/NamedAttrMap.h

index bb3a6c5afe86ee04b521101255f43ef7ccb9b95b..d02b38e1ebb1b2e71793f6dbeedb0705864e304d 100644 (file)
@@ -1,3 +1,25 @@
+2006-05-23  Anders Carlsson  <acarlsson@apple.com>
+
+        Reviewed by Maciej.
+
+        Update tests for http://bugzilla.opendarwin.org/show_bug.cgi?id=9017
+        Weather2.css incorrectly treated as JavaScript file @ www.live.com
+        
+        * dom/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_nist_dmstc-expected.txt:
+        This fails in a different way now.
+        
+        * dom/xhtml/level3/core/nodelookupnamespaceuri17-expected.txt:
+        * dom/xhtml/level3/core/nodelookupnamespaceuri20-expected.txt:
+        * dom/xhtml/level3/core/nodelookupprefix17-expected.txt:
+        * dom/xhtml/level3/core/nodelookupprefix20-expected.txt:
+        * dom/xhtml/level3/core/noderemovechild28-expected.txt:
+        * dom/xhtml/level3/core/noderemovechild29-expected.txt:
+        These now pass.
+        
+        * fast/dom/attribute-namespaces-get-set-expected.txt: Added.
+        * fast/dom/attribute-namespaces-get-set.html: Added.
+        Add new tests.
+
 2006-05-22  Justin Garcia  <justin.garcia@apple.com>
 
         Reviewed by levi
index cd95386c268efc9ec062ff4cca66b898a6d74e24..347f4e1de5f0ea6cc0ad319f9883715f7b56ed3d 100644 (file)
@@ -6,5 +6,5 @@ layer at (0,0) size 800x600
         RenderText {#text} at (0,0) size 345x18
           text run at (0,0) width 345: "XPathNSResolver_lookupNamespaceURI_nist_dmstc"
       RenderSVGText {text} at (0,0) size 785x18
-        RenderText {#text} at (0,0) size 469x18
-          text run at (0,0) width 469: "dmstcequal: assertEquals failed, actual http://www.usa.com, expected null."
+        RenderText {#text} at (0,0) size 341x18
+          text run at (0,0) width 341: "dmstcequal: assertEquals failed, actual , expected null."
index 2eed981591b05604f53409ebc83a48b8f7823f4f..0dabc7b00511372370340de8854cb513d2e704ab 100644 (file)
@@ -1,3 +1,2 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodelookupnamespaceuri17
-Status error
-Message        TypeError: Null value
+Status Success
index d422009ff95814e534e0da3438ce1c86bc7c5ac0..07edba9ce816476a0c257f72252fb89939a679b6 100644 (file)
@@ -1,3 +1,2 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodelookupnamespaceuri20
-Status error
-Message        TypeError: Null value
+Status Success
index 2b974632f1f41bc5d7a16b1a05a3471684bfedaf..699d35f4c3235ccc6313dc6c7dcd81a5e8be32c5 100644 (file)
@@ -1,3 +1,2 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodelookupprefix17
-Status error
-Message        TypeError: Null value
+Status Success
index d8ebf031c07248a0a0554e34ea800c193e5df587..66f125f45fbfa6a34e44dd8676329c15da197c07 100644 (file)
@@ -1,3 +1,2 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodelookupprefix20
-Status error
-Message        TypeError: Null value
+Status Success
index 4676a31cd03ae4d7bc23b149051fa805c6e03a5e..51b1f23959fa86764f1e85ba5a7f2dd5f1a8364f 100644 (file)
@@ -1,3 +1,2 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/noderemovechild28
-Status error
-Message        TypeError: Null value
+Status Success
index 2557025ff20d7133e2612ba21871c88ecfbb14fe..aa71293569d989c44ed9f056b4fdfdb58f45d82c 100644 (file)
@@ -1,3 +1,2 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/noderemovechild29
-Status error
-Message        TypeError: Null value
+Status Success
diff --git a/LayoutTests/fast/dom/attribute-namespaces-get-set-expected.txt b/LayoutTests/fast/dom/attribute-namespaces-get-set-expected.txt
new file mode 100644 (file)
index 0000000..278b5d5
--- /dev/null
@@ -0,0 +1,30 @@
+PASS: docElem.getAttribute('foo:attr') should be test and is.
+PASS: docElem.getAttribute('attr') should be test2 and is.
+PASS: docElem.getAttribute('bar:attr') should be null and is.
+PASS: docElem.hasAttribute('foo:attr') should be true and is.
+PASS: docElem.hasAttribute('attr') should be true and is.
+PASS: docElem.hasAttribute('bar:attr') should be false and is.
+PASS: docElem.getAttributeNode('foo:attr').value should be test and is.
+PASS: docElem.getAttributeNode('bar:attr') should be null and is.
+PASS: docElem.attributes.length should be 3 and is.
+PASS: docElem.attributes.length should be 3 and is.
+PASS: docElem.getAttribute('foo:attr') should be new and is.
+PASS: docElem.attributes.length should be 4 and is.
+PASS: docElem.getAttribute('bar:attr') should be new2 and is.
+PASS: docElem.getAttributeNode('bar:attr').prefix should be null and is.
+PASS: docElem.getAttributeNode('bar:attr').localName should be bar:attr and is.
+PASS: docElem.getAttribute('foo:attr') should be null and is.
+PASS: docElem.attributes.length should be 3 and is.
+PASS: docElem.getAttribute('bar:attr') should be null and is.
+PASS: docElem.attributes.length should be 2 and is.
+PASS: docElem.getAttribute('attr') should be null and is.
+PASS: docElem.attributes.length should be 1 and is.
+PASS: attributes.getNamedItem('foo:attr').value should be test and is.
+PASS: attributes.getNamedItem('attr').value should be test2 and is.
+PASS: attributes.getNamedItem('bar:attr') should be null and is.
+PASS: attributes.length should be 3 and is.
+PASS: attributes.getNamedItem('foo:attr') should be null and is.
+PASS: attributes.length should be 2 and is.
+PASS: attributes.getNamedItem('attr') should be null and is.
+PASS: attributes.length should be 1 and is.
+
diff --git a/LayoutTests/fast/dom/attribute-namespaces-get-set.html b/LayoutTests/fast/dom/attribute-namespaces-get-set.html
new file mode 100644 (file)
index 0000000..193f9ba
--- /dev/null
@@ -0,0 +1,107 @@
+<html>
+<head>
+<script>
+function debug(str) {
+    var c = document.getElementById('console')
+    c.appendChild(document.createTextNode(str + '\n'));
+}
+
+function print(message, color) 
+{
+    var paragraph = document.createElement("div");
+    paragraph.appendChild(document.createTextNode(message));
+    paragraph.style.fontFamily = "monospace";
+    if (color)
+        paragraph.style.color = color;
+    document.getElementById("console").appendChild(paragraph);
+}
+
+var element, range, nodeFilter, cssRule, cssPrimitiveValue, cssStyleDeclaration, event;
+var originalNodeConstructor;
+
+function shouldBe(a, b)
+{
+    var evalA;
+    try {
+        evalA = eval(a);
+    } catch(e) {
+        evalA = e;
+    }
+    if (evalA == b)
+        print("PASS: " + a + " should be " + b + " and is.", "green");
+    else
+        print("FAIL: " + a + " should be " + b + " but instead is " + evalA, "red");
+}
+
+function runTests() {
+    if (window.layoutTestController)
+        layoutTestController.dumpAsText();
+        
+    var src = '<root xmlns:foo="http://www.example.com" attr="test2" foo:attr="test" />';
+    var doc = (new DOMParser()).parseFromString(src, 'text/xml')
+    docElem = doc.documentElement;
+
+    // Test getAttribute
+    shouldBe("docElem.getAttribute('foo:attr')", "test");
+    shouldBe("docElem.getAttribute('attr')", "test2");
+    shouldBe("docElem.getAttribute('bar:attr')", null)
+    
+    // Test hasAttribute
+    shouldBe("docElem.hasAttribute('foo:attr')", true);
+    shouldBe("docElem.hasAttribute('attr')", true);
+    shouldBe("docElem.hasAttribute('bar:attr')", false);
+    
+    // Test getAttributeNode
+    shouldBe("docElem.getAttributeNode('foo:attr').value", "test");
+    shouldBe("docElem.getAttributeNode('bar:attr')", null);
+    
+    // Test setAttribute
+    shouldBe("docElem.attributes.length", 3);
+    docElem.setAttribute("foo:attr", "new");
+    shouldBe("docElem.attributes.length", 3);
+    shouldBe("docElem.getAttribute('foo:attr')", "new");
+
+    docElem.setAttribute("bar:attr", "new2");
+    shouldBe("docElem.attributes.length", 4);
+    shouldBe("docElem.getAttribute('bar:attr')", "new2");
+    shouldBe("docElem.getAttributeNode('bar:attr').prefix", null);
+    shouldBe("docElem.getAttributeNode('bar:attr').localName", "bar:attr");
+    
+    // Test removeAttribute
+    docElem.removeAttribute('foo:attr');
+    shouldBe("docElem.getAttribute('foo:attr')", null);
+    shouldBe("docElem.attributes.length", 3);
+    docElem.removeAttribute('bar:attr');
+    shouldBe("docElem.getAttribute('bar:attr')", null);
+    shouldBe("docElem.attributes.length", 2);
+    docElem.removeAttribute('attr');
+    shouldBe("docElem.getAttribute('attr')", null);
+    shouldBe("docElem.attributes.length", 1);
+    
+    // Re-parse the document so we can test NamedNodeMap
+    doc = (new DOMParser()).parseFromString(src, 'text/xml');
+    attributes = doc.documentElement.attributes;
+    
+    // Test getNamedItem
+    shouldBe("attributes.getNamedItem('foo:attr').value", "test");
+    shouldBe("attributes.getNamedItem('attr').value", "test2");
+    shouldBe("attributes.getNamedItem('bar:attr')", null);
+    
+    // Test removeNamedItem
+    shouldBe("attributes.length", 3);
+    attributes.removeNamedItem('foo:attr');
+    shouldBe("attributes.getNamedItem('foo:attr')", null);
+    shouldBe("attributes.length", 2);
+    attributes.removeNamedItem('attr');
+    shouldBe("attributes.getNamedItem('attr')", null);
+    shouldBe("attributes.length", 1);
+
+}
+
+</script>
+</head>
+<body onload="runTests();">
+<pre id="console">
+</pre>
+</body>
+</html>
\ No newline at end of file
index dd535e00cee5af5a00316a2ccbeab160da242bcd..1a7e2030eec479fa470b1d141f903a6d77be67e6 100644 (file)
@@ -1,3 +1,27 @@
+2006-05-23  Anders Carlsson  <acarlsson@apple.com>
+
+        Reviewed by Maciej.
+
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=9017
+        Weather2.css incorrectly treated as JavaScript file @ www.live.com
+        
+        * dom/Element.cpp:
+        (WebCore::Element::getAttribute):
+        (WebCore::Element::setAttribute):
+        (WebCore::Element::removeAttribute):
+        (WebCore::Element::getAttributeNode):
+        (WebCore::Element::hasAttribute):
+        Use new getAttributeItem method.
+        
+        * dom/NamedAttrMap.cpp:
+        (WebCore::NamedAttrMap::getNamedItem):
+        (WebCore::NamedAttrMap::removeNamedItem):
+        Use new getAttributeItem method.
+        
+        (WebCore::NamedAttrMap::getAttributeItem):
+        * dom/NamedAttrMap.h:
+        New method which returns the attribute based on the nodeName.
+
 2006-05-22  Eric Seidel  <eric@eseidel.com>
 
         Rubber-stamped by adele.
index ca9da0fbc1a2688ef36b0802b74fd1638cf465b3..81c8d84397befbf3958f5e3bc22845565013ea16 100644 (file)
@@ -293,7 +293,14 @@ static inline bool inHTMLDocument(const Element* e)
 const AtomicString& Element::getAttribute(const String& name) const
 {
     String localName = inHTMLDocument(this) ? name.lower() : name;
-    return getAttribute(QualifiedName(nullAtom, localName.impl(), nullAtom));
+    if (localName == styleAttr.localName())
+        updateStyleAttributeIfNeeded();
+    
+    if (namedAttrMap)
+        if (Attribute* a = namedAttrMap->getAttributeItem(localName))
+            return a->value();
+    
+    return nullAtom;
 }
 
 const AtomicString& Element::getAttributeNS(const String& namespaceURI, const String& localName) const
@@ -307,8 +314,32 @@ void Element::setAttribute(const String& name, const String& value, ExceptionCod
         ec = INVALID_CHARACTER_ERR;
         return;
     }
+
+    // allocate attributemap if necessary
+    Attribute* old = attributes(false)->getAttributeItem(name);
+
+    // NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly
+    if (namedAttrMap->isReadOnlyNode()) {
+        ec = NO_MODIFICATION_ALLOWED_ERR;
+        return;
+    }
+    
+    if (inDocument())
+        document()->incDOMTreeVersion();
+
     String localName = inHTMLDocument(this) ? name.lower() : name;
-    setAttribute(QualifiedName(nullAtom, localName.impl(), nullAtom), value.impl(), ec);
+
+    if (localName == idAttr.localName())
+        updateId(old ? old->value() : nullAtom, value);
+    
+    if (old && value.isNull())
+        namedAttrMap->removeAttribute(old->name());
+    else if (!old && !value.isNull())
+        namedAttrMap->addAttribute(createAttribute(QualifiedName(nullAtom, localName.impl(), nullAtom), value.impl()));
+    else if (old && !value.isNull()) {
+        old->setValue(value);
+        attributeChanged(old);
+    }
 }
 
 void Element::setAttribute(const QualifiedName& name, StringImpl* value, ExceptionCode& ec)
@@ -730,7 +761,12 @@ void Element::setAttributeNS(const String& namespaceURI, const String& qualified
 void Element::removeAttribute(const String& name, ExceptionCode& ec)
 {
     String localName = inHTMLDocument(this) ? name.lower() : name;
-    removeAttribute(QualifiedName(nullAtom, localName.impl(), nullAtom), ec);
+
+    if (namedAttrMap) {
+        namedAttrMap->removeNamedItem(localName, ec);
+        if (ec == NOT_FOUND_ERR)
+            ec = 0;
+    }
 }
 
 void Element::removeAttributeNS(const String& namespaceURI, const String& localName, ExceptionCode& ec)
@@ -744,7 +780,7 @@ PassRefPtr<Attr> Element::getAttributeNode(const String& name)
     if (!attrs)
         return 0;
     String localName = inHTMLDocument(this) ? name.lower() : name;
-    return static_pointer_cast<Attr>(attrs->getNamedItem(QualifiedName(nullAtom, localName.impl(), nullAtom)));
+    return static_pointer_cast<Attr>(attrs->getNamedItem(localName));
 }
 
 PassRefPtr<Attr> Element::getAttributeNodeNS(const String& namespaceURI, const String& localName)
@@ -761,7 +797,7 @@ bool Element::hasAttribute(const String& name) const
     if (!attrs)
         return false;
     String localName = inHTMLDocument(this) ? name.lower() : name;
-    return attrs->getAttributeItem(QualifiedName(nullAtom, localName.impl(), nullAtom));
+    return attrs->getAttributeItem(localName);
 }
 
 bool Element::hasAttributeNS(const String& namespaceURI, const String& localName) const
index 38de52edb5032986a835496a2df743f971904414..75ee4420f960de829229101c386c52e990ad34ec 100644 (file)
@@ -58,7 +58,10 @@ bool NamedAttrMap::isMappedAttributeMap() const
 PassRefPtr<Node> NamedAttrMap::getNamedItem(const String& name) const
 {
     String localName = inHTMLDocument(element) ? name.lower() : name;
-    return getNamedItem(QualifiedName(nullAtom, localName.impl(), nullAtom));
+    Attribute* a = getAttributeItem(localName);
+    if (!a) return 0;
+    
+    return a->createAttrIfNeeded(element);
 }
 
 PassRefPtr<Node> NamedAttrMap::getNamedItemNS(const String& namespaceURI, const String& localName) const
@@ -69,7 +72,13 @@ PassRefPtr<Node> NamedAttrMap::getNamedItemNS(const String& namespaceURI, const
 PassRefPtr<Node> NamedAttrMap::removeNamedItem(const String& name, ExceptionCode& ec)
 {
     String localName = inHTMLDocument(element) ? name.lower() : name;
-    return removeNamedItem(QualifiedName(nullAtom, localName.impl(), nullAtom), ec);
+    Attribute* a = getAttributeItem(localName);
+    if (!a) {
+        ec = NOT_FOUND_ERR;
+        return 0;
+    }
+    
+    return removeNamedItem(a->name(), ec);
 }
 
 PassRefPtr<Node> NamedAttrMap::removeNamedItemNS(const String& namespaceURI, const String& localName, ExceptionCode& ec)
@@ -172,6 +181,19 @@ PassRefPtr<Node> NamedAttrMap::item ( unsigned index ) const
     return attrs[index]->createAttrIfNeeded(element);
 }
 
+Attribute* NamedAttrMap::getAttributeItem(const String& name) const
+{
+    for (unsigned i = 0; i < len; ++i) {
+        if (!attrs[i]->name().hasPrefix() && 
+            attrs[i]->name().localName() == name)
+                return attrs[i];
+        
+        if (attrs[i]->name().toString() == name)
+            return attrs[i];
+    }
+    return 0;
+}
+
 Attribute* NamedAttrMap::getAttributeItem(const QualifiedName& name) const
 {
     for (unsigned i = 0; i < len; ++i) {
index 5739fdbd2796ee7306e3075051b2fbbca590834f..3d9f366d46ac3c96a3751b8eb036743e3e218c11 100644 (file)
@@ -63,6 +63,7 @@ public:
     // Other methods (not part of DOM)
     Attribute* attributeItem(unsigned index) const { return attrs ? attrs[index] : 0; }
     Attribute* getAttributeItem(const QualifiedName& name) const;
+    Attribute* getAttributeItem(const String& name) const;
     virtual bool isReadOnlyNode() { return element ? element->isReadOnlyNode() : false; }
 
     // used during parsing: only inserts if not already there