Browse Source

Update events

Gerald 10 years ago
parent
commit
6b2a2977e0
3 changed files with 126 additions and 177 deletions
  1. 71 74
      src/background/db.js
  2. 54 102
      src/background/main.js
  3. 1 1
      src/options/view.js

+ 71 - 74
src/background/db.js

@@ -69,14 +69,14 @@ VMDB.prototype.queryScript = function (id, meta) {
         resolve(e.target.result);
       };
     else
-      resolve(newScript());
+      resolve(scriptUtils.newScript());
   });
 };
 
 VMDB.prototype.getScriptData = function (id) {
   return this.getScript(id).then(function (script) {
     if (!script) return Promise.reject();
-    var data = getMeta(script);
+    var data = scriptUtils.getMeta(script);
     data.code = script.code;
     return data;
   });
@@ -88,7 +88,7 @@ VMDB.prototype.getScriptInfos = function (ids) {
   return Promise.all(ids.map(function (id) {
     return _this.getScript(id, os);
   })).then(function (scripts) {
-    return scripts.filter(function (x) {return x;}).map(getMeta);
+    return scripts.filter(function (x) {return x;}).map(scriptUtils.getMeta);
   });
 };
 
@@ -185,7 +185,7 @@ VMDB.prototype.getData = function () {
         if (result) {
           var value = result.value;
           if (isRemote(value.meta.icon)) cache[value.meta.icon] = 1;
-          data.scripts.push(getMeta(value));
+          data.scripts.push(scriptUtils.getMeta(value));
           result.continue();
         } else {
           data.cache = Object.getOwnPropertyNames(cache);
@@ -372,7 +372,7 @@ VMDB.prototype.updateScriptInfo = function (id, data) {
       for (var k in data)
         if (k in script) script[k] = data[k];
       o.put(script).onsuccess = function (e) {
-        resolve(getMeta(script));
+        resolve(scriptUtils.getMeta(script));
       };
     };
   });
@@ -419,75 +419,72 @@ VMDB.prototype.getExportData = function (ids, withValues) {
   });
 };
 
-// Common functions
-
-function parseMeta(code) {
-	// initialize meta, specify those with multiple values allowed
-	var meta = {
-		include: [],
-		exclude: [],
-		match: [],
-		require: [],
-		resource: [],
-		grant: [],
-	};
-	var flag = -1;
-	code.replace(/(?:^|\n)\/\/\s*([@=]\S+)(.*)/g, function(value, group1, group2) {
-		if (flag < 0 && group1 == '==UserScript==')
-			// start meta
-			flag = 1;
-		else if(flag > 0 && group1 == '==/UserScript==')
-			// end meta
-			flag = 0;
-		if (flag == 1 && group1[0] == '@') {
-			var key = group1.slice(1);
-			var val = group2.replace(/^\s+|\s+$/g, '');
-			var value = meta[key];
-      // multiple values allowed
-			if (value && value.push) value.push(val);
-      // only first value will be stored
-			else if (!(key in meta)) meta[key] = val;
-		}
-	});
-	meta.resources = {};
-	meta.resource.forEach(function(line) {
-		var pair = line.match(/^(\w\S*)\s+(.*)/);
-		if (pair) meta.resources[pair[1]] = pair[2];
-	});
-	delete meta.resource;
-	// @homepageURL: compatible with @homepage
-	if (!meta.homepageURL && meta.homepage) meta.homepageURL = meta.homepage;
-	return meta;
-}
-
-function newScript() {
-	var script = {
-		custom: {},
-		enabled: 1,
-		update: 1,
-		code: '// ==UserScript==\n// @name New Script\n// ==/UserScript==\n',
-	};
-	script.meta = parseMeta(script.code);
-	return script;
-}
-
-function getMeta(script) {
-	return {
-		id: script.id,
-		custom: script.custom,
-		meta: script.meta,
-		enabled: script.enabled,
-		update: script.update,
-	};
-}
-
-function getNameURI(script) {
-	var ns = script.meta.namespace || '';
-	var name = script.meta.name || '';
-	var nameURI = escape(ns) + ':' + escape(name) + ':';
-	if (!ns && !name) nameURI += script.id || '';
-	return nameURI;
-}
+var scriptUtils = {
+  parseMeta: function (code) {
+  	// initialize meta, specify those with multiple values allowed
+  	var meta = {
+  		include: [],
+  		exclude: [],
+  		match: [],
+  		require: [],
+  		resource: [],
+  		grant: [],
+  	};
+  	var flag = -1;
+  	code.replace(/(?:^|\n)\/\/\s*([@=]\S+)(.*)/g, function(value, group1, group2) {
+  		if (flag < 0 && group1 == '==UserScript==')
+  			// start meta
+  			flag = 1;
+  		else if(flag > 0 && group1 == '==/UserScript==')
+  			// end meta
+  			flag = 0;
+  		if (flag == 1 && group1[0] == '@') {
+  			var key = group1.slice(1);
+  			var val = group2.replace(/^\s+|\s+$/g, '');
+  			var value = meta[key];
+        // multiple values allowed
+  			if (value && value.push) value.push(val);
+        // only first value will be stored
+  			else if (!(key in meta)) meta[key] = val;
+  		}
+  	});
+  	meta.resources = {};
+  	meta.resource.forEach(function(line) {
+  		var pair = line.match(/^(\w\S*)\s+(.*)/);
+  		if (pair) meta.resources[pair[1]] = pair[2];
+  	});
+  	delete meta.resource;
+  	// @homepageURL: compatible with @homepage
+  	if (!meta.homepageURL && meta.homepage) meta.homepageURL = meta.homepage;
+  	return meta;
+  },
+  newScript: function () {
+    var script = {
+  		custom: {},
+  		enabled: 1,
+  		update: 1,
+  		code: '// ==UserScript==\n// @name New Script\n// ==/UserScript==\n',
+  	};
+  	script.meta = scriptUtils.parseMeta(script.code);
+  	return script;
+  },
+  getMeta: function (script) {
+    return {
+  		id: script.id,
+  		custom: script.custom,
+  		meta: script.meta,
+  		enabled: script.enabled,
+  		update: script.update,
+  	};
+  },
+  getNameURI: function (script) {
+  	var ns = script.meta.namespace || '';
+  	var name = script.meta.name || '';
+  	var nameURI = escape(ns) + ':' + escape(name) + ':';
+  	if (!ns && !name) nameURI += script.id || '';
+  	return nameURI;
+  },
+};
 
 var tester = function () {
   function testURL(url, script) {

+ 54 - 102
src/background/main.js

@@ -1,40 +1,68 @@
 var vmdb = new VMDB;
 var port = null;
 var vm_ver = chrome.app.getDetails().version;
+var commands = {
+  NewScript: function (data, src) {
+    return Promise.resolve(scriptUtils.newScript());
+  },
+  RemoveScript: function (id, src) {
+    return vmdb.removeScript(id);
+  },
+  GetData: function (data, src) {
+    return vmdb.getData();
+  },
+  GetInjected: function (url, src) {
+    var data = {
+      isApplied: _.options.get('isApplied'),
+      injectMode: _.options.get('injectMode'),
+      version: vm_ver,
+    };
+    if(src.url == src.tab.url)
+      chrome.tabs.sendMessage(src.tab.id, {cmd: 'GetBadge'});
+    return data.isApplied
+    ? vmdb.getScriptsByURL(url).then(function (res) {
+      return Object.assign(data, res);
+    } : Promise.resolve(data);
+  },
+  UpdateMeta: function (data, src) {
+    return vmdb.updateScriptInfo(data.id, data);
+  },
+  SetValue: function (data, src) {
+    return vmdb.setValue(data.uri, data.values);
+  },
+  ExportZip: function (data, src) {
+    return vmdb.getExportData(data.ids, data.values);
+  },
+  GetScript: function (id, src) {
+    return vmdb.getScriptData(id);
+  },
+  GetMetas: function (ids, src) {
+    return vmdb.getScriptInfos(ids);
+  },
+  Move: function (data, src) {
+    return vmdb.moveScript(data.id, data.offset);
+  },
+  CheckUpdate: checkUpdate,
+  CheckUpdateAll: checkUpdateAll,
+  ParseScript: parseScript,
+  SetBadge: setBadge,
+  AutoUpdate: autoUpdate,
+  Vacuum: vacuum,
+  ParseMeta: function(o, src, callback) {callback(parseMeta(o));},
+  GetRequestId: getRequestId,
+  HttpRequest: httpRequest,
+  AbortRequest: abortRequest,
+};
 
 vmdb.initialized.then(function () {
-  var commands = {
-    NewScript: function (data, src) {
-      return Promise.resolve(newScript());
-    },
-    RemoveScript: removeScript,
-    GetData: getData,
-    GetInjected: getInjected,
-    CheckUpdate: checkUpdate,
-    CheckUpdateAll: checkUpdateAll,
-    UpdateMeta: updateMeta,
-    SetValue: setValue,
-    ExportZip: exportZip,
-    ParseScript: parseScript,
-    GetScript: getScript,
-    GetMetas: getMetas,
-    SetBadge: setBadge,
-    AutoUpdate: autoUpdate,
-    Vacuum: vacuum,
-    Move: move,
-    ParseMeta: function(o, src, callback) {callback(parseMeta(o));},
-    GetRequestId: getRequestId,
-    HttpRequest: httpRequest,
-    AbortRequest: abortRequest,
-  };
   chrome.runtime.onMessage.addListener(function (req, src, callback) {
     var func = commands[req.cmd];
     if (func) {
       var res = func(req.data, src);
       if (res === false) return;
-      var finish = function () {
+      var finish = function (data) {
         try {
-          callback.apply(null, arguments);
+          callback(data);
         } catch (e) {
           // callback fails if not given in content page
         }
@@ -163,82 +191,6 @@ function setBadge(num, src, callback) {
   callback();
 }
 
-function getInjected(url, src, callback) {
-  function getScripts(){
-    var o = db.transaction('scripts').objectStore('scripts');
-    var require = {};
-    var cache = {};
-    var values = [];
-    o.index('position').openCursor().onsuccess = function (e) {
-      var r = e.target.result;
-      if (r) {
-        var v = r.value;
-        if (testURL(url, v)) {
-          data.scripts.push(v);
-          values.push(v.uri);
-          v.meta.require.forEach(function(i){require[i] = 1;});
-          for(var i in v.meta.resources) cache[v.meta.resources[i]] = 1;
-        }
-        r.continue();
-      } else {
-        count = 3;
-        getRequire(Object.getOwnPropertyNames(require));
-        getCacheB64(Object.getOwnPropertyNames(cache), function (cache) {
-          data.cache = cache;
-          finish();
-        });
-        getValues(values);
-      }
-    };
-  }
-  function getRequire(require) {
-    function loop() {
-      var uri = require.pop();
-      if(uri)
-        o.get(uri).onsuccess = function(e) {
-          var r = e.target.result;
-          if (r) data.require[uri] = r.code;
-          loop();
-        };
-      else finish();
-    }
-    var o = db.transaction('require').objectStore('require');
-    loop();
-  }
-  function getValues(values) {
-    function loop(){
-      var uri = values.pop();
-      if (uri)
-        o.get(uri).onsuccess = function (e) {
-          var v = e.target.result;
-          if (v) data.values[uri] = v.values;
-          loop();
-        };
-      else finish();
-    }
-    var o = db.transaction('values').objectStore('values');
-    loop();
-  }
-  function finish(){
-    if (! -- count) {
-      callback(data);
-      if(src.url == src.tab.url)
-        chrome.tabs.sendMessage(src.tab.id, {cmd: 'GetBadge'});
-    }
-  }
-  var data = {
-    scripts: [],
-    values: {},
-    require: {},
-    injectMode: _.options.get('injectMode'),
-    version: vm_ver,
-  };
-  var count = 1;
-  if (data.isApplied = _.options.get('isApplied')) getScripts();
-  else finish();
-  return true;
-}
-
 function fetchURL(url, cb, type, headers) {
   var req = new XMLHttpRequest();
   req.open('GET', url, true);

+ 1 - 1
src/options/view.js

@@ -398,7 +398,7 @@ var SettingsTab = BaseView.extend({
       cmd: 'ExportZip',
       data: {
         values: withValues,
-        data: _.pluck(selected, 'id'),
+        ids: _.pluck(selected, 'id'),
       }
     }).then(function (data) {
       var names = {};