Fixes an edge case in merging non-adjacent selectors by name.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 8 Feb 2015 11:00:40 +0000 (11:00 +0000)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Tue, 10 Feb 2015 20:43:29 +0000 (20:43 +0000)
lib/selectors/optimizers/advanced.js
test/integration-test.js

index f405e93..ed74b7e 100644 (file)
@@ -84,8 +84,10 @@ AdvancedOptimizer.prototype.mergeAdjacent = function (tokens) {
   for (var i = 0, l = tokens.length; i < l; i++) {
     var token = tokens[i];
 
-    if (token.kind != 'selector')
+    if (token.kind != 'selector') {
+      lastToken = { selector: null, body: null };
       continue;
+    }
 
     if (lastToken.kind == 'selector' && token.metadata.selector == lastToken.metadata.selector) {
       var joinAt = [lastToken.body.length];
@@ -308,7 +310,7 @@ AdvancedOptimizer.prototype.mergeNonAdjacentBySelector = function (tokens) {
       var movedProperties = extractProperties(movedToken);
 
       for (var k = movedPosition - 1; k > targetPosition; k--) {
-        if (tokens[k].kind == 'selector' && unsafeTraversal(tokens[k], movedProperties))
+        if (tokens[k].isFlatBlock === false || tokens[k].kind == 'selector' && unsafeTraversal(tokens[k], movedProperties))
           continue selectorIterator;
       }
 
index d2eacb3..2b0e449 100644 (file)
@@ -1734,7 +1734,15 @@ title']{display:block}",
       '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}'
+    'when overriden with a browser specific selector': 'a{color:red}::-webkit-scrollbar,a{color:#fff}',
+    'two same selectors over a block': [
+      '.one{color:red}@media print{.two{display:block}}.one{display:none}',
+      '.one{color:red}@media print{.two{display:block}}.one{display:none}'
+    ],
+    'two same bodies over a block': [
+      '.one{color:red}@media print{.two{display:block}}.three{color:red}',
+      '.one{color:red}@media print{.two{display:block}}.three{color:red}'
+    ]
   }),
   'same non-adjacent selectors': cssContext({
     'with different properties': 'a{color:red;display:block}.one{margin:5px}a{margin:2px}',