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 1721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1732 if (ElementAnimations* elementAnimations = | 1732 if (ElementAnimations* elementAnimations = |
1733 elementRareData()->elementAnimations()) { | 1733 elementRareData()->elementAnimations()) { |
1734 elementAnimations->cssAnimations().cancel(); | 1734 elementAnimations->cssAnimations().cancel(); |
1735 elementAnimations->setAnimationStyleChange(false); | 1735 elementAnimations->setAnimationStyleChange(false); |
1736 } | 1736 } |
1737 } | 1737 } |
1738 | 1738 |
1739 SelectorFilterParentScope filterScope(*this); | 1739 SelectorFilterParentScope filterScope(*this); |
1740 StyleSharingDepthScope sharingScope(*this); | 1740 StyleSharingDepthScope sharingScope(*this); |
1741 | 1741 |
| 1742 clearNeedsReattachLayoutTree(); |
1742 createPseudoElementIfNeeded(PseudoIdBefore); | 1743 createPseudoElementIfNeeded(PseudoIdBefore); |
1743 | 1744 |
1744 // When a shadow root exists, it does the work of attaching the children. | 1745 // When a shadow root exists, it does the work of attaching the children. |
1745 if (ElementShadow* shadow = this->shadow()) | 1746 if (ElementShadow* shadow = this->shadow()) |
1746 shadow->attach(context); | 1747 shadow->attach(context); |
1747 | 1748 |
1748 ContainerNode::attachLayoutTree(context); | 1749 ContainerNode::attachLayoutTree(context); |
1749 | 1750 |
1750 createPseudoElementIfNeeded(PseudoIdAfter); | 1751 createPseudoElementIfNeeded(PseudoIdAfter); |
1751 createPseudoElementIfNeeded(PseudoIdBackdrop); | 1752 createPseudoElementIfNeeded(PseudoIdBackdrop); |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2014 | 2015 |
2015 StyleRecalcChange localChange = | 2016 StyleRecalcChange localChange = |
2016 ComputedStyle::stylePropagationDiff(oldStyle.get(), newStyle.get()); | 2017 ComputedStyle::stylePropagationDiff(oldStyle.get(), newStyle.get()); |
2017 if (localChange == NoChange) { | 2018 if (localChange == NoChange) { |
2018 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesUnchanged, 1); | 2019 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesUnchanged, 1); |
2019 } else { | 2020 } else { |
2020 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesChanged, 1); | 2021 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesChanged, 1); |
2021 } | 2022 } |
2022 | 2023 |
2023 if (localChange == Reattach) { | 2024 if (localChange == Reattach) { |
| 2025 // This mimicks Element::recalcStyleForReattach except it also stores the |
| 2026 // nextTextSibling information. |
2024 StyleReattachData styleReattachData; | 2027 StyleReattachData styleReattachData; |
2025 styleReattachData.computedStyle = std::move(newStyle); | 2028 styleReattachData.computedStyle = std::move(newStyle); |
2026 styleReattachData.nextTextSibling = nextTextSibling; | 2029 styleReattachData.nextTextSibling = nextTextSibling; |
2027 document().addStyleReattachData(*this, styleReattachData); | 2030 document().addStyleReattachData(*this, styleReattachData); |
2028 setNeedsReattachLayoutTree(); | 2031 setNeedsReattachLayoutTree(); |
| 2032 if (layoutObjectIsNeeded(*styleReattachData.computedStyle)) { |
| 2033 recalcContainedStyleForReattach(); |
| 2034 } |
2029 return Reattach; | 2035 return Reattach; |
2030 } | 2036 } |
2031 | 2037 |
2032 DCHECK(oldStyle); | 2038 DCHECK(oldStyle); |
2033 | 2039 |
2034 if (localChange != NoChange) | 2040 if (localChange != NoChange) |
2035 updateCallbackSelectors(oldStyle.get(), newStyle.get()); | 2041 updateCallbackSelectors(oldStyle.get(), newStyle.get()); |
2036 | 2042 |
2037 if (LayoutObject* layoutObject = this->layoutObject()) { | 2043 if (LayoutObject* layoutObject = this->layoutObject()) { |
2038 if (localChange != NoChange) { | 2044 if (localChange != NoChange) { |
(...skipping 24 matching lines...) Expand all Loading... |
2063 return Inherit; | 2069 return Inherit; |
2064 newStyle->copyChildDependentFlagsFrom(*oldStyle); | 2070 newStyle->copyChildDependentFlagsFrom(*oldStyle); |
2065 } | 2071 } |
2066 if (oldStyle->hasPseudoElementStyle() || newStyle->hasPseudoElementStyle()) | 2072 if (oldStyle->hasPseudoElementStyle() || newStyle->hasPseudoElementStyle()) |
2067 return UpdatePseudoElements; | 2073 return UpdatePseudoElements; |
2068 } | 2074 } |
2069 | 2075 |
2070 return localChange; | 2076 return localChange; |
2071 } | 2077 } |
2072 | 2078 |
| 2079 void Element::recalcStyleForReattach() { |
| 2080 StyleReattachData styleReattachData; |
| 2081 styleReattachData.computedStyle = styleForLayoutObject(); |
| 2082 document().addStyleReattachData(*this, styleReattachData); |
| 2083 setNeedsReattachLayoutTree(); |
| 2084 if (layoutObjectIsNeeded(*styleReattachData.computedStyle.get())) { |
| 2085 recalcContainedStyleForReattach(); |
| 2086 } |
| 2087 } |
| 2088 |
| 2089 void Element::recalcContainedStyleForReattach() { |
| 2090 if (!childrenCanHaveStyle()) |
| 2091 return; |
| 2092 if (hasCustomStyleCallbacks()) |
| 2093 return; |
| 2094 |
| 2095 SelectorFilterParentScope filterScope(*this); |
| 2096 StyleSharingDepthScope sharingScope(*this); |
| 2097 recalcShadowRootStylesForReattach(); |
| 2098 recalcDescendantStylesForReattach(); |
| 2099 } |
| 2100 |
| 2101 void Element::recalcShadowRootStylesForReattach() { |
| 2102 for (ShadowRoot* root = youngestShadowRoot(); root; |
| 2103 root = root->olderShadowRoot()) { |
| 2104 root->recalcDescendantStylesForReattach(); |
| 2105 } |
| 2106 } |
| 2107 |
2073 void Element::rebuildLayoutTree() { | 2108 void Element::rebuildLayoutTree() { |
2074 DCHECK(inActiveDocument()); | 2109 DCHECK(inActiveDocument()); |
2075 DCHECK(parentNode()); | 2110 DCHECK(parentNode()); |
2076 | 2111 |
2077 if (needsReattachLayoutTree()) { | 2112 if (needsReattachLayoutTree()) { |
2078 StyleReattachData styleReattachData = | 2113 StyleReattachData styleReattachData = |
2079 document().getStyleReattachData(*this); | 2114 document().getStyleReattachData(*this); |
2080 AttachContext reattachContext; | 2115 AttachContext reattachContext; |
2081 reattachContext.resolvedStyle = styleReattachData.computedStyle.get(); | 2116 reattachContext.resolvedStyle = styleReattachData.computedStyle.get(); |
2082 bool layoutObjectWillChange = needsAttach() || layoutObject(); | 2117 bool layoutObjectWillChange = needsAttach() || layoutObject(); |
(...skipping 1150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3233 RefPtr<ComputedStyle> result = | 3268 RefPtr<ComputedStyle> result = |
3234 document().ensureStyleResolver().pseudoStyleForElement( | 3269 document().ensureStyleResolver().pseudoStyleForElement( |
3235 this, PseudoStyleRequest(pseudoElementSpecifier, | 3270 this, PseudoStyleRequest(pseudoElementSpecifier, |
3236 PseudoStyleRequest::ForComputedStyle), | 3271 PseudoStyleRequest::ForComputedStyle), |
3237 elementStyle, elementStyle); | 3272 elementStyle, elementStyle); |
3238 DCHECK(result); | 3273 DCHECK(result); |
3239 return elementStyle->addCachedPseudoStyle(result.release()); | 3274 return elementStyle->addCachedPseudoStyle(result.release()); |
3240 } | 3275 } |
3241 | 3276 |
3242 const ComputedStyle* Element::nonLayoutObjectComputedStyle() const { | 3277 const ComputedStyle* Element::nonLayoutObjectComputedStyle() const { |
| 3278 if (needsReattachLayoutTree()) |
| 3279 return document().getStyleReattachData(*this).computedStyle.get(); |
| 3280 |
3243 if (layoutObject() || !hasRareData()) | 3281 if (layoutObject() || !hasRareData()) |
3244 return nullptr; | 3282 return nullptr; |
3245 | 3283 |
3246 return elementRareData()->computedStyle(); | 3284 return elementRareData()->computedStyle(); |
3247 } | 3285 } |
3248 | 3286 |
3249 bool Element::hasDisplayContentsStyle() const { | 3287 bool Element::hasDisplayContentsStyle() const { |
3250 if (const ComputedStyle* style = nonLayoutObjectComputedStyle()) | 3288 if (const ComputedStyle* style = nonLayoutObjectComputedStyle()) |
3251 return style->display() == EDisplay::Contents; | 3289 return style->display() == EDisplay::Contents; |
3252 return false; | 3290 return false; |
(...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4227 } | 4265 } |
4228 | 4266 |
4229 DEFINE_TRACE_WRAPPERS(Element) { | 4267 DEFINE_TRACE_WRAPPERS(Element) { |
4230 if (hasRareData()) { | 4268 if (hasRareData()) { |
4231 visitor->traceWrappers(elementRareData()); | 4269 visitor->traceWrappers(elementRareData()); |
4232 } | 4270 } |
4233 ContainerNode::traceWrappers(visitor); | 4271 ContainerNode::traceWrappers(visitor); |
4234 } | 4272 } |
4235 | 4273 |
4236 } // namespace blink | 4274 } // namespace blink |
OLD | NEW |