Changeset 106323 in webkit


Ignore:
Timestamp:
Jan 30, 2012 7:53:40 PM (12 years ago)
Author:
caio.oliveira@openbossa.org
Message:

Add ElementAttributeData class to replace internal uses of NamedNodeMap
https://bugs.webkit.org/show_bug.cgi?id=77233

Reviewed by Andreas Kling.

Move part of non-DOM functionality of NamedNodeMap into a separate class. This is
the first step toward the goal of separating NamedNodeMap from internal attribute
storage, as described in https://bugs.webkit.org/show_bug.cgi?id=75069.

The internal attribute storage is exposed as attributeData() in Element, and when
necessary (because it has no back pointer to Element) via methods in Element.

No new tests. Except from setClass() change this is just moving the code, no new
feature was added.

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • Target.pri:
  • WebCore.gypi:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/DOMAllInOne.cpp:
  • dom/Element.cpp:

(WebCore::Element::idAttributeChanged):

  • dom/Element.h:

(WebCore::Element::attributeData):
(WebCore::Element::ensureAttributeData):
(Element):
(WebCore::Element::idForStyleResolution):

  • dom/ElementAttributeData.cpp: Added.

(WebCore):
(WebCore::ElementAttributeData::setClass): the only caller of this function
already deal with the case when the element has no class, so don't do it here.

  • dom/ElementAttributeData.h: Added.

(WebCore):
(ElementAttributeData):
(WebCore::ElementAttributeData::clearClass):
(WebCore::ElementAttributeData::classNames):
(WebCore::ElementAttributeData::idForStyleResolution):
(WebCore::ElementAttributeData::setIdForStyleResolution):
(WebCore::ElementAttributeData::ElementAttributeData):

  • dom/NamedNodeMap.cpp:

(WebCore::NamedNodeMap::clearAttributes):

  • dom/NamedNodeMap.h:

(WebCore::NamedNodeMap::attributeData):
(NamedNodeMap):

  • dom/StyledElement.cpp:

(WebCore::StyledElement::classAttributeChanged):

  • dom/StyledElement.h:

(WebCore::StyledElement::classNames):

  • html/ClassList.cpp:

(WebCore::ClassList::classNames):

Location:
trunk/Source/WebCore
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r106217 r106323  
    547547    dom/EditingText.cpp
    548548    dom/Element.cpp
     549    dom/ElementAttributeData.cpp
    549550    dom/EntityReference.cpp
    550551    dom/ErrorEvent.cpp
  • trunk/Source/WebCore/ChangeLog

    r106320 r106323  
     12012-01-30  Caio Marcelo de Oliveira Filho  <caio.oliveira@openbossa.org>
     2
     3        Add ElementAttributeData class to replace internal uses of NamedNodeMap
     4        https://bugs.webkit.org/show_bug.cgi?id=77233
     5
     6        Reviewed by Andreas Kling.
     7
     8        Move part of non-DOM functionality of NamedNodeMap into a separate class. This is
     9        the first step toward the goal of separating NamedNodeMap from internal attribute
     10        storage, as described in https://bugs.webkit.org/show_bug.cgi?id=75069.
     11
     12        The internal attribute storage is exposed as attributeData() in Element, and when
     13        necessary (because it has no back pointer to Element) via methods in Element.
     14
     15        No new tests. Except from setClass() change this is just moving the code, no new
     16        feature was added.
     17
     18        * CMakeLists.txt:
     19        * GNUmakefile.list.am:
     20        * Target.pri:
     21        * WebCore.gypi:
     22        * WebCore.xcodeproj/project.pbxproj:
     23        * dom/DOMAllInOne.cpp:
     24        * dom/Element.cpp:
     25        (WebCore::Element::idAttributeChanged):
     26        * dom/Element.h:
     27        (WebCore::Element::attributeData):
     28        (WebCore::Element::ensureAttributeData):
     29        (Element):
     30        (WebCore::Element::idForStyleResolution):
     31        * dom/ElementAttributeData.cpp: Added.
     32        (WebCore):
     33        (WebCore::ElementAttributeData::setClass): the only caller of this function
     34        already deal with the case when the element has no class, so don't do it here.
     35        * dom/ElementAttributeData.h: Added.
     36        (WebCore):
     37        (ElementAttributeData):
     38        (WebCore::ElementAttributeData::clearClass):
     39        (WebCore::ElementAttributeData::classNames):
     40        (WebCore::ElementAttributeData::idForStyleResolution):
     41        (WebCore::ElementAttributeData::setIdForStyleResolution):
     42        (WebCore::ElementAttributeData::ElementAttributeData):
     43        * dom/NamedNodeMap.cpp:
     44        (WebCore::NamedNodeMap::clearAttributes):
     45        * dom/NamedNodeMap.h:
     46        (WebCore::NamedNodeMap::attributeData):
     47        (NamedNodeMap):
     48        * dom/StyledElement.cpp:
     49        (WebCore::StyledElement::classAttributeChanged):
     50        * dom/StyledElement.h:
     51        (WebCore::StyledElement::classNames):
     52        * html/ClassList.cpp:
     53        (WebCore::ClassList::classNames):
     54
    1552012-01-30  Gregg Tavares  <gman@chromium.org>
    256
  • trunk/Source/WebCore/GNUmakefile.list.am

    r106240 r106323  
    15341534        Source/WebCore/dom/Element.cpp \
    15351535        Source/WebCore/dom/Element.h \
     1536        Source/WebCore/dom/ElementAttributeData.cpp \
     1537        Source/WebCore/dom/ElementAttributeData.h \
    15361538        Source/WebCore/dom/ElementRareData.h \
    15371539        Source/WebCore/dom/Entity.h \
  • trunk/Source/WebCore/Target.pri

    r106223 r106323  
    510510    dom/EditingText.cpp \
    511511    dom/Element.cpp \
     512    dom/ElementAttributeData.cpp \
    512513    dom/EntityReference.cpp \
    513514    dom/ErrorEvent.cpp \
     
    16231624    dom/EditingText.h \
    16241625    dom/Element.h \
     1626    dom/ElementAttributeData.h \
    16251627    dom/Entity.h \
    16261628    dom/EntityReference.h \
  • trunk/Source/WebCore/WebCore.gypi

    r106223 r106323  
    596596            'dom/DocumentType.h',
    597597            'dom/Element.h',
     598            'dom/ElementAttributeData.h',
    598599            'dom/Event.h',
    599600            'dom/EventListener.h',
     
    49954996            'dom/EditingText.h',
    49964997            'dom/Element.cpp',
     4998            'dom/ElementAttributeData.cpp',
    49974999            'dom/ElementRareData.h',
    49985000            'dom/Entity.h',
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r106223 r106323  
    734734                2BE8E2C712A589EC00FAD550 /* HTMLMetaCharsetParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BE8E2C612A589EC00FAD550 /* HTMLMetaCharsetParser.h */; };
    735735                2BE8E2C912A58A0100FAD550 /* HTMLMetaCharsetParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BE8E2C812A58A0100FAD550 /* HTMLMetaCharsetParser.cpp */; };
     736                2CF6878814D32EB500340F39 /* ElementAttributeData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2CF6878714D32EB500340F39 /* ElementAttributeData.cpp */; };
     737                2CF6878A14D32EFF00340F39 /* ElementAttributeData.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CF6878914D32EFF00340F39 /* ElementAttributeData.h */; settings = {ATTRIBUTES = (Private, ); }; };
    736738                2D3A0E3613A7D76100E85AF0 /* SVGParsingError.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3A0E3513A7D76100E85AF0 /* SVGParsingError.h */; settings = {ATTRIBUTES = (Private, ); }; };
    737739                2D481F00146B5C4C00AA7834 /* CrossfadeGeneratedImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D2FC0541460CD6F00263633 /* CrossfadeGeneratedImage.cpp */; };
     
    74807482                2BE8E2C612A589EC00FAD550 /* HTMLMetaCharsetParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTMLMetaCharsetParser.h; path = parser/HTMLMetaCharsetParser.h; sourceTree = "<group>"; };
    74817483                2BE8E2C812A58A0100FAD550 /* HTMLMetaCharsetParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HTMLMetaCharsetParser.cpp; path = parser/HTMLMetaCharsetParser.cpp; sourceTree = "<group>"; };
     7484                2CF6878714D32EB500340F39 /* ElementAttributeData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ElementAttributeData.cpp; sourceTree = "<group>"; };
     7485                2CF6878914D32EFF00340F39 /* ElementAttributeData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ElementAttributeData.h; sourceTree = "<group>"; };
    74827486                2D2FC0541460CD6F00263633 /* CrossfadeGeneratedImage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CrossfadeGeneratedImage.cpp; sourceTree = "<group>"; };
    74837487                2D2FC0551460CD6F00263633 /* CrossfadeGeneratedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrossfadeGeneratedImage.h; sourceTree = "<group>"; };
     
    2045320457                                A8C4A7F509D563270003AC8D /* Element.h */,
    2045420458                                93EEC1EA09C2877700C515D1 /* Element.idl */,
     20459                                2CF6878714D32EB500340F39 /* ElementAttributeData.cpp */,
     20460                                2CF6878914D32EFF00340F39 /* ElementAttributeData.h */,
    2045520461                                637B7ADE0E8767B800E32194 /* ElementRareData.h */,
    2045620462                                A8EA7EBA0A1945D000A8EF5F /* Entity.h */,
     
    2410224108                                8AD0A59814C88358000D83C5 /* DOMWebKitCSSRegionRuleInternal.h in Headers */,
    2410324109                                0720B0A114D3323500642955 /* GenericEventQueue.h in Headers */,
     24110                                2CF6878A14D32EFF00340F39 /* ElementAttributeData.h in Headers */,
    2410424111                        );
    2410524112                        runOnlyForDeploymentPostprocessing = 0;
     
    2703127038                                573D134714CE39FF0057ABCA /* InspectorTypeBuilder.cpp in Sources */,
    2703227039                                0720B0A014D3323500642955 /* GenericEventQueue.cpp in Sources */,
     27040                                2CF6878814D32EB500340F39 /* ElementAttributeData.cpp in Sources */,
    2703327041                        );
    2703427042                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebCore/dom/DOMAllInOne.cpp

    r105249 r106323  
    6868#include "EditingText.cpp"
    6969#include "Element.cpp"
     70#include "ElementAttributeData.cpp"
    7071#include "EntityReference.cpp"
    7172#include "ErrorEvent.cpp"
  • trunk/Source/WebCore/dom/Element.cpp

    r105849 r106323  
    711711{
    712712    setHasID(!attr->isNull());
    713     if (attributeMap()) {
     713    if (attributeData()) {
    714714        if (attr->isNull())
    715             attributeMap()->setIdForStyleResolution(nullAtom);
     715            attributeData()->setIdForStyleResolution(nullAtom);
    716716        else if (document()->inQuirksMode())
    717             attributeMap()->setIdForStyleResolution(attr->value().lower());
     717            attributeData()->setIdForStyleResolution(attr->value().lower());
    718718        else
    719             attributeMap()->setIdForStyleResolution(attr->value());
     719            attributeData()->setIdForStyleResolution(attr->value());
    720720    }
    721721    setNeedsStyleRecalc();
  • trunk/Source/WebCore/dom/Element.h

    r105849 r106323  
    225225    NamedNodeMap* attributeMap() const { return m_attributeMap.get(); }
    226226
     227    ElementAttributeData* attributeData() const { return m_attributeMap ? m_attributeMap->attributeData() : 0; }
     228    ElementAttributeData* ensureAttributeData() const { return attributes()->attributeData(); }
     229
    227230    void setAttributesFromElement(const Element&);
    228231
     
    573576{
    574577    ASSERT(hasID());
    575     return m_attributeMap->idForStyleResolution();
     578    return attributeData()->idForStyleResolution();
    576579}
    577580
  • trunk/Source/WebCore/dom/NamedNodeMap.cpp

    r106201 r106323  
    201201void NamedNodeMap::clearAttributes()
    202202{
    203     m_classNames.clear();
     203    attributeData()->clearClass();
    204204    detachAttributesFromElement();
    205205    m_attributes.clear();
     
    302302}
    303303
    304 void NamedNodeMap::setClass(const String& classStr)
    305 {
    306     if (!element()->hasClass()) {
    307         m_classNames.clear();
    308         return;
    309     }
    310 
    311     m_classNames.set(classStr, element()->document()->inQuirksMode());
    312 }
    313 
    314304bool NamedNodeMap::mapsEquivalent(const NamedNodeMap* otherMap) const
    315305{
  • trunk/Source/WebCore/dom/NamedNodeMap.h

    r106201 r106323  
    2727
    2828#include "Attribute.h"
     29#include "ElementAttributeData.h"
    2930#include "SpaceSplitString.h"
    3031#include <wtf/NotFound.h>
     
    8586    }
    8687
    87     const AtomicString& idForStyleResolution() const { return m_idForStyleResolution; }
    88     void setIdForStyleResolution(const AtomicString& newId) { m_idForStyleResolution = newId; }
    89 
    9088    bool mapsEquivalent(const NamedNodeMap* otherMap) const;
    9189
     
    9795    Element* element() const { return m_element; }
    9896
    99     void clearClass() { m_classNames.clear(); }
    100     void setClass(const String&);
    101     const SpaceSplitString& classNames() const { return m_classNames; }
     97    size_t mappedAttributeCount() const;
    10298
    103     size_t mappedAttributeCount() const;
     99    ElementAttributeData* attributeData() { return &m_attributeData; }
     100    const ElementAttributeData* attributeData() const { return &m_attributeData; }
    104101
    105102private:
     
    118115    void replaceAttribute(size_t index, PassRefPtr<Attribute>);
    119116
    120     SpaceSplitString m_classNames;
     117    // FIXME: NamedNodeMap is being broken up into two classes, one containing data
     118    //        for elements with attributes, and one for exposure to the DOM.
     119    //        See <http://webkit.org/b/75069> for more information.
     120    ElementAttributeData m_attributeData;
     121
    121122    Element* m_element;
    122123    Vector<RefPtr<Attribute>, 4> m_attributes;
    123     AtomicString m_idForStyleResolution;
    124124};
    125125
  • trunk/Source/WebCore/dom/StyledElement.cpp

    r106247 r106323  
    216216    setHasClass(hasClass);
    217217    if (hasClass) {
    218         attributes()->setClass(newClassString);
     218        const bool shouldFoldCase = document()->inQuirksMode();
     219        ensureAttributeData()->setClass(newClassString, shouldFoldCase);
    219220        if (DOMTokenList* classList = optionalClassList())
    220221            static_cast<ClassList*>(classList)->reset(newClassString);
    221     } else if (attributeMap())
    222         attributeMap()->clearClass();
     222    } else if (attributeData())
     223        attributeData()->clearClass();
    223224    setNeedsStyleRecalc();
    224225    dispatchSubtreeModifiedEvent();
  • trunk/Source/WebCore/dom/StyledElement.h

    r106201 r106323  
    9999{
    100100    ASSERT(hasClass());
    101     ASSERT(attributeMap());
    102     return attributeMap()->classNames();
     101    ASSERT(attributeData());
     102    return attributeData()->classNames();
    103103}
    104104
  • trunk/Source/WebCore/html/ClassList.cpp

    r97670 r106323  
    141141    if (!m_classNamesForQuirksMode.isNull())
    142142        return m_classNamesForQuirksMode;
    143     return m_element->attributeMap()->classNames();
     143    return m_element->attributeData()->classNames();
    144144}
    145145
Note: See TracChangeset for help on using the changeset viewer.