avoid token overriding prototype members
authoralexlamsl <alexlamsl@gmail.com>
Sun, 19 Mar 2017 05:04:34 +0000 (13:04 +0800)
committeralexlamsl <alexlamsl@gmail.com>
Sun, 19 Mar 2017 05:05:44 +0000 (13:05 +0800)
fixes #794

src/tokenchain.js
tests/minifier.js

index 377e496..f8892d0 100644 (file)
@@ -5,8 +5,9 @@ function Sorter() {
 
 Sorter.prototype.sort = function(tokens, fromIndex) {
   fromIndex = fromIndex || 0;
-  for (var i = 0, len = this.tokens.length; i < len; i++) {
-    var token = this.tokens[i];
+  for (var i = 0, len = this.keys.length; i < len; i++) {
+    var key = this.keys[i];
+    var token = key.slice(1);
     var index = tokens.indexOf(token, fromIndex);
     if (index !== -1) {
       do {
@@ -16,7 +17,7 @@ Sorter.prototype.sort = function(tokens, fromIndex) {
         }
         fromIndex++;
       } while ((index = tokens.indexOf(token, fromIndex)) !== -1);
-      return this[token].sort(tokens, fromIndex);
+      return this[key].sort(tokens, fromIndex);
     }
   }
   return tokens;
@@ -29,34 +30,36 @@ TokenChain.prototype = {
   add: function(tokens) {
     var self = this;
     tokens.forEach(function(token) {
-      if (!self[token]) {
-        self[token] = [];
-        self[token].processed = 0;
+      var key = '$' + token;
+      if (!self[key]) {
+        self[key] = [];
+        self[key].processed = 0;
       }
-      self[token].push(tokens);
+      self[key].push(tokens);
     });
   },
   createSorter: function() {
     var self = this;
     var sorter = new Sorter();
-    sorter.tokens = Object.keys(this).sort(function(j, k) {
+    sorter.keys = Object.keys(self).sort(function(j, k) {
       var m = self[j].length;
       var n = self[k].length;
       return m < n ? 1 : m > n ? -1 : j < k ? -1 : j > k ? 1 : 0;
-    }).filter(function(token) {
-      if (self[token].processed < self[token].length) {
+    }).filter(function(key) {
+      if (self[key].processed < self[key].length) {
+        var token = key.slice(1);
         var chain = new TokenChain();
-        self[token].forEach(function(tokens) {
+        self[key].forEach(function(tokens) {
           var index;
           while ((index = tokens.indexOf(token)) !== -1) {
             tokens.splice(index, 1);
           }
           tokens.forEach(function(token) {
-            self[token].processed++;
+            self['$' + token].processed++;
           });
           chain.add(tokens.slice(0));
         });
-        sorter[token] = chain.createSorter();
+        sorter[key] = chain.createSorter();
         return true;
       }
       return false;
index c39e3d8..7739701 100644 (file)
@@ -3049,7 +3049,13 @@ QUnit.test('sort style classes', function(assert) {
   }), output);
 
   input = '<a class="0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"></a>';
+  assert.equal(minify(input, { sortClassName: false }), input);
   assert.equal(minify(input, { sortClassName: true }), input);
+
+  input = '<a class="add sort keys createSorter"></a>';
+  assert.equal(minify(input, { sortClassName: false }), input);
+  output = '<a class="add createSorter keys sort"></a>';
+  assert.equal(minify(input, { sortClassName: true }), output);
 });
 
 QUnit.test('decode entity characters', function(assert) {