 Chromium Code Reviews
 Chromium Code Reviews Issue 635203003:
  Skip rule matching during animations.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/blink.git@master
    
  
    Issue 635203003:
  Skip rule matching during animations.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/blink.git@master| Index: Source/core/css/resolver/StyleResolver.cpp | 
| diff --git a/Source/core/css/resolver/StyleResolver.cpp b/Source/core/css/resolver/StyleResolver.cpp | 
| index 526c7f1f286fc268e23c518a069b7fcb7df2c1e4..68433351d1385a44e1747eddf083db05d385562d 100644 | 
| --- a/Source/core/css/resolver/StyleResolver.cpp | 
| +++ b/Source/core/css/resolver/StyleResolver.cpp | 
| @@ -543,6 +543,33 @@ void StyleResolver::loadPendingResources(StyleResolverState& state) | 
| document().styleEngine()->fontSelector()->fontLoader()->loadPendingFonts(); | 
| } | 
| +struct AnimationResolveData { | 
| + | 
| + AnimationResolveData(Element* element) | 
| + : baseRenderStyle(nullptr) | 
| + , useBaseRenderStyle(false) | 
| + { | 
| + if (!element) | 
| + return; | 
| + | 
| + if (ActiveAnimations* animations = element->activeAnimations()) { | 
| + useBaseRenderStyle = animations->isAnimationStyleChange(); | 
| + if (useBaseRenderStyle) | 
| + baseRenderStyle = animations->baseRenderStyle(); | 
| + else | 
| + animations->setBaseRenderStyle(nullptr); | 
| 
esprehn
2014/10/13 21:44:26
This really doesn't seem like the right place to h
 
rune
2014/10/13 22:24:49
There are a bunch of ways to do this. Do you think
 | 
| + | 
| +#if ENABLE(ASSERT) | 
| + // Force recalc of the base style to check that the cached one was correct. | 
| + baseRenderStyle = nullptr; | 
| +#endif // !ASSERT | 
| + } | 
| + } | 
| + | 
| + const RenderStyle* baseRenderStyle; | 
| + bool useBaseRenderStyle; | 
| +}; | 
| + | 
| PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderStyle* defaultParent, StyleSharingBehavior sharingBehavior, | 
| RuleMatchingBehavior matchingBehavior) | 
| { | 
| @@ -578,7 +605,12 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS | 
| return sharedStyle.release(); | 
| } | 
| - if (state.parentStyle()) { | 
| + | 
| + AnimationResolveData animationData(element); | 
| + | 
| + if (animationData.baseRenderStyle) { | 
| + state.setStyle(RenderStyle::clone(animationData.baseRenderStyle)); | 
| + } else if (state.parentStyle()) { | 
| state.setStyle(RenderStyle::create()); | 
| state.style()->inheritFrom(state.parentStyle(), isAtShadowBoundary(element) ? RenderStyle::AtShadowBoundary : RenderStyle::NotAtShadowBoundary); | 
| } else { | 
| @@ -607,12 +639,13 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS | 
| state.style()->setInsideLink(linkState); | 
| } | 
| - bool needsCollection = false; | 
| - CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetsForElement(element, needsCollection); | 
| - if (needsCollection) | 
| - collectFeatures(); | 
| + if (!animationData.baseRenderStyle) { | 
| + | 
| + bool needsCollection = false; | 
| + CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetsForElement(element, needsCollection); | 
| + if (needsCollection) | 
| + collectFeatures(); | 
| - { | 
| ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style()); | 
| matchAllRules(state, collector, matchingBehavior != MatchAllRulesExcludingSMIL); | 
| @@ -621,12 +654,15 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS | 
| applyCallbackSelectors(state); | 
| addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); | 
| - } | 
| - // Cache our original display. | 
| - state.style()->setOriginalDisplay(state.style()->display()); | 
| + // Cache our original display. | 
| + state.style()->setOriginalDisplay(state.style()->display()); | 
| + | 
| + adjustRenderStyle(state, element); | 
| - adjustRenderStyle(state, element); | 
| + if (animationData.useBaseRenderStyle) | 
| + element->activeAnimations()->setBaseRenderStyle(RenderStyle::clone(state.style())); | 
| + } | 
| // FIXME: The CSSWG wants to specify that the effects of animations are applied before | 
| // important rules, but this currently happens here as we require adjustment to have happened | 
| @@ -761,7 +797,13 @@ bool StyleResolver::pseudoStyleForElementInternal(Element& element, const Pseudo | 
| StyleResolverParentScope::ensureParentStackIsPushed(); | 
| - if (pseudoStyleRequest.allowsInheritance(state.parentStyle())) { | 
| + Element* pseudoElement = element.pseudoElement(pseudoStyleRequest.pseudoId); | 
| + | 
| + AnimationResolveData animationData(pseudoElement); | 
| + | 
| + if (animationData.baseRenderStyle) { | 
| + state.setStyle(RenderStyle::clone(animationData.baseRenderStyle)); | 
| + } else if (pseudoStyleRequest.allowsInheritance(state.parentStyle())) { | 
| state.setStyle(RenderStyle::create()); | 
| state.style()->inheritFrom(state.parentStyle()); | 
| } else { | 
| @@ -775,7 +817,7 @@ bool StyleResolver::pseudoStyleForElementInternal(Element& element, const Pseudo | 
| // Since we don't use pseudo-elements in any of our quirk/print | 
| // user agent rules, don't waste time walking those rules. | 
| - { | 
| + if (!animationData.baseRenderStyle) { | 
| // Check UA, user and author rules. | 
| ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style()); | 
| collector.setPseudoStyleRequest(pseudoStyleRequest); | 
| @@ -790,19 +832,22 @@ bool StyleResolver::pseudoStyleForElementInternal(Element& element, const Pseudo | 
| applyCallbackSelectors(state); | 
| addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); | 
| - } | 
| - // Cache our original display. | 
| - state.style()->setOriginalDisplay(state.style()->display()); | 
| + // Cache our original display. | 
| + state.style()->setOriginalDisplay(state.style()->display()); | 
| - // FIXME: Passing 0 as the Element* introduces a lot of complexity | 
| - // in the adjustRenderStyle code. | 
| - adjustRenderStyle(state, 0); | 
| + // FIXME: Passing 0 as the Element* introduces a lot of complexity | 
| + // in the adjustRenderStyle code. | 
| + adjustRenderStyle(state, 0); | 
| + | 
| + if (animationData.useBaseRenderStyle) | 
| + pseudoElement->activeAnimations()->setBaseRenderStyle(RenderStyle::clone(state.style())); | 
| + } | 
| // FIXME: The CSSWG wants to specify that the effects of animations are applied before | 
| // important rules, but this currently happens here as we require adjustment to have happened | 
| // before deciding which properties to transition. | 
| - if (applyAnimatedProperties(state, element.pseudoElement(pseudoStyleRequest.pseudoId))) | 
| + if (applyAnimatedProperties(state, pseudoElement)) | 
| adjustRenderStyle(state, 0); | 
| didAccess(); |