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

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

Issue 176883005: Have Element::ensureUniqueElementData() return a reference (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 10 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/html/HTMLSelectElement.cpp » ('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 959 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 if (!inSynchronizationOfLazyAttribute) 970 if (!inSynchronizationOfLazyAttribute)
971 willModifyAttribute(existingAttributeName, existingAttribute->value(), n ewValue); 971 willModifyAttribute(existingAttributeName, existingAttribute->value(), n ewValue);
972 972
973 if (newValue != existingAttribute->value()) { 973 if (newValue != existingAttribute->value()) {
974 // If there is an Attr node hooked to this attribute, the Attr::setValue () call below 974 // If there is an Attr node hooked to this attribute, the Attr::setValue () call below
975 // will write into the ElementData. 975 // will write into the ElementData.
976 // FIXME: Refactor this so it makes some sense. 976 // FIXME: Refactor this so it makes some sense.
977 if (RefPtr<Attr> attrNode = inSynchronizationOfLazyAttribute ? nullptr : attrIfExists(existingAttributeName)) 977 if (RefPtr<Attr> attrNode = inSynchronizationOfLazyAttribute ? nullptr : attrIfExists(existingAttributeName))
978 attrNode->setValue(newValue); 978 attrNode->setValue(newValue);
979 else 979 else
980 ensureUniqueElementData()->attributeItem(index)->setValue(newValue); 980 ensureUniqueElementData().attributeItem(index)->setValue(newValue);
981 } 981 }
982 982
983 if (!inSynchronizationOfLazyAttribute) 983 if (!inSynchronizationOfLazyAttribute)
984 didModifyAttribute(existingAttributeName, newValue); 984 didModifyAttribute(existingAttributeName, newValue);
985 } 985 }
986 986
987 static inline AtomicString makeIdForStyleResolution(const AtomicString& value, b ool inQuirksMode) 987 static inline AtomicString makeIdForStyleResolution(const AtomicString& value, b ool inQuirksMode)
988 { 988 {
989 if (inQuirksMode) 989 if (inQuirksMode)
990 return value.lower(); 990 return value.lower();
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after
1956 return attrNode; // This Attr is already attached to the element. 1956 return attrNode; // This Attr is already attached to the element.
1957 1957
1958 // InUseAttributeError: Raised if node is an Attr that is already an attribu te of another Element object. 1958 // InUseAttributeError: Raised if node is an Attr that is already an attribu te of another Element object.
1959 // The DOM user must explicitly clone Attr nodes to re-use them in other ele ments. 1959 // The DOM user must explicitly clone Attr nodes to re-use them in other ele ments.
1960 if (attrNode->ownerElement()) { 1960 if (attrNode->ownerElement()) {
1961 exceptionState.throwDOMException(InUseAttributeError, "The node provided is an attribute node that is already an attribute of another Element; attribute nodes must be explicitly cloned."); 1961 exceptionState.throwDOMException(InUseAttributeError, "The node provided is an attribute node that is already an attribute of another Element; attribute nodes must be explicitly cloned.");
1962 return nullptr; 1962 return nullptr;
1963 } 1963 }
1964 1964
1965 synchronizeAllAttributes(); 1965 synchronizeAllAttributes();
1966 UniqueElementData* elementData = ensureUniqueElementData(); 1966 UniqueElementData& elementData = ensureUniqueElementData();
1967 1967
1968 size_t index = elementData->getAttributeItemIndex(attrNode->qualifiedName(), shouldIgnoreAttributeCase()); 1968 size_t index = elementData.getAttributeItemIndex(attrNode->qualifiedName(), shouldIgnoreAttributeCase());
1969 if (index != kNotFound) { 1969 if (index != kNotFound) {
1970 if (oldAttrNode) 1970 if (oldAttrNode)
1971 detachAttrNodeFromElementWithValue(oldAttrNode.get(), elementData->a ttributeItem(index)->value()); 1971 detachAttrNodeFromElementWithValue(oldAttrNode.get(), elementData.at tributeItem(index)->value());
1972 else 1972 else
1973 oldAttrNode = Attr::create(document(), attrNode->qualifiedName(), el ementData->attributeItem(index)->value()); 1973 oldAttrNode = Attr::create(document(), attrNode->qualifiedName(), el ementData.attributeItem(index)->value());
1974 } 1974 }
1975 1975
1976 setAttributeInternal(index, attrNode->qualifiedName(), attrNode->value(), No tInSynchronizationOfLazyAttribute); 1976 setAttributeInternal(index, attrNode->qualifiedName(), attrNode->value(), No tInSynchronizationOfLazyAttribute);
1977 1977
1978 attrNode->attachToElement(this); 1978 attrNode->attachToElement(this);
1979 treeScope().adoptIfNeeded(*attrNode); 1979 treeScope().adoptIfNeeded(*attrNode);
1980 ensureAttrNodeListForElement(this).append(attrNode); 1980 ensureAttrNodeListForElement(this).append(attrNode);
1981 1981
1982 return oldAttrNode.release(); 1982 return oldAttrNode.release();
1983 } 1983 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2031 QualifiedName parsedName = anyName; 2031 QualifiedName parsedName = anyName;
2032 if (!parseAttributeName(parsedName, namespaceURI, qualifiedName, exceptionSt ate)) 2032 if (!parseAttributeName(parsedName, namespaceURI, qualifiedName, exceptionSt ate))
2033 return; 2033 return;
2034 setAttribute(parsedName, value); 2034 setAttribute(parsedName, value);
2035 } 2035 }
2036 2036
2037 void Element::removeAttributeInternal(size_t index, SynchronizationOfLazyAttribu te inSynchronizationOfLazyAttribute) 2037 void Element::removeAttributeInternal(size_t index, SynchronizationOfLazyAttribu te inSynchronizationOfLazyAttribute)
2038 { 2038 {
2039 ASSERT_WITH_SECURITY_IMPLICATION(index < attributeCount()); 2039 ASSERT_WITH_SECURITY_IMPLICATION(index < attributeCount());
2040 2040
2041 UniqueElementData* elementData = ensureUniqueElementData(); 2041 UniqueElementData& elementData = ensureUniqueElementData();
2042 2042
2043 QualifiedName name = elementData->attributeItem(index)->name(); 2043 QualifiedName name = elementData.attributeItem(index)->name();
2044 AtomicString valueBeingRemoved = elementData->attributeItem(index)->value(); 2044 AtomicString valueBeingRemoved = elementData.attributeItem(index)->value();
2045 2045
2046 if (!inSynchronizationOfLazyAttribute) { 2046 if (!inSynchronizationOfLazyAttribute) {
2047 if (!valueBeingRemoved.isNull()) 2047 if (!valueBeingRemoved.isNull())
2048 willModifyAttribute(name, valueBeingRemoved, nullAtom); 2048 willModifyAttribute(name, valueBeingRemoved, nullAtom);
2049 } 2049 }
2050 2050
2051 if (RefPtr<Attr> attrNode = attrIfExists(name)) 2051 if (RefPtr<Attr> attrNode = attrIfExists(name))
2052 detachAttrNodeFromElementWithValue(attrNode.get(), elementData->attribut eItem(index)->value()); 2052 detachAttrNodeFromElementWithValue(attrNode.get(), elementData.attribute Item(index)->value());
2053 2053
2054 elementData->removeAttribute(index); 2054 elementData.removeAttribute(index);
2055 2055
2056 if (!inSynchronizationOfLazyAttribute) 2056 if (!inSynchronizationOfLazyAttribute)
2057 didRemoveAttribute(name); 2057 didRemoveAttribute(name);
2058 } 2058 }
2059 2059
2060 void Element::addAttributeInternal(const QualifiedName& name, const AtomicString & value, SynchronizationOfLazyAttribute inSynchronizationOfLazyAttribute) 2060 void Element::addAttributeInternal(const QualifiedName& name, const AtomicString & value, SynchronizationOfLazyAttribute inSynchronizationOfLazyAttribute)
2061 { 2061 {
2062 if (!inSynchronizationOfLazyAttribute) 2062 if (!inSynchronizationOfLazyAttribute)
2063 willModifyAttribute(name, nullAtom, value); 2063 willModifyAttribute(name, nullAtom, value);
2064 ensureUniqueElementData()->addAttribute(name, value); 2064 ensureUniqueElementData().addAttribute(name, value);
2065 if (!inSynchronizationOfLazyAttribute) 2065 if (!inSynchronizationOfLazyAttribute)
2066 didAddAttribute(name, value); 2066 didAddAttribute(name, value);
2067 } 2067 }
2068 2068
2069 void Element::removeAttribute(const AtomicString& name) 2069 void Element::removeAttribute(const AtomicString& name)
2070 { 2070 {
2071 if (!elementData()) 2071 if (!elementData())
2072 return; 2072 return;
2073 2073
2074 AtomicString localName = shouldIgnoreAttributeCase() ? name.lower() : name; 2074 AtomicString localName = shouldIgnoreAttributeCase() ? name.lower() : name;
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after
3313 CSSStyleDeclaration* Element::style() 3313 CSSStyleDeclaration* Element::style()
3314 { 3314 {
3315 if (!isStyledElement()) 3315 if (!isStyledElement())
3316 return 0; 3316 return 0;
3317 return ensureElementRareData().ensureInlineCSSStyleDeclaration(this); 3317 return ensureElementRareData().ensureInlineCSSStyleDeclaration(this);
3318 } 3318 }
3319 3319
3320 MutableStylePropertySet* Element::ensureMutableInlineStyle() 3320 MutableStylePropertySet* Element::ensureMutableInlineStyle()
3321 { 3321 {
3322 ASSERT(isStyledElement()); 3322 ASSERT(isStyledElement());
3323 RefPtr<StylePropertySet>& inlineStyle = ensureUniqueElementData()->m_inlineS tyle; 3323 RefPtr<StylePropertySet>& inlineStyle = ensureUniqueElementData().m_inlineSt yle;
3324 if (!inlineStyle) { 3324 if (!inlineStyle) {
3325 CSSParserMode mode = (!isHTMLElement() || document().inQuirksMode()) ? H TMLQuirksMode : HTMLStandardMode; 3325 CSSParserMode mode = (!isHTMLElement() || document().inQuirksMode()) ? H TMLQuirksMode : HTMLStandardMode;
3326 inlineStyle = MutableStylePropertySet::create(mode); 3326 inlineStyle = MutableStylePropertySet::create(mode);
3327 } else if (!inlineStyle->isMutable()) { 3327 } else if (!inlineStyle->isMutable()) {
3328 inlineStyle = inlineStyle->mutableCopy(); 3328 inlineStyle = inlineStyle->mutableCopy();
3329 } 3329 }
3330 return toMutableStylePropertySet(inlineStyle); 3330 return toMutableStylePropertySet(inlineStyle);
3331 } 3331 }
3332 3332
3333 void Element::clearMutableInlineStyleIfEmpty() 3333 void Element::clearMutableInlineStyleIfEmpty()
3334 { 3334 {
3335 if (ensureMutableInlineStyle()->isEmpty()) { 3335 if (ensureMutableInlineStyle()->isEmpty()) {
3336 ensureUniqueElementData()->m_inlineStyle.clear(); 3336 ensureUniqueElementData().m_inlineStyle.clear();
3337 } 3337 }
3338 } 3338 }
3339 3339
3340 inline void Element::setInlineStyleFromString(const AtomicString& newStyleString ) 3340 inline void Element::setInlineStyleFromString(const AtomicString& newStyleString )
3341 { 3341 {
3342 ASSERT(isStyledElement()); 3342 ASSERT(isStyledElement());
3343 RefPtr<StylePropertySet>& inlineStyle = elementData()->m_inlineStyle; 3343 RefPtr<StylePropertySet>& inlineStyle = elementData()->m_inlineStyle;
3344 3344
3345 // Avoid redundant work if we're using shared attribute data with already pa rsed inline style. 3345 // Avoid redundant work if we're using shared attribute data with already pa rsed inline style.
3346 if (inlineStyle && !elementData()->isUnique()) 3346 if (inlineStyle && !elementData()->isUnique())
(...skipping 13 matching lines...) Expand all
3360 } 3360 }
3361 3361
3362 void Element::styleAttributeChanged(const AtomicString& newStyleString, Attribut eModificationReason modificationReason) 3362 void Element::styleAttributeChanged(const AtomicString& newStyleString, Attribut eModificationReason modificationReason)
3363 { 3363 {
3364 ASSERT(isStyledElement()); 3364 ASSERT(isStyledElement());
3365 WTF::OrdinalNumber startLineNumber = WTF::OrdinalNumber::beforeFirst(); 3365 WTF::OrdinalNumber startLineNumber = WTF::OrdinalNumber::beforeFirst();
3366 if (document().scriptableDocumentParser() && !document().isInDocumentWrite() ) 3366 if (document().scriptableDocumentParser() && !document().isInDocumentWrite() )
3367 startLineNumber = document().scriptableDocumentParser()->lineNumber(); 3367 startLineNumber = document().scriptableDocumentParser()->lineNumber();
3368 3368
3369 if (newStyleString.isNull()) { 3369 if (newStyleString.isNull()) {
3370 ensureUniqueElementData()->m_inlineStyle.clear(); 3370 ensureUniqueElementData().m_inlineStyle.clear();
3371 } else if (modificationReason == ModifiedByCloning || document().contentSecu rityPolicy()->allowInlineStyle(document().url(), startLineNumber)) { 3371 } else if (modificationReason == ModifiedByCloning || document().contentSecu rityPolicy()->allowInlineStyle(document().url(), startLineNumber)) {
3372 setInlineStyleFromString(newStyleString); 3372 setInlineStyleFromString(newStyleString);
3373 } 3373 }
3374 3374
3375 elementData()->m_styleAttributeIsDirty = false; 3375 elementData()->m_styleAttributeIsDirty = false;
3376 3376
3377 setNeedsStyleRecalc(LocalStyleChange); 3377 setNeedsStyleRecalc(LocalStyleChange);
3378 InspectorInstrumentation::didInvalidateStyleAttr(this); 3378 InspectorInstrumentation::didInvalidateStyleAttr(this);
3379 } 3379 }
3380 3380
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3436 ASSERT(isStyledElement()); 3436 ASSERT(isStyledElement());
3437 if (!inlineStyle()) 3437 if (!inlineStyle())
3438 return; 3438 return;
3439 ensureMutableInlineStyle()->clear(); 3439 ensureMutableInlineStyle()->clear();
3440 inlineStyleChanged(); 3440 inlineStyleChanged();
3441 } 3441 }
3442 3442
3443 void Element::updatePresentationAttributeStyle() 3443 void Element::updatePresentationAttributeStyle()
3444 { 3444 {
3445 // ShareableElementData doesn't store presentation attribute style, so make sure we have a UniqueElementData. 3445 // ShareableElementData doesn't store presentation attribute style, so make sure we have a UniqueElementData.
3446 UniqueElementData* elementData = ensureUniqueElementData(); 3446 UniqueElementData& elementData = ensureUniqueElementData();
3447 elementData->m_presentationAttributeStyleIsDirty = false; 3447 elementData.m_presentationAttributeStyleIsDirty = false;
3448 elementData->m_presentationAttributeStyle = computePresentationAttributeStyl e(*this); 3448 elementData.m_presentationAttributeStyle = computePresentationAttributeStyle (*this);
3449 } 3449 }
3450 3450
3451 void Element::addPropertyToPresentationAttributeStyle(MutableStylePropertySet* s tyle, CSSPropertyID propertyID, CSSValueID identifier) 3451 void Element::addPropertyToPresentationAttributeStyle(MutableStylePropertySet* s tyle, CSSPropertyID propertyID, CSSValueID identifier)
3452 { 3452 {
3453 ASSERT(isStyledElement()); 3453 ASSERT(isStyledElement());
3454 style->setProperty(propertyID, cssValuePool().createIdentifierValue(identifi er)); 3454 style->setProperty(propertyID, cssValuePool().createIdentifierValue(identifi er));
3455 } 3455 }
3456 3456
3457 void Element::addPropertyToPresentationAttributeStyle(MutableStylePropertySet* s tyle, CSSPropertyID propertyID, double value, CSSPrimitiveValue::UnitTypes unit) 3457 void Element::addPropertyToPresentationAttributeStyle(MutableStylePropertySet* s tyle, CSSPropertyID propertyID, double value, CSSPrimitiveValue::UnitTypes unit)
3458 { 3458 {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3510 // Before doing so, we need to resolve issues in HTMLSelectElement::recalcLi stItems 3510 // Before doing so, we need to resolve issues in HTMLSelectElement::recalcLi stItems
3511 // and RenderMenuList::setText. See also https://bugs.webkit.org/show_bug.cg i?id=88405 3511 // and RenderMenuList::setText. See also https://bugs.webkit.org/show_bug.cg i?id=88405
3512 if (hasTagName(optionTag) || hasTagName(optgroupTag)) 3512 if (hasTagName(optionTag) || hasTagName(optgroupTag))
3513 return false; 3513 return false;
3514 if (FullscreenElementStack::isActiveFullScreenElement(this)) 3514 if (FullscreenElementStack::isActiveFullScreenElement(this))
3515 return false; 3515 return false;
3516 return true; 3516 return true;
3517 } 3517 }
3518 3518
3519 } // namespace WebCore 3519 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/dom/Element.h ('k') | Source/core/html/HTMLSelectElement.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698