Browse Source

Add data sync between tabs, fix #40

Gerald 10 years ago
parent
commit
d99afecca9
3 changed files with 59 additions and 27 deletions
  1. 10 1
      src/background/main.js
  2. 11 3
      src/background/utils.js
  3. 38 23
      src/injected.js

+ 10 - 1
src/background/main.js

@@ -32,7 +32,16 @@ var commands = {
     });
   },
   SetValue: function (data, src) {
-    return vmdb.setValue(data.uri, data.values);
+    return vmdb.setValue(data.uri, data.values)
+    .then(function () {
+      _.broadcast({
+        cmd: 'UpdateValues',
+        data: {
+          uri: data.uri,
+          values: data.values,
+        },
+      });
+    });
   },
   ExportZip: function (data, src) {
     return vmdb.getExportData(data.ids, data.values);

+ 11 - 3
src/background/utils.js

@@ -167,19 +167,27 @@ var tester = function () {
   };
 }();
 
-_.forEach = _.forEach || function (arr, cb) {
+_.broadcast = function (data) {
+  chrome.tabs.query({}, function (tabs) {
+    _.forEach(tabs, function (tab) {
+      chrome.tabs.sendMessage(tab.id, data);
+    });
+  });
+};
+
+_.forEach = function (arr, cb) {
   var length = arr.length;
   for (var i = 0; i < length; i ++) cb(arr[i], i, arr);
   return arr;
 };
-_.slice = _.slice || function () {
+_.slice = function () {
   var empty = [];
   var slice = empty.slice;
   return function () {
     return slice.apply(arguments[0] || empty, slice.call(arguments, 1));
   };
 }();
-_.assign = _.assign || Object.assign || function () {
+_.assign = Object.assign || function () {
   var res = arguments[0];
   res && _.forEach(_.slice(arguments, 1), function (obj) {
     if (obj) for (var k in obj) res[k] = obj[k];

+ 38 - 23
src/injected.js

@@ -201,6 +201,9 @@ var comm = {
         var req = comm.requests[r.id];
         if (req) req.callback(r);
       },
+      UpdateValues: function (data) {
+        if (comm.values) comm.values[data.uri] = data.values;
+      },
       // advanced inject
       Injected: function (id) {
         var obj = comm.ainject[id];
@@ -304,22 +307,13 @@ var comm = {
     };
   },
   getWrapper: getWrapper,
-  wrapGM: function(script, value, cache) {
-    // Add GM functions
-    // Reference: http://wiki.greasespot.net/Greasemonkey_Manual:API
-    var comm = this;
-    var gm = {};
-    var grant = script.meta.grant || [];
-    var urls = {};
-    if (!grant.length || grant.length == 1 && grant[0] == 'none') {
-      // @grant none
-      grant.pop();
-    } else {
-      gm['window'] = comm.getWrapper();
+  wrapGM: function(script, cache) {
+    function getValues() {
+      var uri = script.uri;
+      var values = comm.values[uri];
+      if (!values) comm.values[uri] = values = {};
+      return values;
     }
-    value = value || {};
-    if(!comm.includes(grant, 'unsafeWindow')) grant.push('unsafeWindow');
-    if(!comm.includes(grant, 'GM_info')) grant.push('GM_info');
     function propertyToString() {
       return '[Violentmonkey property]';
     }
@@ -335,10 +329,24 @@ var comm = {
         cmd: 'SetValue',
         data: {
           uri: script.uri,
-          values: value,
+          values: getValues(),
         },
       });
     }
+    // Add GM functions
+    // Reference: http://wiki.greasespot.net/Greasemonkey_Manual:API
+    var comm = this;
+    var gm = {};
+    var grant = script.meta.grant || [];
+    var urls = {};
+    if (!grant.length || grant.length == 1 && grant[0] == 'none') {
+      // @grant none
+      grant.pop();
+    } else {
+      gm['window'] = comm.getWrapper();
+    }
+    if(!comm.includes(grant, 'unsafeWindow')) grant.push('unsafeWindow');
+    if(!comm.includes(grant, 'GM_info')) grant.push('GM_info');
     var resources = script.meta.resources || {};
     var gm_funcs = {
       unsafeWindow: {value: window},
@@ -380,13 +388,15 @@ var comm = {
       },
       GM_deleteValue: {
         value: function (key) {
-          delete value[key];
+          var values = getValues();
+          delete values[key];
           saveValues();
         },
       },
       GM_getValue: {
         value: function(key, val) {
-          var v = value[key];
+          var values = getValues();
+          var v = values[key];
           if (v) {
             var type = v[0];
             v = v.slice(1);
@@ -413,7 +423,7 @@ var comm = {
       },
       GM_listValues: {
         value: function () {
-          return Object.getOwnPropertyNames(value);
+          return Object.getOwnPropertyNames(getValues());
         },
       },
       GM_setValue: {
@@ -426,7 +436,8 @@ var comm = {
             default:
               val = type + val;
           }
-          value[key] = val;
+          var values = getValues();
+          values[key] = val;
           saveValues();
         },
       },
@@ -499,7 +510,7 @@ var comm = {
   loadScript: function (data) {
     function buildCode(script) {
       var require = script.meta.require || [];
-      var wrapper = comm.wrapGM(script, data.values[script.uri], data.cache);
+      var wrapper = comm.wrapGM(script, data.cache);
       var code = [];
       var part;
       comm.forEach(Object.getOwnPropertyNames(wrapper), function(name) {
@@ -542,6 +553,7 @@ var comm = {
     comm.command = {};
     comm.ainject = {};
     comm.version = data.version;
+    comm.values = data.values;
     // reset load and checkLoad
     comm.load = function() {
       run(end);
@@ -617,14 +629,17 @@ function handleC(e) {
 }
 
 // Messages
-chrome.runtime.onMessage.addListener(function(req, src) {
+chrome.runtime.onMessage.addListener(function (req, src) {
   var maps = {
-    Command: function(data) {
+    Command: function (data) {
       comm.post({cmd: 'Command', data: data});
     },
     GetPopup: getPopup,
     GetBadge: getBadge,
     HttpRequested: httpRequested,
+    UpdateValues: function (data) {
+      comm.post({cmd: 'UpdateValues', data: data});
+    },
   };
   var func = maps[req.cmd];
   if (func) func(req.data, src);