| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 void setClass(const AtomicString& className, bool shouldFoldCase) const { m_
classNames.set(className, shouldFoldCase); } | 55 void setClass(const AtomicString& className, bool shouldFoldCase) const { m_
classNames.set(className, shouldFoldCase); } |
| 56 const SpaceSplitString& classNames() const { return m_classNames; } | 56 const SpaceSplitString& classNames() const { return m_classNames; } |
| 57 | 57 |
| 58 const AtomicString& idForStyleResolution() const { return m_idForStyleResolu
tion; } | 58 const AtomicString& idForStyleResolution() const { return m_idForStyleResolu
tion; } |
| 59 void setIdForStyleResolution(const AtomicString& newId) const { m_idForStyle
Resolution = newId; } | 59 void setIdForStyleResolution(const AtomicString& newId) const { m_idForStyle
Resolution = newId; } |
| 60 | 60 |
| 61 const StylePropertySet* inlineStyle() const { return m_inlineStyle.get(); } | 61 const StylePropertySet* inlineStyle() const { return m_inlineStyle.get(); } |
| 62 | 62 |
| 63 const StylePropertySet* presentationAttributeStyle() const; | 63 const StylePropertySet* presentationAttributeStyle() const; |
| 64 | 64 |
| 65 // This is not a trivial getter and its return value should be cached for pe
rformance. |
| 65 size_t length() const; | 66 size_t length() const; |
| 66 bool isEmpty() const { return !length(); } | 67 bool isEmpty() const { return !length(); } |
| 67 | 68 |
| 68 const Attribute* attributeItem(unsigned index) const; | 69 const Attribute* attributeItem(unsigned index) const; |
| 69 const Attribute* getAttributeItem(const QualifiedName&) const; | 70 const Attribute* getAttributeItem(const QualifiedName&) const; |
| 70 size_t getAttributeItemIndex(const QualifiedName&, bool shouldIgnoreCase = f
alse) const; | 71 size_t getAttributeItemIndex(const QualifiedName&, bool shouldIgnoreCase = f
alse) const; |
| 71 size_t getAttributeItemIndex(const AtomicString& name, bool shouldIgnoreAttr
ibuteCase) const; | 72 size_t getAttributeItemIndex(const AtomicString& name, bool shouldIgnoreAttr
ibuteCase) const; |
| 72 size_t getAttrIndex(Attr*) const; | 73 size_t getAttrIndex(Attr*) const; |
| 73 | 74 |
| 74 bool hasID() const { return !m_idForStyleResolution.isNull(); } | 75 bool hasID() const { return !m_idForStyleResolution.isNull(); } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 { | 197 { |
| 197 if (m_isUnique) | 198 if (m_isUnique) |
| 198 return static_cast<const UniqueElementData*>(this)->m_attributeVector.be
gin(); | 199 return static_cast<const UniqueElementData*>(this)->m_attributeVector.be
gin(); |
| 199 return static_cast<const ShareableElementData*>(this)->m_attributeArray; | 200 return static_cast<const ShareableElementData*>(this)->m_attributeArray; |
| 200 } | 201 } |
| 201 | 202 |
| 202 inline size_t ElementData::getAttributeItemIndex(const QualifiedName& name, bool
shouldIgnoreCase) const | 203 inline size_t ElementData::getAttributeItemIndex(const QualifiedName& name, bool
shouldIgnoreCase) const |
| 203 { | 204 { |
| 204 const Attribute* begin = attributeBase(); | 205 const Attribute* begin = attributeBase(); |
| 205 // Cache length for performance as ElementData::length() contains a conditio
nal branch. | 206 // Cache length for performance as ElementData::length() contains a conditio
nal branch. |
| 206 unsigned len = length(); | 207 unsigned length = this->length(); |
| 207 for (unsigned i = 0; i < len; ++i) { | 208 for (unsigned i = 0; i < length; ++i) { |
| 208 const Attribute& attribute = begin[i]; | 209 const Attribute& attribute = begin[i]; |
| 209 if (attribute.name().matchesPossiblyIgnoringCase(name, shouldIgnoreCase)
) | 210 if (attribute.name().matchesPossiblyIgnoringCase(name, shouldIgnoreCase)
) |
| 210 return i; | 211 return i; |
| 211 } | 212 } |
| 212 return kNotFound; | 213 return kNotFound; |
| 213 } | 214 } |
| 214 | 215 |
| 215 // We use a boolean parameter instead of calling shouldIgnoreAttributeCase so th
at the caller | 216 // We use a boolean parameter instead of calling shouldIgnoreAttributeCase so th
at the caller |
| 216 // can tune the behavior (hasAttribute is case sensitive whereas getAttribute is
not). | 217 // can tune the behavior (hasAttribute is case sensitive whereas getAttribute is
not). |
| 217 inline size_t ElementData::getAttributeItemIndex(const AtomicString& name, bool
shouldIgnoreAttributeCase) const | 218 inline size_t ElementData::getAttributeItemIndex(const AtomicString& name, bool
shouldIgnoreAttributeCase) const |
| 218 { | 219 { |
| 219 // Cache length for performance as ElementData::length() contains a conditio
nal branch. | 220 // Cache length for performance as ElementData::length() contains a conditio
nal branch. |
| 220 unsigned len = length(); | 221 unsigned length = this->length(); |
| 221 bool doSlowCheck = shouldIgnoreAttributeCase; | 222 bool doSlowCheck = shouldIgnoreAttributeCase; |
| 222 | 223 |
| 223 // Optimize for the case where the attribute exists and its name exactly mat
ches. | 224 // Optimize for the case where the attribute exists and its name exactly mat
ches. |
| 224 const Attribute* begin = attributeBase(); | 225 const Attribute* begin = attributeBase(); |
| 225 for (unsigned i = 0; i < len; ++i) { | 226 for (unsigned i = 0; i < length; ++i) { |
| 226 const Attribute& attribute = begin[i]; | 227 const Attribute& attribute = begin[i]; |
| 227 // FIXME: Why check the prefix? Namespaces should be all that matter. | 228 // FIXME: Why check the prefix? Namespaces should be all that matter. |
| 228 // Most attributes (all of HTML and CSS) have no namespace. | 229 // Most attributes (all of HTML and CSS) have no namespace. |
| 229 if (!attribute.name().hasPrefix()) { | 230 if (!attribute.name().hasPrefix()) { |
| 230 if (name == attribute.localName()) | 231 if (name == attribute.localName()) |
| 231 return i; | 232 return i; |
| 232 } else { | 233 } else { |
| 233 doSlowCheck = true; | 234 doSlowCheck = true; |
| 234 } | 235 } |
| 235 } | 236 } |
| 236 | 237 |
| 237 if (doSlowCheck) | 238 if (doSlowCheck) |
| 238 return getAttributeItemIndexSlowCase(name, shouldIgnoreAttributeCase); | 239 return getAttributeItemIndexSlowCase(name, shouldIgnoreAttributeCase); |
| 239 return kNotFound; | 240 return kNotFound; |
| 240 } | 241 } |
| 241 | 242 |
| 242 inline const Attribute* ElementData::getAttributeItem(const QualifiedName& name)
const | 243 inline const Attribute* ElementData::getAttributeItem(const QualifiedName& name)
const |
| 243 { | 244 { |
| 244 const Attribute* begin = attributeBase(); | 245 const Attribute* begin = attributeBase(); |
| 245 for (unsigned i = 0; i < length(); ++i) { | 246 unsigned length = this->length(); |
| 247 for (unsigned i = 0; i < length; ++i) { |
| 246 const Attribute& attribute = begin[i]; | 248 const Attribute& attribute = begin[i]; |
| 247 if (attribute.name().matches(name)) | 249 if (attribute.name().matches(name)) |
| 248 return &attribute; | 250 return &attribute; |
| 249 } | 251 } |
| 250 return 0; | 252 return 0; |
| 251 } | 253 } |
| 252 | 254 |
| 253 inline const Attribute* ElementData::attributeItem(unsigned index) const | 255 inline const Attribute* ElementData::attributeItem(unsigned index) const |
| 254 { | 256 { |
| 255 RELEASE_ASSERT(index < length()); | 257 RELEASE_ASSERT(index < length()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 267 } | 269 } |
| 268 | 270 |
| 269 inline Attribute* UniqueElementData::attributeItem(unsigned index) | 271 inline Attribute* UniqueElementData::attributeItem(unsigned index) |
| 270 { | 272 { |
| 271 return &m_attributeVector.at(index); | 273 return &m_attributeVector.at(index); |
| 272 } | 274 } |
| 273 | 275 |
| 274 } // namespace WebCore | 276 } // namespace WebCore |
| 275 | 277 |
| 276 #endif // ElementData_h | 278 #endif // ElementData_h |
| OLD | NEW |