|
182 | 182 | // keyframeTransforms object is a map of keyframe names to transformer
|
183 | 183 | // functions which take in cssText and spit out transformed cssText.
|
184 | 184 | applyKeyframeTransforms: function(rule, keyframeTransforms) {
|
| 185 | + var input = rule.cssText; |
185 | 186 | var output = rule.cssText;
|
186 |
| - if (this.rx.ANIMATION_MATCH.test(output)) { |
187 |
| - for (var keyframe in keyframeTransforms) { |
188 |
| - var transform = keyframeTransforms[keyframe]; |
189 |
| - output = transform(output); |
| 187 | + |
| 188 | + if (rule.hasAnimations == null) { |
| 189 | + // Cache whether or not the rule has any animations to begin with: |
| 190 | + rule.hasAnimations = this.rx.ANIMATION_MATCH.test(input); |
| 191 | + } |
| 192 | + |
| 193 | + // If there are no animations referenced, we can skip transforms: |
| 194 | + if (rule.hasAnimations) { |
| 195 | + var transform; |
| 196 | + // If we haven't transformed this rule before, we iterate over all |
| 197 | + // transforms: |
| 198 | + if (rule.keyframeNamesToTransform == null) { |
| 199 | + rule.keyframeNamesToTransform = []; |
| 200 | + |
| 201 | + for (var keyframe in keyframeTransforms) { |
| 202 | + transform = keyframeTransforms[keyframe]; |
| 203 | + output = transform(input); |
| 204 | + // If the transform actually changed the CSS text, we cache the |
| 205 | + // transform name for future use: |
| 206 | + if (input !== output) { |
| 207 | + input = output; |
| 208 | + rule.keyframeNamesToTransform.push(keyframe); |
| 209 | + } |
| 210 | + } |
| 211 | + } else { |
| 212 | + // If we already have a list of keyframe names that apply to this |
| 213 | + // rule, we apply only those keyframe name transforms: |
| 214 | + for (var i = 0; i < rule.keyframeNamesToTransform.length; ++i) { |
| 215 | + transform = keyframeTransforms[rule.keyframeNamesToTransform[i]]; |
| 216 | + input = transform(input); |
| 217 | + } |
| 218 | + output = input; |
190 | 219 | }
|
191 | 220 | }
|
| 221 | + |
192 | 222 | rule.cssText = output;
|
193 | 223 | },
|
194 | 224 |
|
|
258 | 288 | return props;
|
259 | 289 | },
|
260 | 290 |
|
| 291 | + |
261 | 292 | transformStyles: function(element, properties, scopeSelector) {
|
262 | 293 | var self = this;
|
263 | 294 | var hostSelector = styleTransformer
|
|
278 | 309 | i < keyframesRules.length;
|
279 | 310 | keyframesRule = keyframesRules[++i]) {
|
280 | 311 | this._scopeKeyframes(keyframesRule, scopeSelector);
|
281 |
| - keyframeTransforms[keyframesRule.keyframesName] = function(rule, cssText) { |
282 |
| - return cssText.replace(rule.keyframesNameRx, rule.transformedKeyframesName); |
283 |
| - }.bind(this, keyframesRule); |
| 312 | + keyframeTransforms[keyframesRule.keyframesName] = |
| 313 | + this._keyframesRuleTransformer(keyframesRule); |
284 | 314 | }
|
285 | 315 | }
|
286 | 316 |
|
|
297 | 327 | });
|
298 | 328 | },
|
299 | 329 |
|
| 330 | + // Generate a factory for transforming a chunk of CSS text to handle a |
| 331 | + // particular scoped keyframes rule. |
| 332 | + _keyframesRuleTransformer: function(keyframesRule) { |
| 333 | + return function(cssText) { |
| 334 | + return cssText.replace( |
| 335 | + keyframesRule.keyframesNameRx, |
| 336 | + keyframesRule.transformedKeyframesName); |
| 337 | + }; |
| 338 | + }, |
| 339 | + |
300 | 340 | // Transforms `@keyframes` names to be unique for the current host.
|
301 | 341 | // Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0
|
302 | 342 | _scopeKeyframes: function(rule, scopeId) {
|
|
0 commit comments