Index: third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp |
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp |
index 71bf96ea8ac9e1b5c93c32921f727cd7f4d19600..fc4c4eda4c0cbe19b064af2a126855669194124f 100644 |
--- a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp |
+++ b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp |
@@ -44,6 +44,7 @@ |
#include "core/css/CSSCalculationValue.h" |
#include "core/css/CSSDefaultStyleSheets.h" |
#include "core/css/CSSFontSelector.h" |
+#include "core/css/CSSImportRule.h" |
#include "core/css/CSSKeyframeRule.h" |
#include "core/css/CSSKeyframesRule.h" |
#include "core/css/CSSReflectValue.h" |
@@ -880,6 +881,28 @@ PassRefPtrWillBeRawPtr<CSSRuleList> StyleResolver::cssRulesForElement(Element* e |
return pseudoCSSRulesForElement(element, NOPSEUDO, rulesToInclude); |
} |
+PassRefPtrWillBeRawPtr<CSSRuleList> StyleResolver::keyframesRulesForElement(Element* element) |
+{ |
+ ASSERT(element); |
+ RefPtrWillBeRawPtr<StaticCSSRuleList> ruleList = StaticCSSRuleList::create(); |
+ |
+ // TODO(samli): Repeat for all pseudo elements. |
lushnikov
2015/10/06 23:01:34
why do you want this to be for pseudo elements?
samli
2015/10/08 17:37:31
Pseudo elements can have CSS animations as well. S
|
+ RefPtr<ComputedStyle> style = styleForElement(element); |
+ if (!style) |
+ return ruleList; |
+ const CSSAnimationData* animationData = style->animations(); |
+ for (size_t i = 0; animationData && i < animationData->nameList().size(); ++i) { |
+ AtomicString animationName(animationData->nameList()[i]); |
+ if (animationName == CSSAnimationData::initialName()) |
+ continue; |
+ RefPtrWillBeRawPtr<CSSKeyframesRule> keyframesRule = findCSSKeyframesRule(element, animationName); |
+ if (!keyframesRule) |
+ continue; |
+ ruleList->rules().append(keyframesRule); |
+ } |
+ return ruleList; |
+} |
+ |
void StyleResolver::collectPseudoRulesForElement(Element* element, ElementRuleCollector& collector, PseudoId pseudoId, unsigned rulesToInclude) |
{ |
collector.setPseudoStyleRequest(PseudoStyleRequest(pseudoId)); |
@@ -953,6 +976,46 @@ StyleRuleKeyframes* StyleResolver::findKeyframesRule(const Element* element, con |
return nullptr; |
} |
+CSSKeyframesRule* StyleResolver::findCSSKeyframesRule(const Element* element, const AtomicString& animationName) |
+{ |
+ WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; |
+ collectScopedResolversForHostedShadowTrees(element, resolvers); |
+ if (ScopedStyleResolver* scopedResolver = element->treeScope().scopedStyleResolver()) |
+ resolvers.append(scopedResolver); |
+ |
+ for (size_t i = 0; i < resolvers.size(); ++i) { |
+ if (StyleRuleKeyframes* keyframesRule = resolvers[i]->keyframeStylesForAnimation(animationName.impl())) { |
+ CSSStyleSheet* styleSheet = resolvers[i]->styleSheetForAnimation(animationName.impl()); |
+ if (!styleSheet) |
+ continue; |
+ return findCSSKeyframesRule(styleSheet->cssRules(), keyframesRule); |
+ } |
+ } |
+ return nullptr; |
+} |
+ |
+CSSKeyframesRule* StyleResolver::findCSSKeyframesRule(PassRefPtrWillBeRawPtr<CSSRuleList> cssRules, StyleRuleKeyframes* keyframesRule) |
+{ |
+ if (!cssRules) |
+ return nullptr; |
+ CSSKeyframesRule* result = 0; |
+ for (unsigned i = 0; i < cssRules->length() && !result; ++i) { |
+ CSSRule* cssRule = cssRules->item(i); |
+ CSSRule::Type cssRuleType = cssRule->type(); |
+ if (cssRuleType == CSSRule::KEYFRAMES_RULE) { |
+ CSSKeyframesRule* cssKeyframesRule = toCSSKeyframesRule(cssRule); |
+ if (cssKeyframesRule->keyframesRule() == keyframesRule) |
+ return cssKeyframesRule; |
+ } else if (cssRuleType == CSSRule::IMPORT_RULE) { |
+ CSSImportRule* cssImportRule = toCSSImportRule(cssRule); |
+ result = findCSSKeyframesRule(cssImportRule->styleSheet()->cssRules(), keyframesRule); |
+ } else if (cssRuleType != CSSRule::STYLE_RULE) { |
+ result = findCSSKeyframesRule(cssRule->cssRules(), keyframesRule); |
+ } |
+ } |
+ return result; |
+} |
+ |
template <CSSPropertyPriority priority> |
void StyleResolver::applyAnimatedProperties(StyleResolverState& state, const ActiveInterpolationsMap& activeInterpolationsMap) |
{ |