Fixes #248 - incorrect merging of vendor selectors.
authorJakub Pawlowicz <jakub@goalsmashers.com>
Wed, 26 Feb 2014 20:56:31 +0000 (20:56 +0000)
committerJakub Pawlowicz <jakub@goalsmashers.com>
Wed, 26 Feb 2014 21:18:02 +0000 (21:18 +0000)
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
lib/selectors/optimizer.js
test/unit-test.js

index c33e00b..3e82549 100644 (file)
@@ -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)
 ==================
 
index 09318fa..d430afc 100644 (file)
@@ -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++) {
index d48a723..473a303 100644 (file)
@@ -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({