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

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

Issue 71083002: Web Animations: Use legacy cascade behaviour and the MatchedPropertiesCache (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: Created 7 years, 1 month 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
Index: Source/core/css/resolver/StyleResolver.cpp
diff --git a/Source/core/css/resolver/StyleResolver.cpp b/Source/core/css/resolver/StyleResolver.cpp
index 7bee76713e402b7bf22a24c7ab90ed0e3bbcb052..43ddfa36b165137c78d7949ca23d219337dbbcd9 100644
--- a/Source/core/css/resolver/StyleResolver.cpp
+++ b/Source/core/css/resolver/StyleResolver.cpp
@@ -531,9 +531,6 @@ void StyleResolver::matchAllRules(StyleResolverState& state, ElementRuleCollecto
// Now check SMIL animation override style.
if (includeSMILProperties && state.element()->isSVGElement())
collector.addElementStyleProperties(toSVGElement(state.element())->animatedSMILStyleProperties(), false /* isCacheable */);
-
- if (state.element()->hasActiveAnimations())
- collector.matchedResult().isCacheable = false;
}
}
@@ -1176,6 +1173,7 @@ void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
unsigned cacheHash = matchResult.isCacheable ? computeMatchedPropertiesHash(matchResult.matchedProperties.data(), matchResult.matchedProperties.size()) : 0;
bool applyInheritedOnly = false;
+ bool applyAnimatedOnly = false;
const CachedMatchedProperties* cachedMatchedProperties = 0;
if (cacheHash && (cachedMatchedProperties = m_matchedPropertiesCache.find(cacheHash, state, matchResult))
@@ -1195,109 +1193,104 @@ void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
// Unfortunately the link status is treated like an inherited property. We need to explicitly restore it.
state.style()->setInsideLink(linkStatus);
- return;
+
+ if (RuntimeEnabledFeatures::webAnimationsEnabled()) {
Steve Block 2013/11/14 02:17:18 This should probably be WebAnimationsCSSEnabled()
dstockwell 2013/11/14 02:59:49 It's a bit mixed up, we could just kill the 'WebAn
Timothy Loh 2013/11/14 03:06:31 Erm; changed the callers in this file anyway.
+ applyAnimatedOnly = element->hasActiveAnimations()
dstockwell 2013/11/13 23:37:19 Would it be cleaner to pull out the application of
Steve Block 2013/11/14 02:17:18 Agreed
Timothy Loh 2013/11/14 03:06:31 Done. I wasn't sure if this would make it cleaner,
+ || (state.style()->transitions() && !state.style()->transitions()->isEmpty())
+ || (state.style()->animations() && !state.style()->animations()->isEmpty());
+ }
+ if (!applyAnimatedOnly)
+ return;
}
applyInheritedOnly = true;
}
- // First apply all variable definitions, as they may be used during application of later properties.
- applyMatchedProperties<VariableDefinitions>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
- applyMatchedProperties<VariableDefinitions>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
- applyMatchedProperties<VariableDefinitions>(state, matchResult, true, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
- applyMatchedProperties<VariableDefinitions>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
-
- // Apply animation properties in order to apply animation results and trigger transitions below.
- applyMatchedProperties<AnimationProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
- applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
- applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
- applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
-
- // Match transition-property / animation-name length by trimming and
- // lengthening other transition / animation property lists
- // FIXME: This is wrong because we shouldn't affect the computed values
- state.style()->adjustAnimations();
- state.style()->adjustTransitions();
-
- // Now we have all of the matched rules in the appropriate order. Walk the rules and apply
- // high-priority properties first, i.e., those properties that other properties depend on.
- // The order is (1) high-priority not important, (2) high-priority important, (3) normal not important
- // and (4) normal important.
- state.setLineHeightValue(0);
- applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
- applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
- applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
- applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
-
- if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effectiveZoom() != state.style()->effectiveZoom()) {
- state.fontBuilder().setFontDirty(true);
- applyInheritedOnly = false;
- }
+ if (!applyAnimatedOnly) {
+ // First apply all variable definitions, as they may be used during application of later properties.
+ applyMatchedProperties<VariableDefinitions>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
+ applyMatchedProperties<VariableDefinitions>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
+ applyMatchedProperties<VariableDefinitions>(state, matchResult, true, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
+ applyMatchedProperties<VariableDefinitions>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
+
+ // Apply animation properties in order to apply animation results and trigger transitions below.
+ applyMatchedProperties<AnimationProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
+ applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
+ applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
+ applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
+
+ // Match transition-property / animation-name length by trimming and
+ // lengthening other transition / animation property lists
+ // FIXME: This is wrong because we shouldn't affect the computed values
+ state.style()->adjustAnimations();
+ state.style()->adjustTransitions();
+
+ // Now we have all of the matched rules in the appropriate order. Walk the rules and apply
+ // high-priority properties first, i.e., those properties that other properties depend on.
+ // The order is (1) high-priority not important, (2) high-priority important, (3) normal not important
+ // and (4) normal important.
+ state.setLineHeightValue(0);
+ applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
+ applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
+ applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
+ applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
+
+ if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effectiveZoom() != state.style()->effectiveZoom()) {
+ state.fontBuilder().setFontDirty(true);
+ applyInheritedOnly = false;
+ }
- // If our font got dirtied, go ahead and update it now.
- updateFont(state);
+ // If our font got dirtied, go ahead and update it now.
+ updateFont(state);
- // Line-height is set when we are sure we decided on the font-size.
- if (state.lineHeightValue())
- StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeightValue());
+ // Line-height is set when we are sure we decided on the font-size.
+ if (state.lineHeightValue())
+ StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeightValue());
+
+ // Many properties depend on the font. If it changes we just apply all properties.
+ if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->fontDescription() != state.style()->fontDescription())
+ applyInheritedOnly = false;
- // Many properties depend on the font. If it changes we just apply all properties.
- if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->fontDescription() != state.style()->fontDescription())
- applyInheritedOnly = false;
+ // Now do the normal priority UA properties.
+ applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
- // Now do the normal priority UA properties.
- applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
+ // Cache the UA properties to pass them to RenderTheme in adjustRenderStyle.
+ state.cacheUserAgentBorderAndBackground();
- // Cache the UA properties to pass them to RenderTheme in adjustRenderStyle.
- state.cacheUserAgentBorderAndBackground();
+ // Now do the author and user normal priority properties and all the !important properties.
+ applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, matchResult.ranges.lastUARule + 1, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
+ applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
+ applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
+ applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
- // Now do the author and user normal priority properties and all the !important properties.
- applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, matchResult.ranges.lastUARule + 1, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
- applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
- applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
- applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
+ // Start loading resources referenced by this style.
+ m_styleResourceLoader.loadPendingResources(state.style(), state.elementStyleResources());
+
+#ifdef STYLE_STATS
+ if (!cachedMatchedProperties)
+ STYLE_STATS_ADD_MATCHED_PROPERTIES_TO_CACHE();
+#endif
+
+ if (!cachedMatchedProperties && cacheHash && MatchedPropertiesCache::isCacheable(element, state.style(), state.parentStyle())) {
+ STYLE_STATS_ADD_MATCHED_PROPERTIES_ENTERED_INTO_CACHE();
+ m_matchedPropertiesCache.add(state.style(), state.parentStyle(), cacheHash, matchResult);
+ }
+ }
// animatingElement may be null, for example if we're calculating the
// style for a potential pseudo element that has yet to be created.
if (RuntimeEnabledFeatures::webAnimationsEnabled() && animatingElement) {
state.setAnimationUpdate(CSSAnimations::calculateUpdate(animatingElement, *state.style(), this));
if (state.animationUpdate()) {
- ASSERT(!applyInheritedOnly);
const AnimationEffect::CompositableValueMap& compositableValuesForAnimations = state.animationUpdate()->compositableValuesForAnimations();
const AnimationEffect::CompositableValueMap& compositableValuesForTransitions = state.animationUpdate()->compositableValuesForTransitions();
- // Apply animated properties, then reapply any rules marked important.
- if (applyAnimatedProperties<HighPriorityProperties>(state, compositableValuesForAnimations)) {
- bool important = true;
- applyMatchedProperties<HighPriorityProperties>(state, matchResult, important, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
- applyMatchedProperties<HighPriorityProperties>(state, matchResult, important, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
- applyMatchedProperties<HighPriorityProperties>(state, matchResult, important, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
- }
+ applyAnimatedProperties<HighPriorityProperties>(state, compositableValuesForAnimations);
applyAnimatedProperties<HighPriorityProperties>(state, compositableValuesForTransitions);
- if (applyAnimatedProperties<LowPriorityProperties>(state, compositableValuesForAnimations)) {
- bool important = true;
- applyMatchedProperties<LowPriorityProperties>(state, matchResult, important, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
- applyMatchedProperties<LowPriorityProperties>(state, matchResult, important, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
- applyMatchedProperties<LowPriorityProperties>(state, matchResult, important, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
- }
+ applyAnimatedProperties<LowPriorityProperties>(state, compositableValuesForAnimations);
applyAnimatedProperties<LowPriorityProperties>(state, compositableValuesForTransitions);
}
}
- // Start loading resources referenced by this style.
- m_styleResourceLoader.loadPendingResources(state.style(), state.elementStyleResources());
-
ASSERT(!state.fontBuilder().fontDirty());
-
-#ifdef STYLE_STATS
- if (!cachedMatchedProperties)
- STYLE_STATS_ADD_MATCHED_PROPERTIES_TO_CACHE();
-#endif
-
- if (cachedMatchedProperties || !cacheHash)
- return;
- if (!MatchedPropertiesCache::isCacheable(element, state.style(), state.parentStyle()))
- return;
- STYLE_STATS_ADD_MATCHED_PROPERTIES_ENTERED_INTO_CACHE();
- m_matchedPropertiesCache.add(state.style(), state.parentStyle(), cacheHash, matchResult);
}
CSSPropertyValue::CSSPropertyValue(CSSPropertyID id, const StylePropertySet& propertySet)

Powered by Google App Engine
This is Rietveld 408576698