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

Unified Diff: Source/core/css/resolver/StyleResolver.cpp

Issue 635203003: Skip rule matching during animations. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Avoid RenderStyle.h include Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/animation/ActiveAnimations.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « Source/core/animation/ActiveAnimations.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698