Chromium Code Reviews| OLD | NEW |
|---|---|
| 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. | 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. |
| 8 * All rights reserved. | 8 * All rights reserved. |
| 9 * (C) 2007 Eric Seidel (eric@webkit.org) | 9 * (C) 2007 Eric Seidel (eric@webkit.org) |
| 10 * | 10 * |
| (...skipping 1552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1563 return parent->locateNamespacePrefix(namespaceToLocate); | 1563 return parent->locateNamespacePrefix(namespaceToLocate); |
| 1564 | 1564 |
| 1565 return nullAtom; | 1565 return nullAtom; |
| 1566 } | 1566 } |
| 1567 | 1567 |
| 1568 const AtomicString Element::imageSourceURL() const { | 1568 const AtomicString Element::imageSourceURL() const { |
| 1569 return getAttribute(srcAttr); | 1569 return getAttribute(srcAttr); |
| 1570 } | 1570 } |
| 1571 | 1571 |
| 1572 bool Element::layoutObjectIsNeeded(const ComputedStyle& style) { | 1572 bool Element::layoutObjectIsNeeded(const ComputedStyle& style) { |
| 1573 return style.display() != EDisplay::None; | 1573 return style.display() != EDisplay::None && |
| 1574 style.display() != EDisplay::Contents; | |
| 1574 } | 1575 } |
| 1575 | 1576 |
| 1576 LayoutObject* Element::createLayoutObject(const ComputedStyle& style) { | 1577 LayoutObject* Element::createLayoutObject(const ComputedStyle& style) { |
| 1577 return LayoutObject::createObject(this, style); | 1578 return LayoutObject::createObject(this, style); |
| 1578 } | 1579 } |
| 1579 | 1580 |
| 1580 Node::InsertionNotificationRequest Element::insertedInto( | 1581 Node::InsertionNotificationRequest Element::insertedInto( |
| 1581 ContainerNode* insertionPoint) { | 1582 ContainerNode* insertionPoint) { |
| 1582 // need to do superclass processing first so isConnected() is true | 1583 // need to do superclass processing first so isConnected() is true |
| 1583 // by the time we reach updateId | 1584 // by the time we reach updateId |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1701 void Element::attachLayoutTree(const AttachContext& context) { | 1702 void Element::attachLayoutTree(const AttachContext& context) { |
| 1702 DCHECK(document().inStyleRecalc()); | 1703 DCHECK(document().inStyleRecalc()); |
| 1703 | 1704 |
| 1704 // We've already been through detach when doing an attach, but we might | 1705 // We've already been through detach when doing an attach, but we might |
| 1705 // need to clear any state that's been added since then. | 1706 // need to clear any state that's been added since then. |
| 1706 if (hasRareData() && needsAttach()) { | 1707 if (hasRareData() && needsAttach()) { |
| 1707 ElementRareData* data = elementRareData(); | 1708 ElementRareData* data = elementRareData(); |
| 1708 data->clearComputedStyle(); | 1709 data->clearComputedStyle(); |
| 1709 } | 1710 } |
| 1710 | 1711 |
| 1711 if (!isActiveSlotOrActiveInsertionPoint()) | 1712 if (!isActiveSlotOrActiveInsertionPoint()) { |
| 1712 LayoutTreeBuilderForElement(*this, context.resolvedStyle) | 1713 LayoutTreeBuilderForElement builder(*this, context.resolvedStyle); |
| 1713 .createLayoutObjectIfNeeded(); | 1714 builder.createLayoutObjectIfNeeded(); |
| 1715 | |
| 1716 if (ComputedStyle* style = builder.resolvedStyle()) { | |
| 1717 if (!layoutObject() && shouldStoreNonLayoutObjectComputedStyle(*style)) | |
| 1718 storeNonLayoutObjectComputedStyle(style); | |
| 1719 } | |
| 1720 } | |
| 1714 | 1721 |
| 1715 addCallbackSelectors(); | 1722 addCallbackSelectors(); |
| 1716 | 1723 |
| 1717 if (hasRareData() && !layoutObject()) { | 1724 if (hasRareData() && !layoutObject()) { |
| 1718 if (ElementAnimations* elementAnimations = | 1725 if (ElementAnimations* elementAnimations = |
| 1719 elementRareData()->elementAnimations()) { | 1726 elementRareData()->elementAnimations()) { |
| 1720 elementAnimations->cssAnimations().cancel(); | 1727 elementAnimations->cssAnimations().cancel(); |
| 1721 elementAnimations->setAnimationStyleChange(false); | 1728 elementAnimations->setAnimationStyleChange(false); |
| 1722 } | 1729 } |
| 1723 } | 1730 } |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1879 DCHECK(!document().lifecycle().inDetach()); | 1886 DCHECK(!document().lifecycle().inDetach()); |
| 1880 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); | 1887 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); |
| 1881 DCHECK(inActiveDocument()); | 1888 DCHECK(inActiveDocument()); |
| 1882 | 1889 |
| 1883 if (hasCustomStyleCallbacks()) | 1890 if (hasCustomStyleCallbacks()) |
| 1884 willRecalcStyle(change); | 1891 willRecalcStyle(change); |
| 1885 | 1892 |
| 1886 if (change >= IndependentInherit || needsStyleRecalc()) { | 1893 if (change >= IndependentInherit || needsStyleRecalc()) { |
| 1887 if (hasRareData()) { | 1894 if (hasRareData()) { |
| 1888 ElementRareData* data = elementRareData(); | 1895 ElementRareData* data = elementRareData(); |
| 1889 if (change != IndependentInherit) | 1896 if (change != IndependentInherit && !nonLayoutObjectComputedStyle()) |
| 1890 data->clearComputedStyle(); | 1897 data->clearComputedStyle(); |
| 1891 | 1898 |
| 1892 if (change >= IndependentInherit) { | 1899 if (change >= IndependentInherit) { |
| 1893 if (ElementAnimations* elementAnimations = data->elementAnimations()) | 1900 if (ElementAnimations* elementAnimations = data->elementAnimations()) |
| 1894 elementAnimations->setAnimationStyleChange(false); | 1901 elementAnimations->setAnimationStyleChange(false); |
| 1895 } | 1902 } |
| 1896 } | 1903 } |
| 1897 if (parentComputedStyle()) | 1904 if (parentComputedStyle()) |
| 1898 change = recalcOwnStyle(change, nextTextSibling); | 1905 change = recalcOwnStyle(change, nextTextSibling); |
| 1899 clearNeedsStyleRecalc(); | 1906 clearNeedsStyleRecalc(); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2002 pseudoStyleCacheIsInvalid(oldStyle.get(), newStyle.get())) { | 2009 pseudoStyleCacheIsInvalid(oldStyle.get(), newStyle.get())) { |
| 2003 layoutObject->setStyle(newStyle.get()); | 2010 layoutObject->setStyle(newStyle.get()); |
| 2004 } else { | 2011 } else { |
| 2005 // Although no change occurred, we use the new style so that the cousin | 2012 // Although no change occurred, we use the new style so that the cousin |
| 2006 // style sharing code won't get fooled into believing this style is the | 2013 // style sharing code won't get fooled into believing this style is the |
| 2007 // same. | 2014 // same. |
| 2008 // FIXME: We may be able to remove this hack, see discussion in | 2015 // FIXME: We may be able to remove this hack, see discussion in |
| 2009 // https://codereview.chromium.org/30453002/ | 2016 // https://codereview.chromium.org/30453002/ |
| 2010 layoutObject->setStyleInternal(newStyle.get()); | 2017 layoutObject->setStyleInternal(newStyle.get()); |
| 2011 } | 2018 } |
| 2019 } else if (localChange != NoChange && | |
| 2020 shouldStoreNonLayoutObjectComputedStyle(*newStyle)) { | |
| 2021 storeNonLayoutObjectComputedStyle(newStyle); | |
| 2012 } | 2022 } |
| 2013 | 2023 |
| 2014 if (getStyleChangeType() >= SubtreeStyleChange) | 2024 if (getStyleChangeType() >= SubtreeStyleChange) |
| 2015 return Force; | 2025 return Force; |
| 2016 | 2026 |
| 2017 if (change > Inherit || localChange > Inherit) | 2027 if (change > Inherit || localChange > Inherit) |
| 2018 return max(localChange, change); | 2028 return max(localChange, change); |
| 2019 | 2029 |
| 2020 if (localChange < IndependentInherit) { | 2030 if (localChange < IndependentInherit) { |
| 2021 if (oldStyle->hasChildDependentFlags()) { | 2031 if (oldStyle->hasChildDependentFlags()) { |
| (...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3153 elementStyle = rareData.computedStyle(); | 3163 elementStyle = rareData.computedStyle(); |
| 3154 } | 3164 } |
| 3155 | 3165 |
| 3156 if (!pseudoElementSpecifier) | 3166 if (!pseudoElementSpecifier) |
| 3157 return elementStyle; | 3167 return elementStyle; |
| 3158 | 3168 |
| 3159 if (ComputedStyle* pseudoElementStyle = | 3169 if (ComputedStyle* pseudoElementStyle = |
| 3160 elementStyle->getCachedPseudoStyle(pseudoElementSpecifier)) | 3170 elementStyle->getCachedPseudoStyle(pseudoElementSpecifier)) |
| 3161 return pseudoElementStyle; | 3171 return pseudoElementStyle; |
| 3162 | 3172 |
| 3173 // TODO(ecobos): Passing two times elementStyle may be wrong, though we don't | |
| 3174 // support display: contents elements' pseudo-elements yet, so this is not a | |
| 3175 // problem for now. | |
| 3163 RefPtr<ComputedStyle> result = | 3176 RefPtr<ComputedStyle> result = |
| 3164 document().ensureStyleResolver().pseudoStyleForElement( | 3177 document().ensureStyleResolver().pseudoStyleForElement( |
| 3165 this, PseudoStyleRequest(pseudoElementSpecifier, | 3178 this, PseudoStyleRequest(pseudoElementSpecifier, |
| 3166 PseudoStyleRequest::ForComputedStyle), | 3179 PseudoStyleRequest::ForComputedStyle), |
| 3167 elementStyle); | 3180 elementStyle, elementStyle); |
| 3168 DCHECK(result); | 3181 DCHECK(result); |
| 3169 return elementStyle->addCachedPseudoStyle(result.release()); | 3182 return elementStyle->addCachedPseudoStyle(result.release()); |
| 3170 } | 3183 } |
| 3171 | 3184 |
| 3185 const ComputedStyle* Element::nonLayoutObjectComputedStyle() const { | |
| 3186 if (layoutObject() || !hasRareData()) | |
| 3187 return nullptr; | |
| 3188 | |
| 3189 return elementRareData()->computedStyle(); | |
| 3190 } | |
| 3191 | |
| 3192 bool Element::hasDisplayContentsStyle() const { | |
| 3193 if (const ComputedStyle* style = nonLayoutObjectComputedStyle()) | |
| 3194 return style->display() == EDisplay::Contents; | |
| 3195 return false; | |
| 3196 } | |
| 3197 | |
| 3198 bool Element::shouldStoreNonLayoutObjectComputedStyle( | |
| 3199 const ComputedStyle& style) const { | |
| 3200 #if DCHECK_IS_ON() | |
| 3201 if (style.display() == EDisplay::Contents) | |
| 3202 DCHECK(!layoutObject()); | |
| 3203 #endif | |
| 3204 | |
| 3205 return style.display() == EDisplay::Contents || | |
| 3206 isHTMLOptGroupElement(*this) || isHTMLOptionElement(*this); | |
| 3207 } | |
| 3208 | |
| 3209 void Element::storeNonLayoutObjectComputedStyle( | |
| 3210 PassRefPtr<ComputedStyle> style) { | |
| 3211 DCHECK(style); | |
| 3212 DCHECK(shouldStoreNonLayoutObjectComputedStyle(*style)); | |
| 3213 ensureElementRareData().setComputedStyle(std::move(style)); | |
| 3214 } | |
| 3215 | |
| 3172 AtomicString Element::computeInheritedLanguage() const { | 3216 AtomicString Element::computeInheritedLanguage() const { |
| 3173 const Node* n = this; | 3217 const Node* n = this; |
| 3174 AtomicString value; | 3218 AtomicString value; |
| 3175 // The language property is inherited, so we iterate over the parents to find | 3219 // The language property is inherited, so we iterate over the parents to find |
| 3176 // the first language. | 3220 // the first language. |
| 3177 do { | 3221 do { |
| 3178 if (n->isElementNode()) { | 3222 if (n->isElementNode()) { |
| 3179 if (const ElementData* elementData = toElement(n)->elementData()) { | 3223 if (const ElementData* elementData = toElement(n)->elementData()) { |
| 3180 AttributeCollection attributes = elementData->attributes(); | 3224 AttributeCollection attributes = elementData->attributes(); |
| 3181 // Spec: xml:lang takes precedence -- http://www.w3.org/TR/xhtml1/#C_7 | 3225 // Spec: xml:lang takes precedence -- http://www.w3.org/TR/xhtml1/#C_7 |
| (...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3902 StyleChangeReasonForTracing::create(StyleChangeReason::StyleSheetChange)); | 3946 StyleChangeReasonForTracing::create(StyleChangeReason::StyleSheetChange)); |
| 3903 InspectorInstrumentation::didInvalidateStyleAttr(this); | 3947 InspectorInstrumentation::didInvalidateStyleAttr(this); |
| 3904 } | 3948 } |
| 3905 | 3949 |
| 3906 void Element::inlineStyleChanged() { | 3950 void Element::inlineStyleChanged() { |
| 3907 DCHECK(isStyledElement()); | 3951 DCHECK(isStyledElement()); |
| 3908 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create( | 3952 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create( |
| 3909 StyleChangeReason::Inline)); | 3953 StyleChangeReason::Inline)); |
| 3910 DCHECK(elementData()); | 3954 DCHECK(elementData()); |
| 3911 elementData()->m_styleAttributeIsDirty = true; | 3955 elementData()->m_styleAttributeIsDirty = true; |
| 3956 | |
|
rune
2017/01/27 13:09:23
Stray newline?
| |
| 3912 InspectorInstrumentation::didInvalidateStyleAttr(this); | 3957 InspectorInstrumentation::didInvalidateStyleAttr(this); |
| 3913 | 3958 |
| 3914 if (MutationObserverInterestGroup* recipients = | 3959 if (MutationObserverInterestGroup* recipients = |
| 3915 MutationObserverInterestGroup::createForAttributesMutation( | 3960 MutationObserverInterestGroup::createForAttributesMutation( |
| 3916 *this, styleAttr)) { | 3961 *this, styleAttr)) { |
| 3917 // We don't use getAttribute() here to get a style attribute value | 3962 // We don't use getAttribute() here to get a style attribute value |
| 3918 // before the change. | 3963 // before the change. |
| 3919 AtomicString oldValue; | 3964 AtomicString oldValue; |
| 3920 if (const Attribute* attribute = | 3965 if (const Attribute* attribute = |
| 3921 elementData()->attributes().find(styleAttr)) | 3966 elementData()->attributes().find(styleAttr)) |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4130 } | 4175 } |
| 4131 | 4176 |
| 4132 DEFINE_TRACE_WRAPPERS(Element) { | 4177 DEFINE_TRACE_WRAPPERS(Element) { |
| 4133 if (hasRareData()) { | 4178 if (hasRareData()) { |
| 4134 visitor->traceWrappers(elementRareData()); | 4179 visitor->traceWrappers(elementRareData()); |
| 4135 } | 4180 } |
| 4136 ContainerNode::traceWrappers(visitor); | 4181 ContainerNode::traceWrappers(visitor); |
| 4137 } | 4182 } |
| 4138 | 4183 |
| 4139 } // namespace blink | 4184 } // namespace blink |
| OLD | NEW |