2008-04-09 Antti Koivisto <antti@apple.com>
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 Apr 2008 18:36:49 +0000 (18:36 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 Apr 2008 18:36:49 +0000 (18:36 +0000)
        Reviewed by Mitz.

        Avoid unnecessary calls to virtual updateStyleAttributeIfNeeded() method.
        - do the the checking in call sites instead of inside the function
        - rename to updateStyleAttribute()
        - use namedAttrMap directly (for getting id attribute) in insertedIntoDocument/removedFromDocument
          to avoid calling attributes() which may trigger style attribute update.

        * dom/Element.cpp:
        (WebCore::Element::attributes):
        (WebCore::Element::getAttribute):
        (WebCore::Element::hasAttributes):
        (WebCore::Element::insertedIntoDocument):
        (WebCore::Element::removedFromDocument):
        * dom/Element.h:
        (WebCore::Element::updateStyleAttribute):
        * dom/NamedAttrMap.cpp:
        (WebCore::NamedAttrMap::addAttribute):
        * dom/StyledElement.cpp:
        (WebCore::StyledElement::updateStyleAttribute):
        * dom/StyledElement.h:

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

WebCore/ChangeLog
WebCore/dom/Element.cpp
WebCore/dom/Element.h
WebCore/dom/NamedAttrMap.cpp
WebCore/dom/StyledElement.cpp
WebCore/dom/StyledElement.h

index 3f99df4..d4f2820 100644 (file)
@@ -1,3 +1,27 @@
+2008-04-09  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by Mitz.
+
+        Avoid unnecessary calls to virtual updateStyleAttributeIfNeeded() method.
+        - do the the checking in call sites instead of inside the function
+        - rename to updateStyleAttribute()
+        - use namedAttrMap directly (for getting id attribute) in insertedIntoDocument/removedFromDocument 
+          to avoid calling attributes() which may trigger style attribute update.
+        
+        * dom/Element.cpp:
+        (WebCore::Element::attributes):
+        (WebCore::Element::getAttribute):
+        (WebCore::Element::hasAttributes):
+        (WebCore::Element::insertedIntoDocument):
+        (WebCore::Element::removedFromDocument):
+        * dom/Element.h:
+        (WebCore::Element::updateStyleAttribute):
+        * dom/NamedAttrMap.cpp:
+        (WebCore::NamedAttrMap::addAttribute):
+        * dom/StyledElement.cpp:
+        (WebCore::StyledElement::updateStyleAttribute):
+        * dom/StyledElement.h:
+
 2008-04-09  Timothy Hatcher  <timothy@apple.com>
 
         A more complete fix for: can't drag the Web Inspector when grabbing
index 16d8fe2..409ce26 100644 (file)
@@ -190,7 +190,8 @@ NamedAttrMap* Element::attributes() const
 
 NamedAttrMap* Element::attributes(bool readonly) const
 {
-    updateStyleAttributeIfNeeded();
+    if (!m_isStyleAttributeValid)
+        updateStyleAttribute();
     if (!readonly && !namedAttrMap)
         createAttributeMap();
     return namedAttrMap.get();
@@ -213,8 +214,8 @@ bool Element::hasAttribute(const QualifiedName& name) const
 
 const AtomicString& Element::getAttribute(const QualifiedName& name) const
 {
-    if (name == styleAttr)
-        updateStyleAttributeIfNeeded();
+    if (name == styleAttr && !m_isStyleAttributeValid)
+        updateStyleAttribute();
 
     if (namedAttrMap)
         if (Attribute* a = namedAttrMap->getAttributeItem(name))
@@ -463,8 +464,8 @@ static inline bool shouldIgnoreAttributeCase(const Element* e)
 const AtomicString& Element::getAttribute(const String& name) const
 {
     String localName = shouldIgnoreAttributeCase(this) ? name.lower() : name;
-    if (localName == styleAttr.localName())
-        updateStyleAttributeIfNeeded();
+    if (localName == styleAttr.localName() && !m_isStyleAttributeValid)
+        updateStyleAttribute();
     
     if (namedAttrMap)
         if (Attribute* a = namedAttrMap->getAttributeItem(localName))
@@ -570,7 +571,8 @@ void Element::setAttributeMap(PassRefPtr<NamedAttrMap> list)
 
 bool Element::hasAttributes() const
 {
-    updateStyleAttributeIfNeeded();
+    if (!m_isStyleAttributeValid)
+        updateStyleAttribute();
     return namedAttrMap && namedAttrMap->length() > 0;
 }
 
@@ -690,8 +692,7 @@ void Element::insertedIntoDocument()
     ContainerNode::insertedIntoDocument();
 
     if (hasID()) {
-        NamedAttrMap* attrs = attributes(true);
-        if (attrs) {
+        if (NamedAttrMap* attrs = namedAttrMap.get()) {
             Attribute* idItem = attrs->getAttributeItem(idAttr);
             if (idItem && !idItem->isNull())
                 updateId(nullAtom, idItem->value());
@@ -702,8 +703,7 @@ void Element::insertedIntoDocument()
 void Element::removedFromDocument()
 {
     if (hasID()) {
-        NamedAttrMap* attrs = attributes(true);
-        if (attrs) {
+        if (NamedAttrMap* attrs = namedAttrMap.get()) {
             Attribute* idItem = attrs->getAttributeItem(idAttr);
             if (idItem && !idItem->isNull())
                 updateId(idItem->value(), nullAtom);
index 502da12..91eb553 100644 (file)
@@ -200,7 +200,7 @@ private:
 
     virtual void createAttributeMap() const;
 
-    virtual void updateStyleAttributeIfNeeded() const {}
+    virtual void updateStyleAttribute() const {}
     
     void updateFocusAppearanceSoonAfterAttach();
     void cancelFocusAppearanceUpdate();
index c56a271..9152936 100644 (file)
@@ -261,7 +261,7 @@ void NamedAttrMap::addAttribute(PassRefPtr<Attribute> prpAttribute)
     // Note that element may be null here if we are called from insertAttr() during parsing
     if (m_element) {
         m_element->attributeChanged(attribute.get());
-        // Because of our updateStyleAttributeIfNeeded() style modification events are never sent at the right time, so don't bother sending them.
+        // Because of our updateStyleAttribute() style modification events are never sent at the right time, so don't bother sending them.
         if (attribute->name() != styleAttr) {
             m_element->dispatchAttrAdditionEvent(attribute.get());
             m_element->dispatchSubtreeModifiedEvent();
index 51a877c..137808a 100644 (file)
@@ -90,15 +90,14 @@ void StyledElement::invalidateStyleAttribute()
     m_isStyleAttributeValid = false;
 }
 
-void StyledElement::updateStyleAttributeIfNeeded() const
+void StyledElement::updateStyleAttribute() const
 {
-    if (!m_isStyleAttributeValid) {
-        m_isStyleAttributeValid = true;
-        m_synchronizingStyleAttribute = true;
-        if (m_inlineStyleDecl)
-            const_cast<StyledElement*>(this)->setAttribute(styleAttr, m_inlineStyleDecl->cssText());
-        m_synchronizingStyleAttribute = false;
-    }
+    ASSERT(!m_isStyleAttributeValid);
+    m_isStyleAttributeValid = true;
+    m_synchronizingStyleAttribute = true;
+    if (m_inlineStyleDecl)
+        const_cast<StyledElement*>(this)->setAttribute(styleAttr, m_inlineStyleDecl->cssText());
+    m_synchronizingStyleAttribute = false;
 }
 
 StyledElement::StyledElement(const QualifiedName& name, Document *doc)
index ade2848..de2f79f 100644 (file)
@@ -65,7 +65,7 @@ public:
     void createInlineStyleDecl();
     void destroyInlineStyleDecl();
     void invalidateStyleAttribute();
-    virtual void updateStyleAttributeIfNeeded() const;
+    virtual void updateStyleAttribute() const;
     
     const ClassNames& classNames() const { ASSERT(hasClass()); ASSERT(mappedAttributes()); return mappedAttributes()->classNames(); }