Gerald 9 лет назад
Родитель
Сommit
b1adbf35ea
3 измененных файлов с 60 добавлено и 22 удалено
  1. 1 0
      .gitignore
  2. 35 0
      src/common.js
  3. 24 22
      src/options/app.js

+ 1 - 0
.gitignore

@@ -3,3 +3,4 @@ node_modules/
 *.nex
 *.crx
 *.log
+*.lock

+ 35 - 0
src/common.js

@@ -1,3 +1,38 @@
+// Polyfill start
+
+function polyfill(obj, name, value) {
+  if (!obj[name]) Object.defineProperty(obj, name, {
+    value: value,
+  });
+}
+
+polyfill(Object, 'assign', function () {
+  var obj = arguments[0];
+  for (var i = 1; i < arguments.length; i ++) {
+    var arg = arguments[i];
+    arg && Object.keys(arg).forEach(function (key) {
+      obj[key] = arg[key];
+    });
+  }
+  return obj;
+});
+polyfill(String.prototype, 'startsWith', function (str) {
+  return this.slice(0, str.length) === str;
+});
+polyfill(Array.prototype, 'findIndex', function (predicate) {
+  var length = this.length;
+  for (var i = 0; i < length; i ++) {
+    var item = this[i];
+    if (predicate(item, i, this)) return i;
+  }
+  return -1;
+});
+polyfill(Array.prototype, 'find', function (predicate) {
+  return this[this.findIndex(predicate)];
+});
+
+// Polyfill end
+
 var _ = exports;
 _.i18n = chrome.i18n.getMessage;
 _.defaultImage = '/images/icon128.png';

+ 24 - 22
src/options/app.js

@@ -14,31 +14,33 @@ function initMain() {
     utils.features.reset('sync');
   });
   var port = chrome.runtime.connect({name: 'Options'});
-  port.onMessage.addListener(function (res) {
-    switch (res.cmd) {
-    case 'sync':
-      store.sync = res.data;
-      break;
-    case 'add':
-      res.data.message = '';
-      store.scripts.push(res.data);
-      break;
-    case 'update':
-      if (res.data) {
-        var script = store.scripts.find(function (script) {
-          return script.id === res.data.id;
-        });
-        script && Object.keys(script).forEach(function (key) {
-          Vue.set(script, key, res.data[key]);
-        });
-      }
-      break;
-    case 'del':
+  var handlers = {
+    sync: function (data) {
+      store.sync = data;
+    },
+    add: function (data) {
+      data.message = '';
+      store.scripts.push(data);
+    },
+    update: function (data) {
+      if (!data) return;
+      var script = store.scripts.find(function (script) {
+        return script.id === data.id;
+      });
+      script && Object.keys(data).forEach(function (key) {
+        Vue.set(script, key, data[key]);
+      });
+    },
+    del: function (data) {
       var i = store.scripts.findIndex(function (script) {
-        return script.id === res.data;
+        return script.id === data;
       });
       ~i && store.scripts.splice(i, 1);
-    }
+    },
+  };
+  port.onMessage.addListener(function (res) {
+    var handle = handlers[res.cmd];
+    handle && handle(res.data);
   });
 }
 function loadHash() {