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

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

Issue 2450093005: Support display: contents for elements, first-line and first-letter pseudos. (Closed)
Patch Set: Allow text as child of the LayoutView, since it can happen with display: contents Created 4 years 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
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. 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 1511 matching lines...) Expand 10 before | Expand all | Expand 10 after
1522 return parent->locateNamespacePrefix(namespaceToLocate); 1522 return parent->locateNamespacePrefix(namespaceToLocate);
1523 1523
1524 return nullAtom; 1524 return nullAtom;
1525 } 1525 }
1526 1526
1527 const AtomicString Element::imageSourceURL() const { 1527 const AtomicString Element::imageSourceURL() const {
1528 return getAttribute(srcAttr); 1528 return getAttribute(srcAttr);
1529 } 1529 }
1530 1530
1531 bool Element::layoutObjectIsNeeded(const ComputedStyle& style) { 1531 bool Element::layoutObjectIsNeeded(const ComputedStyle& style) {
1532 return style.display() != EDisplay::None; 1532 return style.display() != EDisplay::None &&
1533 style.display() != EDisplay::Contents;
1533 } 1534 }
1534 1535
1535 LayoutObject* Element::createLayoutObject(const ComputedStyle& style) { 1536 LayoutObject* Element::createLayoutObject(const ComputedStyle& style) {
1536 return LayoutObject::createObject(this, style); 1537 return LayoutObject::createObject(this, style);
1537 } 1538 }
1538 1539
1539 Node::InsertionNotificationRequest Element::insertedInto( 1540 Node::InsertionNotificationRequest Element::insertedInto(
1540 ContainerNode* insertionPoint) { 1541 ContainerNode* insertionPoint) {
1541 // need to do superclass processing first so isConnected() is true 1542 // need to do superclass processing first so isConnected() is true
1542 // by the time we reach updateId 1543 // by the time we reach updateId
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1660 void Element::attachLayoutTree(const AttachContext& context) { 1661 void Element::attachLayoutTree(const AttachContext& context) {
1661 DCHECK(document().inStyleRecalc()); 1662 DCHECK(document().inStyleRecalc());
1662 1663
1663 // We've already been through detach when doing an attach, but we might 1664 // We've already been through detach when doing an attach, but we might
1664 // need to clear any state that's been added since then. 1665 // need to clear any state that's been added since then.
1665 if (hasRareData() && getStyleChangeType() == NeedsReattachStyleChange) { 1666 if (hasRareData() && getStyleChangeType() == NeedsReattachStyleChange) {
1666 ElementRareData* data = elementRareData(); 1667 ElementRareData* data = elementRareData();
1667 data->clearComputedStyle(); 1668 data->clearComputedStyle();
1668 } 1669 }
1669 1670
1670 if (!isActiveSlotOrActiveInsertionPoint()) 1671 if (!isActiveSlotOrActiveInsertionPoint()) {
1671 LayoutTreeBuilderForElement(*this, context.resolvedStyle) 1672 LayoutTreeBuilderForElement builder(*this, context.resolvedStyle);
1672 .createLayoutObjectIfNeeded(); 1673 builder.createLayoutObjectIfNeeded();
1674
1675 if (ComputedStyle* style = builder.resolvedStyle()) {
1676 if (!layoutObject() && shouldStoreNonLayoutObjectComputedStyle(*style))
1677 storeNonLayoutObjectComputedStyle(style);
1678 }
1679 }
1673 1680
1674 addCallbackSelectors(); 1681 addCallbackSelectors();
1675 1682
1676 if (hasRareData() && !layoutObject()) { 1683 if (hasRareData() && !layoutObject()) {
1677 if (ElementAnimations* elementAnimations = 1684 if (ElementAnimations* elementAnimations =
1678 elementRareData()->elementAnimations()) { 1685 elementRareData()->elementAnimations()) {
1679 elementAnimations->cssAnimations().cancel(); 1686 elementAnimations->cssAnimations().cancel();
1680 elementAnimations->setAnimationStyleChange(false); 1687 elementAnimations->setAnimationStyleChange(false);
1681 } 1688 }
1682 } 1689 }
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); 1846 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc());
1840 DCHECK(inActiveDocument()); 1847 DCHECK(inActiveDocument());
1841 1848
1842 if (hasCustomStyleCallbacks()) 1849 if (hasCustomStyleCallbacks())
1843 willRecalcStyle(change); 1850 willRecalcStyle(change);
1844 1851
1845 if (change >= IndependentInherit || needsStyleRecalc()) { 1852 if (change >= IndependentInherit || needsStyleRecalc()) {
1846 if (hasRareData()) { 1853 if (hasRareData()) {
1847 ElementRareData* data = elementRareData(); 1854 ElementRareData* data = elementRareData();
1848 if (change != IndependentInherit) 1855 if (change != IndependentInherit)
1849 data->clearComputedStyle(); 1856 data->clearComputedStyle();
rune 2016/12/01 15:28:53 Don't you need to avoid doing this before recalcOw
emilio 2016/12/01 17:32:56 Hmm, right, otherwise we can end up recomputing to
1850 1857
1851 if (change >= IndependentInherit) { 1858 if (change >= IndependentInherit) {
1852 if (ElementAnimations* elementAnimations = data->elementAnimations()) 1859 if (ElementAnimations* elementAnimations = data->elementAnimations())
1853 elementAnimations->setAnimationStyleChange(false); 1860 elementAnimations->setAnimationStyleChange(false);
1854 } 1861 }
1855 } 1862 }
1856 if (parentComputedStyle()) 1863 if (parentComputedStyle())
1857 change = recalcOwnStyle(change, nextTextSibling); 1864 change = recalcOwnStyle(change, nextTextSibling);
1858 clearNeedsStyleRecalc(); 1865 clearNeedsStyleRecalc();
1859 clearNeedsReattachLayoutTree(); 1866 clearNeedsReattachLayoutTree();
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1961 pseudoStyleCacheIsInvalid(oldStyle.get(), newStyle.get())) { 1968 pseudoStyleCacheIsInvalid(oldStyle.get(), newStyle.get())) {
1962 layoutObject->setStyle(newStyle.get()); 1969 layoutObject->setStyle(newStyle.get());
1963 } else { 1970 } else {
1964 // Although no change occurred, we use the new style so that the cousin 1971 // Although no change occurred, we use the new style so that the cousin
1965 // style sharing code won't get fooled into believing this style is the 1972 // style sharing code won't get fooled into believing this style is the
1966 // same. 1973 // same.
1967 // FIXME: We may be able to remove this hack, see discussion in 1974 // FIXME: We may be able to remove this hack, see discussion in
1968 // https://codereview.chromium.org/30453002/ 1975 // https://codereview.chromium.org/30453002/
1969 layoutObject->setStyleInternal(newStyle.get()); 1976 layoutObject->setStyleInternal(newStyle.get());
1970 } 1977 }
1978 } else if (localChange != NoChange &&
1979 shouldStoreNonLayoutObjectComputedStyle(*newStyle)) {
1980 storeNonLayoutObjectComputedStyle(newStyle);
1971 } 1981 }
1972 1982
1973 if (getStyleChangeType() >= SubtreeStyleChange) 1983 if (getStyleChangeType() >= SubtreeStyleChange)
1974 return Force; 1984 return Force;
1975 1985
1976 if (change > Inherit || localChange > Inherit) 1986 if (change > Inherit || localChange > Inherit)
1977 return max(localChange, change); 1987 return max(localChange, change);
1978 1988
1979 if (localChange < IndependentInherit) { 1989 if (localChange < IndependentInherit) {
1980 if (oldStyle->hasChildDependentFlags()) { 1990 if (oldStyle->hasChildDependentFlags()) {
(...skipping 1132 matching lines...) Expand 10 before | Expand all | Expand 10 after
3113 elementStyle = rareData.computedStyle(); 3123 elementStyle = rareData.computedStyle();
3114 } 3124 }
3115 3125
3116 if (!pseudoElementSpecifier) 3126 if (!pseudoElementSpecifier)
3117 return elementStyle; 3127 return elementStyle;
3118 3128
3119 if (ComputedStyle* pseudoElementStyle = 3129 if (ComputedStyle* pseudoElementStyle =
3120 elementStyle->getCachedPseudoStyle(pseudoElementSpecifier)) 3130 elementStyle->getCachedPseudoStyle(pseudoElementSpecifier))
3121 return pseudoElementStyle; 3131 return pseudoElementStyle;
3122 3132
3133 // FIXME(ecobos): Passing two times elementStyle may be wrong, though we don't
3134 // support display: contents pseudo-elements yet, so this is not a problem for
3135 // now.
rune 2016/12/01 15:28:53 FIXME -> TODO. It is wrong, but it's not about di
emilio 2016/12/01 17:32:56 Right, should've clarified.
3123 RefPtr<ComputedStyle> result = 3136 RefPtr<ComputedStyle> result =
3124 document().ensureStyleResolver().pseudoStyleForElement( 3137 document().ensureStyleResolver().pseudoStyleForElement(
3125 this, PseudoStyleRequest(pseudoElementSpecifier, 3138 this, PseudoStyleRequest(pseudoElementSpecifier,
3126 PseudoStyleRequest::ForComputedStyle), 3139 PseudoStyleRequest::ForComputedStyle),
3127 elementStyle); 3140 elementStyle, elementStyle);
3128 DCHECK(result); 3141 DCHECK(result);
3129 return elementStyle->addCachedPseudoStyle(result.release()); 3142 return elementStyle->addCachedPseudoStyle(result.release());
3130 } 3143 }
3131 3144
3145 const ComputedStyle* Element::nonLayoutObjectComputedStyle() const {
3146 if (layoutObject() || !hasRareData())
3147 return nullptr;
3148
3149 return elementRareData()->computedStyle();
3150 }
3151
3152 bool Element::hasDisplayContentsStyle() const {
3153 if (const ComputedStyle* style = nonLayoutObjectComputedStyle())
3154 return style->display() == EDisplay::Contents;
3155 return false;
3156 }
3157
3158 bool Element::shouldStoreNonLayoutObjectComputedStyle(
3159 const ComputedStyle& style) const {
3160 #if DCHECK_IS_ON()
3161 if (style.display() == EDisplay::Contents)
3162 DCHECK(!layoutObject());
3163 #endif
3164
3165 return style.display() == EDisplay::Contents ||
3166 isHTMLOptGroupElement(*this) || isHTMLOptionElement(*this);
3167 }
3168
3169 void Element::storeNonLayoutObjectComputedStyle(
3170 PassRefPtr<ComputedStyle> style) {
3171 DCHECK(style);
3172 DCHECK(shouldStoreNonLayoutObjectComputedStyle(*style));
3173 ensureElementRareData().setComputedStyle(std::move(style));
3174 }
3175
3132 AtomicString Element::computeInheritedLanguage() const { 3176 AtomicString Element::computeInheritedLanguage() const {
3133 const Node* n = this; 3177 const Node* n = this;
3134 AtomicString value; 3178 AtomicString value;
3135 // The language property is inherited, so we iterate over the parents to find 3179 // The language property is inherited, so we iterate over the parents to find
3136 // the first language. 3180 // the first language.
3137 do { 3181 do {
3138 if (n->isElementNode()) { 3182 if (n->isElementNode()) {
3139 if (const ElementData* elementData = toElement(n)->elementData()) { 3183 if (const ElementData* elementData = toElement(n)->elementData()) {
3140 AttributeCollection attributes = elementData->attributes(); 3184 AttributeCollection attributes = elementData->attributes();
3141 // Spec: xml:lang takes precedence -- http://www.w3.org/TR/xhtml1/#C_7 3185 // Spec: xml:lang takes precedence -- http://www.w3.org/TR/xhtml1/#C_7
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
3855 StyleChangeReasonForTracing::create(StyleChangeReason::StyleSheetChange)); 3899 StyleChangeReasonForTracing::create(StyleChangeReason::StyleSheetChange));
3856 InspectorInstrumentation::didInvalidateStyleAttr(this); 3900 InspectorInstrumentation::didInvalidateStyleAttr(this);
3857 } 3901 }
3858 3902
3859 void Element::inlineStyleChanged() { 3903 void Element::inlineStyleChanged() {
3860 DCHECK(isStyledElement()); 3904 DCHECK(isStyledElement());
3861 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create( 3905 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(
3862 StyleChangeReason::Inline)); 3906 StyleChangeReason::Inline));
3863 DCHECK(elementData()); 3907 DCHECK(elementData());
3864 elementData()->m_styleAttributeIsDirty = true; 3908 elementData()->m_styleAttributeIsDirty = true;
3909
3865 InspectorInstrumentation::didInvalidateStyleAttr(this); 3910 InspectorInstrumentation::didInvalidateStyleAttr(this);
3866 3911
3867 if (MutationObserverInterestGroup* recipients = 3912 if (MutationObserverInterestGroup* recipients =
3868 MutationObserverInterestGroup::createForAttributesMutation( 3913 MutationObserverInterestGroup::createForAttributesMutation(
3869 *this, styleAttr)) { 3914 *this, styleAttr)) {
3870 // We don't use getAttribute() here to get a style attribute value 3915 // We don't use getAttribute() here to get a style attribute value
3871 // before the change. 3916 // before the change.
3872 AtomicString oldValue; 3917 AtomicString oldValue;
3873 if (const Attribute* attribute = 3918 if (const Attribute* attribute =
3874 elementData()->attributes().find(styleAttr)) 3919 elementData()->attributes().find(styleAttr))
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
4089 } 4134 }
4090 4135
4091 DEFINE_TRACE_WRAPPERS(Element) { 4136 DEFINE_TRACE_WRAPPERS(Element) {
4092 if (hasRareData()) { 4137 if (hasRareData()) {
4093 visitor->traceWrappers(elementRareData()); 4138 visitor->traceWrappers(elementRareData());
4094 } 4139 }
4095 ContainerNode::traceWrappers(visitor); 4140 ContainerNode::traceWrappers(visitor);
4096 } 4141 }
4097 4142
4098 } // namespace blink 4143 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/Element.h ('k') | third_party/WebKit/Source/core/dom/LayoutTreeBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698