Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Side by Side Diff: Source/core/dom/Element.cpp

Issue 313973003: Rename ElementData's attribute related methods for clarity (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/dom/Element.h ('k') | Source/core/dom/ElementData.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Peter Kelly (pmk@post.com) 4 * (C) 2001 Peter Kelly (pmk@post.com)
5 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * (C) 2001 Dirk Mueller (mueller@kde.org)
6 * (C) 2007 David Smith (catfish.man@gmail.com) 6 * (C) 2007 David Smith (catfish.man@gmail.com)
7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved. 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
8 * (C) 2007 Eric Seidel (eric@webkit.org) 8 * (C) 2007 Eric Seidel (eric@webkit.org)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 } 303 }
304 304
305 PassRefPtrWillBeRawPtr<Element> Element::cloneElementWithoutAttributesAndChildre n() 305 PassRefPtrWillBeRawPtr<Element> Element::cloneElementWithoutAttributesAndChildre n()
306 { 306 {
307 return document().createElement(tagQName(), false); 307 return document().createElement(tagQName(), false);
308 } 308 }
309 309
310 PassRefPtrWillBeRawPtr<Attr> Element::detachAttribute(size_t index) 310 PassRefPtrWillBeRawPtr<Attr> Element::detachAttribute(size_t index)
311 { 311 {
312 ASSERT(elementData()); 312 ASSERT(elementData());
313 const Attribute& attribute = elementData()->attributeItem(index); 313 const Attribute& attribute = elementData()->attributeAt(index);
314 RefPtrWillBeRawPtr<Attr> attrNode = attrIfExists(attribute.name()); 314 RefPtrWillBeRawPtr<Attr> attrNode = attrIfExists(attribute.name());
315 if (attrNode) 315 if (attrNode)
316 detachAttrNodeAtIndex(attrNode.get(), index); 316 detachAttrNodeAtIndex(attrNode.get(), index);
317 else { 317 else {
318 attrNode = Attr::create(document(), attribute.name(), attribute.value()) ; 318 attrNode = Attr::create(document(), attribute.name(), attribute.value()) ;
319 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute); 319 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute);
320 } 320 }
321 return attrNode.release(); 321 return attrNode.release();
322 } 322 }
323 323
324 void Element::detachAttrNodeAtIndex(Attr* attr, size_t index) 324 void Element::detachAttrNodeAtIndex(Attr* attr, size_t index)
325 { 325 {
326 ASSERT(attr); 326 ASSERT(attr);
327 ASSERT(elementData()); 327 ASSERT(elementData());
328 328
329 const Attribute& attribute = elementData()->attributeItem(index); 329 const Attribute& attribute = elementData()->attributeAt(index);
330 ASSERT(attribute.name() == attr->qualifiedName()); 330 ASSERT(attribute.name() == attr->qualifiedName());
331 detachAttrNodeFromElementWithValue(attr, attribute.value()); 331 detachAttrNodeFromElementWithValue(attr, attribute.value());
332 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute); 332 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute);
333 } 333 }
334 334
335 void Element::removeAttribute(const QualifiedName& name) 335 void Element::removeAttribute(const QualifiedName& name)
336 { 336 {
337 if (!elementData()) 337 if (!elementData())
338 return; 338 return;
339 339
340 size_t index = elementData()->getAttributeItemIndex(name); 340 size_t index = elementData()->findAttributeIndexByName(name);
341 if (index == kNotFound) 341 if (index == kNotFound)
342 return; 342 return;
343 343
344 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute); 344 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute);
345 } 345 }
346 346
347 void Element::setBooleanAttribute(const QualifiedName& name, bool value) 347 void Element::setBooleanAttribute(const QualifiedName& name, bool value)
348 { 348 {
349 if (value) 349 if (value)
350 setAttribute(name, emptyAtom); 350 setAttribute(name, emptyAtom);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 // true. 455 // true.
456 toSVGElement(this)->synchronizeAnimatedSVGAttribute(QualifiedName(nullAt om, localName, nullAtom)); 456 toSVGElement(this)->synchronizeAnimatedSVGAttribute(QualifiedName(nullAt om, localName, nullAtom));
457 } 457 }
458 } 458 }
459 459
460 const AtomicString& Element::getAttribute(const QualifiedName& name) const 460 const AtomicString& Element::getAttribute(const QualifiedName& name) const
461 { 461 {
462 if (!elementData()) 462 if (!elementData())
463 return nullAtom; 463 return nullAtom;
464 synchronizeAttribute(name); 464 synchronizeAttribute(name);
465 if (const Attribute* attribute = getAttributeItem(name)) 465 if (const Attribute* attribute = findAttributeByName(name))
466 return attribute->value(); 466 return attribute->value();
467 return nullAtom; 467 return nullAtom;
468 } 468 }
469 469
470 void Element::scrollIntoView(bool alignToTop) 470 void Element::scrollIntoView(bool alignToTop)
471 { 471 {
472 document().updateLayoutIgnorePendingStylesheets(); 472 document().updateLayoutIgnorePendingStylesheets();
473 473
474 if (!renderer()) 474 if (!renderer())
475 return; 475 return;
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 return IntRect(); 900 return IntRect();
901 // FIXME: this should probably respect transforms 901 // FIXME: this should probably respect transforms
902 return document().view()->contentsToScreen(renderer()->absoluteBoundingBoxRe ctIgnoringTransforms()); 902 return document().view()->contentsToScreen(renderer()->absoluteBoundingBoxRe ctIgnoringTransforms());
903 } 903 }
904 904
905 const AtomicString& Element::getAttribute(const AtomicString& localName) const 905 const AtomicString& Element::getAttribute(const AtomicString& localName) const
906 { 906 {
907 if (!elementData()) 907 if (!elementData())
908 return nullAtom; 908 return nullAtom;
909 synchronizeAttribute(localName); 909 synchronizeAttribute(localName);
910 if (const Attribute* attribute = elementData()->getAttributeItem(localName, shouldIgnoreAttributeCase())) 910 if (const Attribute* attribute = elementData()->findAttributeByName(localNam e, shouldIgnoreAttributeCase()))
911 return attribute->value(); 911 return attribute->value();
912 return nullAtom; 912 return nullAtom;
913 } 913 }
914 914
915 const AtomicString& Element::getAttributeNS(const AtomicString& namespaceURI, co nst AtomicString& localName) const 915 const AtomicString& Element::getAttributeNS(const AtomicString& namespaceURI, co nst AtomicString& localName) const
916 { 916 {
917 return getAttribute(QualifiedName(nullAtom, localName, namespaceURI)); 917 return getAttribute(QualifiedName(nullAtom, localName, namespaceURI));
918 } 918 }
919 919
920 void Element::setAttribute(const AtomicString& localName, const AtomicString& va lue, ExceptionState& exceptionState) 920 void Element::setAttribute(const AtomicString& localName, const AtomicString& va lue, ExceptionState& exceptionState)
921 { 921 {
922 if (!Document::isValidName(localName)) { 922 if (!Document::isValidName(localName)) {
923 exceptionState.throwDOMException(InvalidCharacterError, "'" + localName + "' is not a valid attribute name."); 923 exceptionState.throwDOMException(InvalidCharacterError, "'" + localName + "' is not a valid attribute name.");
924 return; 924 return;
925 } 925 }
926 926
927 synchronizeAttribute(localName); 927 synchronizeAttribute(localName);
928 const AtomicString& caseAdjustedLocalName = shouldIgnoreAttributeCase() ? lo calName.lower() : localName; 928 const AtomicString& caseAdjustedLocalName = shouldIgnoreAttributeCase() ? lo calName.lower() : localName;
929 929
930 size_t index = elementData() ? elementData()->getAttributeItemIndex(caseAdju stedLocalName, false) : kNotFound; 930 size_t index = elementData() ? elementData()->findAttributeIndexByName(caseA djustedLocalName, false) : kNotFound;
931 const QualifiedName& qName = index != kNotFound ? attributeItem(index).name( ) : QualifiedName(nullAtom, caseAdjustedLocalName, nullAtom); 931 const QualifiedName& qName = index != kNotFound ? attributeAt(index).name() : QualifiedName(nullAtom, caseAdjustedLocalName, nullAtom);
932 setAttributeInternal(index, qName, value, NotInSynchronizationOfLazyAttribut e); 932 setAttributeInternal(index, qName, value, NotInSynchronizationOfLazyAttribut e);
933 } 933 }
934 934
935 void Element::setAttribute(const QualifiedName& name, const AtomicString& value) 935 void Element::setAttribute(const QualifiedName& name, const AtomicString& value)
936 { 936 {
937 synchronizeAttribute(name); 937 synchronizeAttribute(name);
938 size_t index = elementData() ? elementData()->getAttributeItemIndex(name) : kNotFound; 938 size_t index = elementData() ? elementData()->findAttributeIndexByName(name) : kNotFound;
939 setAttributeInternal(index, name, value, NotInSynchronizationOfLazyAttribute ); 939 setAttributeInternal(index, name, value, NotInSynchronizationOfLazyAttribute );
940 } 940 }
941 941
942 void Element::setSynchronizedLazyAttribute(const QualifiedName& name, const Atom icString& value) 942 void Element::setSynchronizedLazyAttribute(const QualifiedName& name, const Atom icString& value)
943 { 943 {
944 size_t index = elementData() ? elementData()->getAttributeItemIndex(name) : kNotFound; 944 size_t index = elementData() ? elementData()->findAttributeIndexByName(name) : kNotFound;
945 setAttributeInternal(index, name, value, InSynchronizationOfLazyAttribute); 945 setAttributeInternal(index, name, value, InSynchronizationOfLazyAttribute);
946 } 946 }
947 947
948 ALWAYS_INLINE void Element::setAttributeInternal(size_t index, const QualifiedNa me& name, const AtomicString& newValue, SynchronizationOfLazyAttribute inSynchro nizationOfLazyAttribute) 948 ALWAYS_INLINE void Element::setAttributeInternal(size_t index, const QualifiedNa me& name, const AtomicString& newValue, SynchronizationOfLazyAttribute inSynchro nizationOfLazyAttribute)
949 { 949 {
950 if (newValue.isNull()) { 950 if (newValue.isNull()) {
951 if (index != kNotFound) 951 if (index != kNotFound)
952 removeAttributeInternal(index, inSynchronizationOfLazyAttribute); 952 removeAttributeInternal(index, inSynchronizationOfLazyAttribute);
953 return; 953 return;
954 } 954 }
955 955
956 if (index == kNotFound) { 956 if (index == kNotFound) {
957 addAttributeInternal(name, newValue, inSynchronizationOfLazyAttribute); 957 appendAttributeInternal(name, newValue, inSynchronizationOfLazyAttribute );
958 return; 958 return;
959 } 959 }
960 960
961 const Attribute& existingAttribute = attributeItem(index); 961 const Attribute& existingAttribute = attributeAt(index);
962 QualifiedName existingAttributeName = existingAttribute.name(); 962 QualifiedName existingAttributeName = existingAttribute.name();
963 963
964 if (!inSynchronizationOfLazyAttribute) 964 if (!inSynchronizationOfLazyAttribute)
965 willModifyAttribute(existingAttributeName, existingAttribute.value(), ne wValue); 965 willModifyAttribute(existingAttributeName, existingAttribute.value(), ne wValue);
966 966
967 if (newValue != existingAttribute.value()) { 967 if (newValue != existingAttribute.value()) {
968 // If there is an Attr node hooked to this attribute, the Attr::setValue () call below 968 // If there is an Attr node hooked to this attribute, the Attr::setValue () call below
969 // will write into the ElementData. 969 // will write into the ElementData.
970 // FIXME: Refactor this so it makes some sense. 970 // FIXME: Refactor this so it makes some sense.
971 if (RefPtrWillBeRawPtr<Attr> attrNode = inSynchronizationOfLazyAttribute ? nullptr : attrIfExists(existingAttributeName)) 971 if (RefPtrWillBeRawPtr<Attr> attrNode = inSynchronizationOfLazyAttribute ? nullptr : attrIfExists(existingAttributeName))
972 attrNode->setValue(newValue); 972 attrNode->setValue(newValue);
973 else 973 else
974 ensureUniqueElementData().attributeItem(index).setValue(newValue); 974 ensureUniqueElementData().attributeAt(index).setValue(newValue);
975 } 975 }
976 976
977 if (!inSynchronizationOfLazyAttribute) 977 if (!inSynchronizationOfLazyAttribute)
978 didModifyAttribute(existingAttributeName, newValue); 978 didModifyAttribute(existingAttributeName, newValue);
979 } 979 }
980 980
981 static inline AtomicString makeIdForStyleResolution(const AtomicString& value, b ool inQuirksMode) 981 static inline AtomicString makeIdForStyleResolution(const AtomicString& value, b ool inQuirksMode)
982 { 982 {
983 if (inQuirksMode) 983 if (inQuirksMode)
984 return value.lower(); 984 return value.lower();
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 m_elementData = ShareableElementData::createWithAttributes(attributeVect or); 1179 m_elementData = ShareableElementData::createWithAttributes(attributeVect or);
1180 1180
1181 // Use attributeVector instead of m_elementData because attributeChanged mig ht modify m_elementData. 1181 // Use attributeVector instead of m_elementData because attributeChanged mig ht modify m_elementData.
1182 for (unsigned i = 0; i < attributeVector.size(); ++i) 1182 for (unsigned i = 0; i < attributeVector.size(); ++i)
1183 attributeChangedFromParserOrByCloning(attributeVector[i].name(), attribu teVector[i].value(), ModifiedDirectly); 1183 attributeChangedFromParserOrByCloning(attributeVector[i].name(), attribu teVector[i].value(), ModifiedDirectly);
1184 } 1184 }
1185 1185
1186 bool Element::hasAttributes() const 1186 bool Element::hasAttributes() const
1187 { 1187 {
1188 synchronizeAllAttributes(); 1188 synchronizeAllAttributes();
1189 return elementData() && elementData()->length(); 1189 return elementData() && elementData()->hasAttributes();
1190 } 1190 }
1191 1191
1192 bool Element::hasEquivalentAttributes(const Element* other) const 1192 bool Element::hasEquivalentAttributes(const Element* other) const
1193 { 1193 {
1194 synchronizeAllAttributes(); 1194 synchronizeAllAttributes();
1195 other->synchronizeAllAttributes(); 1195 other->synchronizeAllAttributes();
1196 if (elementData() == other->elementData()) 1196 if (elementData() == other->elementData())
1197 return true; 1197 return true;
1198 if (elementData()) 1198 if (elementData())
1199 return elementData()->isEquivalent(other->elementData()); 1199 return elementData()->isEquivalent(other->elementData());
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 // InUseAttributeError: Raised if node is an Attr that is already an attribu te of another Element object. 1885 // InUseAttributeError: Raised if node is an Attr that is already an attribu te of another Element object.
1886 // The DOM user must explicitly clone Attr nodes to re-use them in other ele ments. 1886 // The DOM user must explicitly clone Attr nodes to re-use them in other ele ments.
1887 if (attrNode->ownerElement()) { 1887 if (attrNode->ownerElement()) {
1888 exceptionState.throwDOMException(InUseAttributeError, "The node provided is an attribute node that is already an attribute of another Element; attribute nodes must be explicitly cloned."); 1888 exceptionState.throwDOMException(InUseAttributeError, "The node provided is an attribute node that is already an attribute of another Element; attribute nodes must be explicitly cloned.");
1889 return nullptr; 1889 return nullptr;
1890 } 1890 }
1891 1891
1892 synchronizeAllAttributes(); 1892 synchronizeAllAttributes();
1893 UniqueElementData& elementData = ensureUniqueElementData(); 1893 UniqueElementData& elementData = ensureUniqueElementData();
1894 1894
1895 size_t index = elementData.getAttributeItemIndex(attrNode->qualifiedName(), shouldIgnoreAttributeCase()); 1895 size_t index = elementData.findAttributeIndexByName(attrNode->qualifiedName( ), shouldIgnoreAttributeCase());
1896 AtomicString localName; 1896 AtomicString localName;
1897 if (index != kNotFound) { 1897 if (index != kNotFound) {
1898 const Attribute& attr = elementData.attributeItem(index); 1898 const Attribute& attr = elementData.attributeAt(index);
1899 1899
1900 // If the name of the ElementData attribute doesn't 1900 // If the name of the ElementData attribute doesn't
1901 // (case-sensitively) match that of the Attr node, record it 1901 // (case-sensitively) match that of the Attr node, record it
1902 // on the Attr so that it can correctly resolve the value on 1902 // on the Attr so that it can correctly resolve the value on
1903 // the Element. 1903 // the Element.
1904 if (!attr.name().matches(attrNode->qualifiedName())) 1904 if (!attr.name().matches(attrNode->qualifiedName()))
1905 localName = attr.localName(); 1905 localName = attr.localName();
1906 1906
1907 if (oldAttrNode) { 1907 if (oldAttrNode) {
1908 detachAttrNodeFromElementWithValue(oldAttrNode.get(), attr.value()); 1908 detachAttrNodeFromElementWithValue(oldAttrNode.get(), attr.value());
(...skipping 28 matching lines...) Expand all
1937 } 1937 }
1938 if (attr->ownerElement() != this) { 1938 if (attr->ownerElement() != this) {
1939 exceptionState.throwDOMException(NotFoundError, "The node provided is ow ned by another element."); 1939 exceptionState.throwDOMException(NotFoundError, "The node provided is ow ned by another element.");
1940 return nullptr; 1940 return nullptr;
1941 } 1941 }
1942 1942
1943 ASSERT(document() == attr->document()); 1943 ASSERT(document() == attr->document());
1944 1944
1945 synchronizeAttribute(attr->qualifiedName()); 1945 synchronizeAttribute(attr->qualifiedName());
1946 1946
1947 size_t index = elementData()->getAttrIndex(attr); 1947 size_t index = elementData()->findAttrNodeIndex(attr);
1948 if (index == kNotFound) { 1948 if (index == kNotFound) {
1949 exceptionState.throwDOMException(NotFoundError, "The attribute was not f ound on this element."); 1949 exceptionState.throwDOMException(NotFoundError, "The attribute was not f ound on this element.");
1950 return nullptr; 1950 return nullptr;
1951 } 1951 }
1952 1952
1953 RefPtrWillBeRawPtr<Attr> guard(attr); 1953 RefPtrWillBeRawPtr<Attr> guard(attr);
1954 detachAttrNodeAtIndex(attr, index); 1954 detachAttrNodeAtIndex(attr, index);
1955 return guard.release(); 1955 return guard.release();
1956 } 1956 }
1957 1957
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1998 return; 1998 return;
1999 setAttribute(parsedName, value); 1999 setAttribute(parsedName, value);
2000 } 2000 }
2001 2001
2002 void Element::removeAttributeInternal(size_t index, SynchronizationOfLazyAttribu te inSynchronizationOfLazyAttribute) 2002 void Element::removeAttributeInternal(size_t index, SynchronizationOfLazyAttribu te inSynchronizationOfLazyAttribute)
2003 { 2003 {
2004 ASSERT_WITH_SECURITY_IMPLICATION(index < attributeCount()); 2004 ASSERT_WITH_SECURITY_IMPLICATION(index < attributeCount());
2005 2005
2006 UniqueElementData& elementData = ensureUniqueElementData(); 2006 UniqueElementData& elementData = ensureUniqueElementData();
2007 2007
2008 QualifiedName name = elementData.attributeItem(index).name(); 2008 QualifiedName name = elementData.attributeAt(index).name();
2009 AtomicString valueBeingRemoved = elementData.attributeItem(index).value(); 2009 AtomicString valueBeingRemoved = elementData.attributeAt(index).value();
2010 2010
2011 if (!inSynchronizationOfLazyAttribute) { 2011 if (!inSynchronizationOfLazyAttribute) {
2012 if (!valueBeingRemoved.isNull()) 2012 if (!valueBeingRemoved.isNull())
2013 willModifyAttribute(name, valueBeingRemoved, nullAtom); 2013 willModifyAttribute(name, valueBeingRemoved, nullAtom);
2014 } 2014 }
2015 2015
2016 if (RefPtrWillBeRawPtr<Attr> attrNode = attrIfExists(name)) 2016 if (RefPtrWillBeRawPtr<Attr> attrNode = attrIfExists(name))
2017 detachAttrNodeFromElementWithValue(attrNode.get(), elementData.attribute Item(index).value()); 2017 detachAttrNodeFromElementWithValue(attrNode.get(), elementData.attribute At(index).value());
2018 2018
2019 elementData.removeAttribute(index); 2019 elementData.removeAttributeAt(index);
2020 2020
2021 if (!inSynchronizationOfLazyAttribute) 2021 if (!inSynchronizationOfLazyAttribute)
2022 didRemoveAttribute(name); 2022 didRemoveAttribute(name);
2023 } 2023 }
2024 2024
2025 void Element::addAttributeInternal(const QualifiedName& name, const AtomicString & value, SynchronizationOfLazyAttribute inSynchronizationOfLazyAttribute) 2025 void Element::appendAttributeInternal(const QualifiedName& name, const AtomicStr ing& value, SynchronizationOfLazyAttribute inSynchronizationOfLazyAttribute)
2026 { 2026 {
2027 if (!inSynchronizationOfLazyAttribute) 2027 if (!inSynchronizationOfLazyAttribute)
2028 willModifyAttribute(name, nullAtom, value); 2028 willModifyAttribute(name, nullAtom, value);
2029 ensureUniqueElementData().addAttribute(name, value); 2029 ensureUniqueElementData().appendAttribute(name, value);
2030 if (!inSynchronizationOfLazyAttribute) 2030 if (!inSynchronizationOfLazyAttribute)
2031 didAddAttribute(name, value); 2031 didAddAttribute(name, value);
2032 } 2032 }
2033 2033
2034 void Element::removeAttribute(const AtomicString& name) 2034 void Element::removeAttribute(const AtomicString& name)
2035 { 2035 {
2036 if (!elementData()) 2036 if (!elementData())
2037 return; 2037 return;
2038 2038
2039 AtomicString localName = shouldIgnoreAttributeCase() ? name.lower() : name; 2039 AtomicString localName = shouldIgnoreAttributeCase() ? name.lower() : name;
2040 size_t index = elementData()->getAttributeItemIndex(localName, false); 2040 size_t index = elementData()->findAttributeIndexByName(localName, false);
2041 if (index == kNotFound) { 2041 if (index == kNotFound) {
2042 if (UNLIKELY(localName == styleAttr) && elementData()->m_styleAttributeI sDirty && isStyledElement()) 2042 if (UNLIKELY(localName == styleAttr) && elementData()->m_styleAttributeI sDirty && isStyledElement())
2043 removeAllInlineStyleProperties(); 2043 removeAllInlineStyleProperties();
2044 return; 2044 return;
2045 } 2045 }
2046 2046
2047 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute); 2047 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute);
2048 } 2048 }
2049 2049
2050 void Element::removeAttributeNS(const AtomicString& namespaceURI, const AtomicSt ring& localName) 2050 void Element::removeAttributeNS(const AtomicString& namespaceURI, const AtomicSt ring& localName)
2051 { 2051 {
2052 removeAttribute(QualifiedName(nullAtom, localName, namespaceURI)); 2052 removeAttribute(QualifiedName(nullAtom, localName, namespaceURI));
2053 } 2053 }
2054 2054
2055 PassRefPtrWillBeRawPtr<Attr> Element::getAttributeNode(const AtomicString& local Name) 2055 PassRefPtrWillBeRawPtr<Attr> Element::getAttributeNode(const AtomicString& local Name)
2056 { 2056 {
2057 if (!elementData()) 2057 if (!elementData())
2058 return nullptr; 2058 return nullptr;
2059 synchronizeAttribute(localName); 2059 synchronizeAttribute(localName);
2060 const Attribute* attribute = elementData()->getAttributeItem(localName, shou ldIgnoreAttributeCase()); 2060 const Attribute* attribute = elementData()->findAttributeByName(localName, s houldIgnoreAttributeCase());
2061 if (!attribute) 2061 if (!attribute)
2062 return nullptr; 2062 return nullptr;
2063 return ensureAttr(attribute->name()); 2063 return ensureAttr(attribute->name());
2064 } 2064 }
2065 2065
2066 PassRefPtrWillBeRawPtr<Attr> Element::getAttributeNodeNS(const AtomicString& nam espaceURI, const AtomicString& localName) 2066 PassRefPtrWillBeRawPtr<Attr> Element::getAttributeNodeNS(const AtomicString& nam espaceURI, const AtomicString& localName)
2067 { 2067 {
2068 if (!elementData()) 2068 if (!elementData())
2069 return nullptr; 2069 return nullptr;
2070 QualifiedName qName(nullAtom, localName, namespaceURI); 2070 QualifiedName qName(nullAtom, localName, namespaceURI);
2071 synchronizeAttribute(qName); 2071 synchronizeAttribute(qName);
2072 const Attribute* attribute = elementData()->getAttributeItem(qName); 2072 const Attribute* attribute = elementData()->findAttributeByName(qName);
2073 if (!attribute) 2073 if (!attribute)
2074 return nullptr; 2074 return nullptr;
2075 return ensureAttr(attribute->name()); 2075 return ensureAttr(attribute->name());
2076 } 2076 }
2077 2077
2078 bool Element::hasAttribute(const AtomicString& localName) const 2078 bool Element::hasAttribute(const AtomicString& localName) const
2079 { 2079 {
2080 if (!elementData()) 2080 if (!elementData())
2081 return false; 2081 return false;
2082 synchronizeAttribute(localName); 2082 synchronizeAttribute(localName);
2083 return elementData()->getAttributeItem(shouldIgnoreAttributeCase() ? localNa me.lower() : localName, false); 2083 return elementData()->findAttributeByName(shouldIgnoreAttributeCase() ? loca lName.lower() : localName, false);
2084 } 2084 }
2085 2085
2086 bool Element::hasAttributeNS(const AtomicString& namespaceURI, const AtomicStrin g& localName) const 2086 bool Element::hasAttributeNS(const AtomicString& namespaceURI, const AtomicStrin g& localName) const
2087 { 2087 {
2088 if (!elementData()) 2088 if (!elementData())
2089 return false; 2089 return false;
2090 QualifiedName qName(nullAtom, localName, namespaceURI); 2090 QualifiedName qName(nullAtom, localName, namespaceURI);
2091 synchronizeAttribute(qName); 2091 synchronizeAttribute(qName);
2092 return elementData()->getAttributeItem(qName); 2092 return elementData()->findAttributeByName(qName);
2093 } 2093 }
2094 2094
2095 void Element::focus(bool restorePreviousSelection, FocusType type) 2095 void Element::focus(bool restorePreviousSelection, FocusType type)
2096 { 2096 {
2097 if (!inDocument()) 2097 if (!inDocument())
2098 return; 2098 return;
2099 2099
2100 if (document().focusedElement() == this) 2100 if (document().focusedElement() == this)
2101 return; 2101 return;
2102 2102
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
2471 2471
2472 AtomicString Element::computeInheritedLanguage() const 2472 AtomicString Element::computeInheritedLanguage() const
2473 { 2473 {
2474 const Node* n = this; 2474 const Node* n = this;
2475 AtomicString value; 2475 AtomicString value;
2476 // The language property is inherited, so we iterate over the parents to fin d the first language. 2476 // The language property is inherited, so we iterate over the parents to fin d the first language.
2477 do { 2477 do {
2478 if (n->isElementNode()) { 2478 if (n->isElementNode()) {
2479 if (const ElementData* elementData = toElement(n)->elementData()) { 2479 if (const ElementData* elementData = toElement(n)->elementData()) {
2480 // Spec: xml:lang takes precedence -- http://www.w3.org/TR/xhtml 1/#C_7 2480 // Spec: xml:lang takes precedence -- http://www.w3.org/TR/xhtml 1/#C_7
2481 if (const Attribute* attribute = elementData->getAttributeItem(X MLNames::langAttr)) 2481 if (const Attribute* attribute = elementData->findAttributeByNam e(XMLNames::langAttr))
2482 value = attribute->value(); 2482 value = attribute->value();
2483 else if (const Attribute* attribute = elementData->getAttributeI tem(HTMLNames::langAttr)) 2483 else if (const Attribute* attribute = elementData->findAttribute ByName(HTMLNames::langAttr))
2484 value = attribute->value(); 2484 value = attribute->value();
2485 } 2485 }
2486 } else if (n->isDocumentNode()) { 2486 } else if (n->isDocumentNode()) {
2487 // checking the MIME content-language 2487 // checking the MIME content-language
2488 value = toDocument(n)->contentLanguage(); 2488 value = toDocument(n)->contentLanguage();
2489 } 2489 }
2490 2490
2491 n = n->parentNode(); 2491 n = n->parentNode();
2492 } while (n && value.isNull()); 2492 } while (n && value.isNull());
2493 2493
(...skipping 11 matching lines...) Expand all
2505 document().cancelFocusAppearanceUpdate(); 2505 document().cancelFocusAppearanceUpdate();
2506 } 2506 }
2507 2507
2508 void Element::normalizeAttributes() 2508 void Element::normalizeAttributes()
2509 { 2509 {
2510 if (!hasAttributes()) 2510 if (!hasAttributes())
2511 return; 2511 return;
2512 // attributeCount() cannot be cached before the loop because the attributes 2512 // attributeCount() cannot be cached before the loop because the attributes
2513 // list is altered while iterating. 2513 // list is altered while iterating.
2514 for (unsigned i = 0; i < attributeCount(); ++i) { 2514 for (unsigned i = 0; i < attributeCount(); ++i) {
2515 if (RefPtrWillBeRawPtr<Attr> attr = attrIfExists(attributeItem(i).name() )) 2515 if (RefPtrWillBeRawPtr<Attr> attr = attrIfExists(attributeAt(i).name()))
2516 attr->normalize(); 2516 attr->normalize();
2517 } 2517 }
2518 } 2518 }
2519 2519
2520 void Element::updatePseudoElement(PseudoId pseudoId, StyleRecalcChange change) 2520 void Element::updatePseudoElement(PseudoId pseudoId, StyleRecalcChange change)
2521 { 2521 {
2522 ASSERT(!needsStyleRecalc()); 2522 ASSERT(!needsStyleRecalc());
2523 PseudoElement* element = pseudoElement(pseudoId); 2523 PseudoElement* element = pseudoElement(pseudoId);
2524 if (element && (change == UpdatePseudoElements || element->shouldCallRecalcS tyle(change))) { 2524 if (element && (change == UpdatePseudoElements || element->shouldCallRecalcS tyle(change))) {
2525 2525
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2598 ElementRareData& rareData = ensureElementRareData(); 2598 ElementRareData& rareData = ensureElementRareData();
2599 if (!rareData.dataset()) 2599 if (!rareData.dataset())
2600 rareData.setDataset(DatasetDOMStringMap::create(this)); 2600 rareData.setDataset(DatasetDOMStringMap::create(this));
2601 return *rareData.dataset(); 2601 return *rareData.dataset();
2602 } 2602 }
2603 2603
2604 KURL Element::getURLAttribute(const QualifiedName& name) const 2604 KURL Element::getURLAttribute(const QualifiedName& name) const
2605 { 2605 {
2606 #if !ASSERT_DISABLED 2606 #if !ASSERT_DISABLED
2607 if (elementData()) { 2607 if (elementData()) {
2608 if (const Attribute* attribute = getAttributeItem(name)) 2608 if (const Attribute* attribute = findAttributeByName(name))
2609 ASSERT(isURLAttribute(*attribute)); 2609 ASSERT(isURLAttribute(*attribute));
2610 } 2610 }
2611 #endif 2611 #endif
2612 return document().completeURL(stripLeadingAndTrailingHTMLSpaces(getAttribute (name))); 2612 return document().completeURL(stripLeadingAndTrailingHTMLSpaces(getAttribute (name)));
2613 } 2613 }
2614 2614
2615 KURL Element::getNonEmptyURLAttribute(const QualifiedName& name) const 2615 KURL Element::getNonEmptyURLAttribute(const QualifiedName& name) const
2616 { 2616 {
2617 #if !ASSERT_DISABLED 2617 #if !ASSERT_DISABLED
2618 if (elementData()) { 2618 if (elementData()) {
2619 if (const Attribute* attribute = getAttributeItem(name)) 2619 if (const Attribute* attribute = findAttributeByName(name))
2620 ASSERT(isURLAttribute(*attribute)); 2620 ASSERT(isURLAttribute(*attribute));
2621 } 2621 }
2622 #endif 2622 #endif
2623 String value = stripLeadingAndTrailingHTMLSpaces(getAttribute(name)); 2623 String value = stripLeadingAndTrailingHTMLSpaces(getAttribute(name));
2624 if (value.isEmpty()) 2624 if (value.isEmpty())
2625 return KURL(); 2625 return KURL();
2626 return document().completeURL(value); 2626 return document().completeURL(value);
2627 } 2627 }
2628 2628
2629 int Element::getIntegralAttribute(const QualifiedName& attributeName) const 2629 int Element::getIntegralAttribute(const QualifiedName& attributeName) const
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after
3323 3323
3324 void Element::trace(Visitor* visitor) 3324 void Element::trace(Visitor* visitor)
3325 { 3325 {
3326 if (hasRareData()) 3326 if (hasRareData())
3327 visitor->trace(elementRareData()); 3327 visitor->trace(elementRareData());
3328 3328
3329 ContainerNode::trace(visitor); 3329 ContainerNode::trace(visitor);
3330 } 3330 }
3331 3331
3332 } // namespace WebCore 3332 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/dom/Element.h ('k') | Source/core/dom/ElementData.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698