Chromium Code Reviews| Index: Source/core/dom/ElementData.h |
| diff --git a/Source/core/dom/ElementData.h b/Source/core/dom/ElementData.h |
| index 99aa0123d074c0ec6182030440abc15403adbd73..857004b3def4ec16f8d50535b29999bf4c8de145 100644 |
| --- a/Source/core/dom/ElementData.h |
| +++ b/Source/core/dom/ElementData.h |
| @@ -53,12 +53,28 @@ public: |
| , m_size(size) |
| { } |
| + const Attribute& operator[](unsigned index) const { return at(index); } |
| + const Attribute& at(unsigned index) const |
| + { |
| + RELEASE_ASSERT(index < m_size); |
| + return m_array[index]; |
| + } |
| + |
| + const Attribute* get(const QualifiedName&) const; |
| + const Attribute* get(const AtomicString& name, bool shouldIgnoreCase) const; |
| + size_t find(const QualifiedName&, bool shouldIgnoreCase = false) const; |
| + size_t find(const AtomicString& name, bool shouldIgnoreCase) const; |
| + size_t find(Attr*) const; |
|
esprehn
2014/06/26 22:03:58
We're going to have to be really careful here, ori
Inactive
2014/06/26 22:16:40
To be fair, they were called getAttributeItem() /
|
| + |
| const_iterator begin() const { return m_array; } |
| const_iterator end() const { return m_array + m_size; } |
| unsigned size() const { return m_size; } |
| + bool isEmpty() const { return !m_size; } |
| private: |
| + size_t findSlowCase(const AtomicString& name, bool shouldIgnoreAttributeCase) const; |
| + |
| const Attribute* m_array; |
| unsigned m_size; |
| }; |
| @@ -89,18 +105,8 @@ public: |
| const StylePropertySet* presentationAttributeStyle() const; |
| - // This is not a trivial getter and its return value should be cached for performance. |
| - size_t attributeCount() const; |
| - bool hasAttributes() const { return !!attributeCount(); } |
| - |
| AttributeCollection attributes() const; |
| - const Attribute& attributeAt(unsigned index) const; |
| - const Attribute* findAttributeByName(const QualifiedName&) const; |
| - size_t findAttributeIndexByName(const QualifiedName&, bool shouldIgnoreCase = false) const; |
| - size_t findAttributeIndexByName(const AtomicString& name, bool shouldIgnoreAttributeCase) const; |
| - size_t findAttrNodeIndex(Attr*) const; |
| - |
| bool hasID() const { return !m_idForStyleResolution.isNull(); } |
| bool hasClass() const { return !m_classNames.isNull(); } |
| @@ -137,10 +143,6 @@ private: |
| void destroy(); |
| #endif |
| - const Attribute* attributeBase() const; |
| - const Attribute* findAttributeByName(const AtomicString& name, bool shouldIgnoreAttributeCase) const; |
| - size_t findAttributeIndexByNameSlowCase(const AtomicString& name, bool shouldIgnoreAttributeCase) const; |
| - |
| PassRefPtrWillBeRawPtr<UniqueElementData> makeUniqueCopy() const; |
| }; |
| @@ -173,6 +175,8 @@ public: |
| return location; |
| } |
| + AttributeCollection attributes() const; |
| + |
| Attribute m_attributeArray[0]; |
| }; |
| @@ -195,6 +199,8 @@ public: |
| void appendAttribute(const QualifiedName&, const AtomicString&); |
| void removeAttributeAt(size_t index); |
| + AttributeCollection attributes() const; |
| + |
| Attribute& attributeAt(unsigned index); |
| Attribute* findAttributeByName(const QualifiedName&); |
| @@ -221,13 +227,6 @@ inline void ElementData::deref() |
| } |
| #endif |
| -inline size_t ElementData::attributeCount() const |
| -{ |
| - if (isUnique()) |
| - return static_cast<const UniqueElementData*>(this)->m_attributeVector.size(); |
| - return m_arraySize; |
| -} |
| - |
| inline const StylePropertySet* ElementData::presentationAttributeStyle() const |
| { |
| if (!m_isUnique) |
| @@ -235,27 +234,17 @@ inline const StylePropertySet* ElementData::presentationAttributeStyle() const |
| return static_cast<const UniqueElementData*>(this)->m_presentationAttributeStyle.get(); |
| } |
| -inline const Attribute* ElementData::findAttributeByName(const AtomicString& name, bool shouldIgnoreAttributeCase) const |
| +inline const Attribute* AttributeCollection::get(const AtomicString& name, bool shouldIgnoreCase) const |
| { |
| - size_t index = findAttributeIndexByName(name, shouldIgnoreAttributeCase); |
| - if (index != kNotFound) |
| - return &attributeAt(index); |
| - return 0; |
| -} |
| - |
| -inline const Attribute* ElementData::attributeBase() const |
| -{ |
| - if (m_isUnique) |
| - return static_cast<const UniqueElementData*>(this)->m_attributeVector.begin(); |
| - return static_cast<const ShareableElementData*>(this)->m_attributeArray; |
| + size_t index = find(name, shouldIgnoreCase); |
| + return index != kNotFound ? &at(index) : 0; |
| } |
| -inline size_t ElementData::findAttributeIndexByName(const QualifiedName& name, bool shouldIgnoreCase) const |
| +inline size_t AttributeCollection::find(const QualifiedName& name, bool shouldIgnoreCase) const |
| { |
| - AttributeCollection attributes = this->attributes(); |
| - AttributeCollection::const_iterator end = attributes.end(); |
| + const_iterator end = this->end(); |
| unsigned index = 0; |
| - for (AttributeCollection::const_iterator it = attributes.begin(); it != end; ++it, ++index) { |
| + for (const_iterator it = begin(); it != end; ++it, ++index) { |
| if (it->name().matchesPossiblyIgnoringCase(name, shouldIgnoreCase)) |
| return index; |
| } |
| @@ -264,15 +253,14 @@ inline size_t ElementData::findAttributeIndexByName(const QualifiedName& name, b |
| // We use a boolean parameter instead of calling shouldIgnoreAttributeCase so that the caller |
| // can tune the behavior (hasAttribute is case sensitive whereas getAttribute is not). |
| -inline size_t ElementData::findAttributeIndexByName(const AtomicString& name, bool shouldIgnoreAttributeCase) const |
| +inline size_t AttributeCollection::find(const AtomicString& name, bool shouldIgnoreCase) const |
| { |
| - bool doSlowCheck = shouldIgnoreAttributeCase; |
| + bool doSlowCheck = shouldIgnoreCase; |
| // Optimize for the case where the attribute exists and its name exactly matches. |
| - AttributeCollection attributes = this->attributes(); |
| - AttributeCollection::const_iterator end = attributes.end(); |
| + const_iterator end = this->end(); |
| unsigned index = 0; |
| - for (AttributeCollection::const_iterator it = attributes.begin(); it != end; ++it, ++index) { |
| + for (const_iterator it = begin(); it != end; ++it, ++index) { |
| // FIXME: Why check the prefix? Namespaces should be all that matter. |
| // Most attributes (all of HTML and CSS) have no namespace. |
| if (!it->name().hasPrefix()) { |
| @@ -284,37 +272,37 @@ inline size_t ElementData::findAttributeIndexByName(const AtomicString& name, bo |
| } |
| if (doSlowCheck) |
| - return findAttributeIndexByNameSlowCase(name, shouldIgnoreAttributeCase); |
| + return findSlowCase(name, shouldIgnoreCase); |
| return kNotFound; |
| } |
| inline AttributeCollection ElementData::attributes() const |
| { |
| - if (isUnique()) { |
| - const Vector<Attribute, 4>& attributeVector = static_cast<const UniqueElementData*>(this)->m_attributeVector; |
| - return AttributeCollection(attributeVector.data(), attributeVector.size()); |
| - } |
| - return AttributeCollection(static_cast<const ShareableElementData*>(this)->m_attributeArray, m_arraySize); |
| + if (isUnique()) |
| + return static_cast<const UniqueElementData*>(this)->attributes(); |
| + return static_cast<const ShareableElementData*>(this)->attributes(); |
| } |
| -inline const Attribute* ElementData::findAttributeByName(const QualifiedName& name) const |
| +inline AttributeCollection ShareableElementData::attributes() const |
| { |
| - AttributeCollection attributes = this->attributes(); |
| - AttributeCollection::const_iterator end = attributes.end(); |
| - for (AttributeCollection::const_iterator it = attributes.begin(); it != end; ++it) { |
| + return AttributeCollection(m_attributeArray, m_arraySize); |
| +} |
| + |
| +inline AttributeCollection UniqueElementData::attributes() const |
| +{ |
| + return AttributeCollection(m_attributeVector.data(), m_attributeVector.size()); |
| +} |
| + |
| +inline const Attribute* AttributeCollection::get(const QualifiedName& name) const |
| +{ |
| + const_iterator end = this->end(); |
| + for (const_iterator it = begin(); it != end; ++it) { |
| if (it->name().matches(name)) |
| return it; |
| } |
| return 0; |
| } |
| -inline const Attribute& ElementData::attributeAt(unsigned index) const |
| -{ |
| - RELEASE_ASSERT(index < attributeCount()); |
| - ASSERT(attributeBase() + index); |
| - return *(attributeBase() + index); |
| -} |
| - |
| inline void UniqueElementData::appendAttribute(const QualifiedName& attributeName, const AtomicString& value) |
| { |
| m_attributeVector.append(Attribute(attributeName, value)); |