Implement NamedNodeMap::setNamedItem() in terms of Element::setAttributeNode() instea...
authorcaio.oliveira@openbossa.org <caio.oliveira@openbossa.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Mar 2012 22:48:03 +0000 (22:48 +0000)
committercaio.oliveira@openbossa.org <caio.oliveira@openbossa.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Mar 2012 22:48:03 +0000 (22:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=80188

Reviewed by Ryosuke Niwa.

Using setNamedItem() in setAttributeNode() implementation made us do unnecessary
checks like whether the element existed or whether the given node was an
attribute. So now setAttributeNode() do less work.

No new tests were added, functionality should be unchanged.

* dom/Element.cpp:
(WebCore::Element::setAttributeNode):
(WebCore::Element::setAttributeNodeNS):
* dom/Element.h:
(Element):
(WebCore::Element::attributes): We got rid of ensureUpdatedAttributes(), next in
line will be updatedAttributes().
* dom/NamedNodeMap.cpp:
(WebCore::NamedNodeMap::setNamedItem):

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

Source/WebCore/ChangeLog
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/Element.h
Source/WebCore/dom/NamedNodeMap.cpp

index c64d247..212ddfa 100644 (file)
@@ -1,3 +1,26 @@
+2012-03-02  Caio Marcelo de Oliveira Filho  <caio.oliveira@openbossa.org>
+
+        Implement NamedNodeMap::setNamedItem() in terms of Element::setAttributeNode() instead of the other way round
+        https://bugs.webkit.org/show_bug.cgi?id=80188
+
+        Reviewed by Ryosuke Niwa.
+
+        Using setNamedItem() in setAttributeNode() implementation made us do unnecessary
+        checks like whether the element existed or whether the given node was an
+        attribute. So now setAttributeNode() do less work.
+
+        No new tests were added, functionality should be unchanged.
+
+        * dom/Element.cpp:
+        (WebCore::Element::setAttributeNode):
+        (WebCore::Element::setAttributeNodeNS):
+        * dom/Element.h:
+        (Element):
+        (WebCore::Element::attributes): We got rid of ensureUpdatedAttributes(), next in
+        line will be updatedAttributes().
+        * dom/NamedNodeMap.cpp:
+        (WebCore::NamedNodeMap::setNamedItem):
+
 2012-03-02  SravanKumar Sandela  <ssandela@innominds.com>
 
         Layout issue with fieldset legend element
index add6f46..58f98ed 100644 (file)
@@ -1374,16 +1374,34 @@ PassRefPtr<Attr> Element::setAttributeNode(Attr* attr, ExceptionCode& ec)
         ec = TYPE_MISMATCH_ERR;
         return 0;
     }
-    return static_pointer_cast<Attr>(ensureUpdatedAttributes()->setNamedItem(attr, ec));
+
+    ElementAttributeData* attributeData = ensureUpdatedAttributeData();
+    Attribute* attribute = attr->attr();
+    size_t index = attributeData->getAttributeItemIndex(attribute->name());
+    Attribute* oldAttribute = index != notFound ? attributeData->attributeItem(index) : 0;
+    if (oldAttribute == attribute)
+        return attr; // we know about it already
+
+    // INUSE_ATTRIBUTE_ERR: Raised if node is an Attr that is already an attribute of another Element object.
+    // The DOM user must explicitly clone Attr nodes to re-use them in other elements.
+    if (attr->ownerElement()) {
+        ec = INUSE_ATTRIBUTE_ERR;
+        return 0;
+    }
+
+    RefPtr<Attr> oldAttr;
+    if (oldAttribute) {
+        oldAttr = oldAttribute->createAttrIfNeeded(this);
+        attributeData->replaceAttribute(index, attribute, this);
+    } else
+        attributeData->addAttribute(attribute, this);
+
+    return oldAttr.release();
 }
 
 PassRefPtr<Attr> Element::setAttributeNodeNS(Attr* attr, ExceptionCode& ec)
 {
-    if (!attr) {
-        ec = TYPE_MISMATCH_ERR;
-        return 0;
-    }
-    return static_pointer_cast<Attr>(ensureUpdatedAttributes()->setNamedItem(attr, ec));
+    return setAttributeNode(attr, ec);
 }
 
 PassRefPtr<Attr> Element::removeAttributeNode(Attr* attr, ExceptionCode& ec)
index 9d24b98..d9cfca8 100644 (file)
@@ -228,9 +228,8 @@ public:
     void setBooleanAttribute(const QualifiedName& name, bool);
 
     // For exposing to DOM only.
-    NamedNodeMap* attributes() const { return ensureUpdatedAttributes(); }
+    NamedNodeMap* attributes() const;
 
-    NamedNodeMap* ensureUpdatedAttributes() const;
     NamedNodeMap* updatedAttributes() const;
 
     // This method is called whenever an attribute is added, changed or removed.
@@ -530,7 +529,7 @@ inline Element* Element::nextElementSibling() const
     return static_cast<Element*>(n);
 }
 
-inline NamedNodeMap* Element::ensureUpdatedAttributes() const
+inline NamedNodeMap* Element::attributes() const
 {
     updateInvalidAttributes();
     if (!m_attributeMap)
index c7a83e5..7244647 100644 (file)
@@ -103,29 +103,8 @@ PassRefPtr<Node> NamedNodeMap::setNamedItem(Node* node, ExceptionCode& ec)
         ec = HIERARCHY_REQUEST_ERR;
         return 0;
     }
-    Attr* attr = static_cast<Attr*>(node);
-
-    Attribute* attribute = attr->attr();
-    size_t index = m_attributeData.getAttributeItemIndex(attribute->name());
-    Attribute* oldAttribute = index != notFound ? m_attributeData.attributeItem(index) : 0;
-    if (oldAttribute == attribute)
-        return node; // we know about it already
-
-    // INUSE_ATTRIBUTE_ERR: Raised if node is an Attr that is already an attribute of another Element object.
-    // The DOM user must explicitly clone Attr nodes to re-use them in other elements.
-    if (attr->ownerElement()) {
-        ec = INUSE_ATTRIBUTE_ERR;
-        return 0;
-    }
-
-    RefPtr<Attr> oldAttr;
-    if (oldAttribute) {
-        oldAttr = oldAttribute->createAttrIfNeeded(m_element);
-        m_attributeData.replaceAttribute(index, attribute, m_element);
-    } else
-        m_attributeData.addAttribute(attribute, m_element);
 
-    return oldAttr.release();
+    return m_element->setAttributeNode(static_cast<Attr*>(node), ec);
 }
 
 PassRefPtr<Node> NamedNodeMap::setNamedItemNS(Node* node, ExceptionCode& ec)