Fixes non-shorthand overriding.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 12 Apr 2015 10:40:05 +0000 (11:40 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 12 Apr 2015 16:58:10 +0000 (17:58 +0100)
So far it's limited to colors, transforms, and all longhands.

lib/properties/override-compactor.js
test/properties/override-compacting-test.js

index 311a3b8..a7a682c 100644 (file)
@@ -144,6 +144,10 @@ function wouldResultInLongerValue(left, right) {
   return lengthBefore < lengthAfter;
 }
 
+function isCompactable(property) {
+  return property.name in compactable;
+}
+
 function compactOverrides(properties, compatibility, validator) {
   var mayOverride, right, left, component;
   var i, j, k;
@@ -151,11 +155,18 @@ function compactOverrides(properties, compatibility, validator) {
   propertyLoop:
   for (i = properties.length - 1; i >= 0; i--) {
     right = properties[i];
-    mayOverride = (compactable[right.name] && compactable[right.name].canOverride) || canOverride.sameValue;
+
+    if (!isCompactable(right))
+      continue;
+
+    mayOverride = compactable[right.name].canOverride || canOverride.sameValue;
 
     for (j = i - 1; j >= 0; j--) {
       left = properties[j];
 
+      if (!isCompactable(left))
+        continue;
+
       if (left.unused || right.unused)
         continue;
 
@@ -247,6 +258,19 @@ function compactOverrides(properties, compatibility, validator) {
         component = left.components.filter(nameMatchFilter(right))[0];
         override(component, right);
         right.dirty = true;
+      } else if (!left.shorthand && !right.shorthand && left.name == right.name) {
+        // two non-shorthands should be merged based on understandability
+
+        if (left.important && !right.important) {
+          right.unused = true;
+          continue;
+        }
+
+        mayOverride = compactable[right.name].canOverride || canOverride.sameValue;
+        if (!mayOverride(left, right, validator))
+          continue;
+
+        left.unused = true;
       }
     }
   }
index 6c9f8bb..78264c8 100644 (file)
@@ -288,6 +288,50 @@ vows.describe(optimize)
       }
     }
   })
+  .addBatch({
+    'colors with same understandability': {
+      'topic': 'a{color:red;color:#fff;color:blue}',
+      'into': function (topic) {
+        assert.deepEqual(_optimize(topic), [
+          [['color', false , false], ['blue']]
+        ]);
+      }
+    },
+    'colors with different understandability': {
+      'topic': 'a{color:red;color:#fff;color:blue;color:rgba(1,2,3,.4)}',
+      'into': function (topic) {
+        assert.deepEqual(_optimize(topic), [
+          [['color', false , false], ['blue']],
+          [['color', false , false], ['rgba(1,2,3,.4)']]
+        ]);
+      }
+    },
+    'colors with different understandability overridden by high understandability': {
+      'topic': 'a{color:red;color:#fff;color:blue;color:rgba(1,2,3,.4);color:red}',
+      'into': function (topic) {
+        assert.deepEqual(_optimize(topic), [
+          [['color', false , false], ['red']]
+        ]);
+      }
+    },
+    'colors with different understandability and importance #1': {
+      'topic': 'a{color:#fff!important;color:rgba(1,2,3,.4)}',
+      'into': function (topic) {
+        assert.deepEqual(_optimize(topic), [
+          [['color', true , false], ['#fff']]
+        ]);
+      }
+    },
+    'colors with different understandability and importance #2': {
+      'topic': 'a{color:#fff;color:rgba(1,2,3,.4)!important}',
+      'into': function (topic) {
+        assert.deepEqual(_optimize(topic), [
+          [['color', false , false], ['#fff']],
+          [['color', true , false], ['rgba(1,2,3,.4)']]
+        ]);
+      }
+    }
+  })
   .addBatch({
     'shorthand then longhand multiplex': {
       'topic': 'p{background:top left;background-repeat:no-repeat,no-repeat}',