Index: Source/core/dom/ElementData.h |
diff --git a/Source/core/dom/ElementData.h b/Source/core/dom/ElementData.h |
index 99aa0123d074c0ec6182030440abc15403adbd73..051cc65aa8d6cb298b24fcd9f821ae82bbdf1a5b 100644 |
--- a/Source/core/dom/ElementData.h |
+++ b/Source/core/dom/ElementData.h |
@@ -33,36 +33,17 @@ |
#define ElementData_h |
#include "core/dom/Attribute.h" |
+#include "core/dom/AttributeCollection.h" |
#include "core/dom/SpaceSplitString.h" |
#include "platform/heap/Handle.h" |
#include "wtf/text/AtomicString.h" |
namespace WebCore { |
-class Attr; |
class ShareableElementData; |
class StylePropertySet; |
class UniqueElementData; |
-class AttributeCollection { |
-public: |
- typedef const Attribute* const_iterator; |
- |
- AttributeCollection(const Attribute* array, unsigned size) |
- : m_array(array) |
- , m_size(size) |
- { } |
- |
- const_iterator begin() const { return m_array; } |
- const_iterator end() const { return m_array + m_size; } |
- |
- unsigned size() const { return m_size; } |
- |
-private: |
- const Attribute* m_array; |
- unsigned m_size; |
-}; |
- |
// ElementData represents very common, but not necessarily unique to an element, |
// data such as attributes, inline style, and parsed class names and ids. |
class ElementData : public RefCountedWillBeGarbageCollectedFinalized<ElementData> { |
@@ -89,18 +70,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 +108,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 +140,8 @@ public: |
return location; |
} |
+ AttributeCollection attributes() const; |
+ |
Attribute m_attributeArray[0]; |
}; |
@@ -195,6 +164,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 +192,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,84 +199,21 @@ 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 |
-{ |
- 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; |
-} |
- |
-inline size_t ElementData::findAttributeIndexByName(const QualifiedName& name, bool shouldIgnoreCase) const |
-{ |
- AttributeCollection attributes = this->attributes(); |
- AttributeCollection::const_iterator end = attributes.end(); |
- unsigned index = 0; |
- for (AttributeCollection::const_iterator it = attributes.begin(); it != end; ++it, ++index) { |
- if (it->name().matchesPossiblyIgnoringCase(name, shouldIgnoreCase)) |
- return index; |
- } |
- return kNotFound; |
-} |
- |
-// 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 |
-{ |
- bool doSlowCheck = shouldIgnoreAttributeCase; |
- |
- // Optimize for the case where the attribute exists and its name exactly matches. |
- AttributeCollection attributes = this->attributes(); |
- AttributeCollection::const_iterator end = attributes.end(); |
- unsigned index = 0; |
- for (AttributeCollection::const_iterator it = attributes.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()) { |
- if (name == it->localName()) |
- return index; |
- } else { |
- doSlowCheck = true; |
- } |
- } |
- |
- if (doSlowCheck) |
- return findAttributeIndexByNameSlowCase(name, shouldIgnoreAttributeCase); |
- 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) { |
- if (it->name().matches(name)) |
- return it; |
- } |
- return 0; |
+ return AttributeCollection(m_attributeArray, m_arraySize); |
} |
-inline const Attribute& ElementData::attributeAt(unsigned index) const |
+inline AttributeCollection UniqueElementData::attributes() const |
{ |
- RELEASE_ASSERT(index < attributeCount()); |
- ASSERT(attributeBase() + index); |
- return *(attributeBase() + index); |
+ return AttributeCollection(m_attributeVector.data(), m_attributeVector.size()); |
} |
inline void UniqueElementData::appendAttribute(const QualifiedName& attributeName, const AtomicString& value) |