|
25 | 25 | // decorates styles with rule info and returns an array of used style
|
26 | 26 | // property names
|
27 | 27 | decorateStyles: function(styles) {
|
28 |
| - var self = this, props = {}; |
29 |
| - styleUtil.forRulesInStyles(styles, function(rule) { |
| 28 | + var self = this, props = {}, keyframes = []; |
| 29 | + styleUtil.forRulesInStyles(styles, function onStyleRule(rule) { |
30 | 30 | self.decorateRule(rule);
|
31 | 31 | self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);
|
| 32 | + }, function onKeyframesRule(rule) { |
| 33 | + keyframes.push(rule); |
32 | 34 | });
|
| 35 | + // Cache all found keyframes rules for later reference: |
| 36 | + styles._keyframes = keyframes; |
33 | 37 | // return this list of property names *consumes* in these styles.
|
34 | 38 | var names = [];
|
35 | 39 | for (var i in props) {
|
|
263 | 267 | hostSelector;
|
264 | 268 | var hostRx = new RegExp(this.rx.HOST_PREFIX + rxHostSelector +
|
265 | 269 | this.rx.HOST_SUFFIX);
|
| 270 | + var keyframesRules = element._styles._keyframes; |
266 | 271 | var keyframeTransforms = {};
|
267 | 272 |
|
| 273 | + if (!nativeShadow) { |
| 274 | + // For non-ShadowDOM, we transform all known keyframes rules in |
| 275 | + // advance for the current scope. This allows us to catch keyframes |
| 276 | + // rules that appear anywhere in the stylesheet: |
| 277 | + for (var i = 0, keyframesRule = keyframesRules[i]; |
| 278 | + i < keyframesRules.length; |
| 279 | + keyframesRule = keyframesRules[++i]) { |
| 280 | + this._scopeKeyframes(keyframesRule, scopeSelector); |
| 281 | + keyframeTransforms[keyframesRule.keyframesName] = function(rule, cssText) { |
| 282 | + return cssText.replace(rule.keyframesNameRx, rule.transformedKeyframesName); |
| 283 | + }.bind(this, keyframesRule); |
| 284 | + } |
| 285 | + } |
| 286 | + |
268 | 287 | return styleTransformer.elementStyles(element, function(rule) {
|
269 | 288 | self.applyProperties(rule, properties);
|
270 | 289 | self.applyKeyframeTransforms(rule, keyframeTransforms);
|
271 |
| - if (!nativeShadow) { |
272 |
| - // If the rule is a keyframe selector, we put a transformation in |
273 |
| - // the keyframeTransforms map so that it can be applied to other |
274 |
| - // rules in the future. We use an anonymous function for the |
275 |
| - // transformer so that we can avoid creating a new RegExp for every |
276 |
| - // call to `applyKeyframeTransforms`. |
277 |
| - if (Polymer.StyleUtil.isKeyframesSelector(rule)) { |
278 |
| - var keyframesNameRx = new RegExp(rule.parent.keyframesName, 'g'); |
279 |
| - self._scopeKeyframes(rule.parent, scopeSelector); |
280 |
| - keyframeTransforms[rule.parent.keyframesName] = function(cssText) { |
281 |
| - return cssText.replace( |
282 |
| - keyframesNameRx, rule.parent.transformedKeyframesName); |
283 |
| - }; |
284 |
| - } else if (rule.cssText) { |
285 |
| - self._scopeSelector(rule, hostRx, hostSelector, |
286 |
| - element._scopeCssViaAttr, scopeSelector); |
287 |
| - } |
| 290 | + |
| 291 | + if (!nativeShadow && |
| 292 | + !Polymer.StyleUtil.isKeyframesSelector(rule) && |
| 293 | + rule.cssText) { |
| 294 | + self._scopeSelector(rule, hostRx, hostSelector, |
| 295 | + element._scopeCssViaAttr, scopeSelector); |
288 | 296 | }
|
289 | 297 | });
|
290 | 298 | },
|
291 | 299 |
|
292 | 300 | // Transforms `@keyframes` names to be unique for the current host.
|
293 | 301 | // Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0
|
294 | 302 | _scopeKeyframes: function(rule, scopeId) {
|
| 303 | + rule.keyframesNameRx = new RegExp(rule.keyframesName, 'g'); |
295 | 304 | rule.transformedKeyframesName = rule.keyframesName + '-' + scopeId;
|
296 | 305 | rule.transformedSelector = rule.transformedSelector || rule.selector;
|
297 | 306 | rule.selector = rule.transformedSelector.replace(
|
|
0 commit comments