From b439240502f1ef549b6c113c404e037d2cd5fdaa Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Sun, 22 Feb 2015 09:19:15 +0000 Subject: [PATCH] Disables restructuring inside @keyframes. It's forbidden by the spec, see "Duplicate resolution" on https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes --- lib/selectors/optimizers/advanced.js | 16 ++++++++++------ test/selectors/optimizer-test.js | 8 ++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/selectors/optimizers/advanced.js b/lib/selectors/optimizers/advanced.js index b6d2cf7f..4974284d 100644 --- a/lib/selectors/optimizers/advanced.js +++ b/lib/selectors/optimizers/advanced.js @@ -609,10 +609,12 @@ function optimizeProperties(tokens, propertyOptimizer) { AdvancedOptimizer.prototype.optimize = function (tokens) { var self = this; - function _optimize(tokens) { + function _optimize(tokens, withRestructuring) { tokens.forEach(function (token) { - if (token.kind == 'block') - _optimize(token.body); + if (token.kind == 'block') { + var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test(token.value); + _optimize(token.body, !isKeyframes); + } }); optimizeProperties(tokens, self.propertyOptimizer); @@ -627,8 +629,10 @@ AdvancedOptimizer.prototype.optimize = function (tokens) { self.mergeNonAdjacentBySelector(tokens); self.mergeNonAdjacentByBody(tokens); - self.restructure(tokens); - self.mergeAdjacent(tokens); + if (withRestructuring) { + self.restructure(tokens); + self.mergeAdjacent(tokens); + } if (self.options.mediaMerging) { var reduced = self.mergeMediaQueries(tokens); @@ -638,7 +642,7 @@ AdvancedOptimizer.prototype.optimize = function (tokens) { } } - _optimize(tokens); + _optimize(tokens, true); }; module.exports = AdvancedOptimizer; diff --git a/test/selectors/optimizer-test.js b/test/selectors/optimizer-test.js index f84cb1b7..403a597a 100644 --- a/test/selectors/optimizer-test.js +++ b/test/selectors/optimizer-test.js @@ -150,6 +150,14 @@ vows.describe(SelectorsOptimizer) 'multiple granular - complex case': [ '.one{background:red;padding:8px 16px}.two{padding-left:16px;padding-right:16px}.three{padding-top:20px}.four{border-left:1px solid #000;border-right:1px solid #000;border-bottom:1px solid #000}.five{background-color:#fff;background-image:-moz-linear-gradient();background-image:-ms-linear-gradient();background-image:-webkit-gradient();background-image:-webkit-linear-gradient()}', '.one{background:red;padding:8px 16px}.two{padding-left:16px;padding-right:16px}.three{padding-top:20px}.four{border-left:1px solid #000;border-right:1px solid #000;border-bottom:1px solid #000}.five{background-color:#fff;background-image:-moz-linear-gradient();background-image:-ms-linear-gradient();background-image:-webkit-gradient();background-image:-webkit-linear-gradient()}' + ], + 'not in keyframes': [ + '@keyframes test{0%{transform:scale3d(1,1,1);opacity:1}100%{transform:scale3d(.5,.5,.5);opacity:1}}', + '@keyframes test{0%{transform:scale3d(1,1,1);opacity:1}100%{transform:scale3d(.5,.5,.5);opacity:1}}' + ], + 'not in vendored keyframes': [ + '@-moz-keyframes test{0%{transform:scale3d(1,1,1);opacity:1}100%{transform:scale3d(.5,.5,.5);opacity:1}}', + '@-moz-keyframes test{0%{transform:scale3d(1,1,1);opacity:1}100%{transform:scale3d(.5,.5,.5);opacity:1}}' ] }, { advanced: true }) ) -- 2.34.1