Chromium Code Reviews| 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) |
| { |