From 83400c8d9d54eb87ded136fc87d33256e6474030 Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Wed, 26 Feb 2014 20:56:31 +0000 Subject: [PATCH] Fixes #248 - incorrect merging of vendor selectors. Vendor selectors can be merged or override other properties if redefine same selectors only, e.g. a{color:red}a,::-webkit-scrollbar{color:blue} once merged would not yield red links in all browsers but webkit based. --- History.md | 5 +++++ lib/selectors/optimizer.js | 11 ++++++----- test/unit-test.js | 8 +++++++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/History.md b/History.md index c33e00bf..3e82549f 100644 --- a/History.md +++ b/History.md @@ -4,6 +4,11 @@ * Adds a better non-adjacent optimizer compatible with the upcoming new property optimizer. * Fixed issue [#247](https://github.com/GoalSmashers/clean-css/issues/247) - removes deprecated `selectorsMergeMode` switch. +[2.1.3 / 2014-xx-xx (UNRELEASED)](https://github.com/GoalSmashers/clean-css/compare/v2.1.2...v2.1.3) +================== + +* Fixed issue [#248](https://github.com/GoalSmashers/clean-css/issues/248) - incorrect merging for vendor selectors. + [2.1.2 / 2014-02-25](https://github.com/GoalSmashers/clean-css/compare/v2.1.1...v2.1.2) ================== diff --git a/lib/selectors/optimizer.js b/lib/selectors/optimizer.js index 09318fa2..d430afc0 100644 --- a/lib/selectors/optimizer.js +++ b/lib/selectors/optimizer.js @@ -133,10 +133,9 @@ module.exports = function Optimizer(data, context, options) { continue; var complexSelector = token.selector; - var selectors = complexSelector.split(','); // simplification, as :not() can have commas too - - if (selectors.length > 1) - selectors.unshift(complexSelector); + var selectors = complexSelector.indexOf(',') > -1 && !isSpecial(complexSelector) ? + complexSelector.split(',').concat(complexSelector) : // simplification, as :not() can have commas too + [complexSelector]; for (var j = 0, m = selectors.length; j < m; j++) { var selector = selectors[j]; @@ -197,7 +196,9 @@ module.exports = function Optimizer(data, context, options) { var intoPosition = positions[complexSelector].pop().where; var intoToken = tokens[intoPosition]; - var selectors = complexSelector.split(','); + var selectors = isSpecial(complexSelector) ? + [complexSelector] : + complexSelector.split(','); var reducedBodies = []; for (var j = 0, m = selectors.length; j < m; j++) { diff --git a/test/unit-test.js b/test/unit-test.js index d48a7237..473a303f 100644 --- a/test/unit-test.js +++ b/test/unit-test.js @@ -1411,7 +1411,8 @@ title']{display:block}", 'in two passes': [ 'a{color:red}a{background:red}b{color:red}b{background:red}', 'a,b{color:red;background:red}' - ] + ], + 'when overriden with a browser specific selector': 'a{color:red}::-webkit-scrollbar,a{color:#fff}' }), 'same non-adjacent selectors': cssContext({ 'with different properties': 'a{color:red;display:block}.one{font-size:12px}a{margin:2px}', @@ -1461,6 +1462,11 @@ title']{display:block}", 'when undefined is used as a value with reduction': [ '.one{text-shadow:undefined}p{color:red}.one{font-size:12px;text-shadow:none}', 'p{color:red}.one{font-size:12px;text-shadow:none}' + ], + 'when overriden with a browser specific selector': 'a{color:red}p{display:block}::-moz-selection,a{color:#fff}', + 'when same browser specific selector more than once': [ + 'a,::-moz-selection{color:red}p{display:block}a,::-moz-selection{color:#fff}', + 'p{display:block}::-moz-selection,a{color:#fff}' ] }), 'rerun optimizers': cssContext({ -- 2.34.1