Browse Source

Fix bugs

Fix script query while not exists
Fix request
Fix transactions in asychronous operations
Fix animation transitions
Gerald 10 years ago
parent
commit
9a27e5567e
6 changed files with 112 additions and 102 deletions
  1. 26 21
      src/background/db.js
  2. 1 0
      src/background/main.js
  3. 66 66
      src/background/requests.js
  4. 16 0
      src/options/app.js
  5. 0 12
      src/options/model.js
  6. 3 3
      src/options/view.js

+ 26 - 21
src/background/db.js

@@ -63,16 +63,19 @@ VMDB.prototype.getScript = function (id, tx) {
 
 VMDB.prototype.queryScript = function (id, meta, tx) {
   var _this = this;
-  return id ? _this.getScript(id, tx)
-  : new Promise(function (resolve, reject) {
-    var uri = scriptUtils.getNameURI({meta: meta});
-    if (uri !== '::')
-      (tx || _this.db.transaction('scripts')).objectStore('scripts')
-      .index('uri').get(uri).onsuccess = function (e) {
-        resolve(e.target.result);
-      };
-    else
-      resolve(scriptUtils.newScript());
+  return (
+    id ? _this.getScript(id, tx)
+    : new Promise(function (resolve, reject) {
+      var uri = scriptUtils.getNameURI({meta: meta});
+      if (uri !== '::')
+        (tx || _this.db.transaction('scripts')).objectStore('scripts')
+        .index('uri').get(uri).onsuccess = function (e) {
+          resolve(e.target.result);
+        };
+      else resolve();
+    })
+  ).then(function (script) {
+    return script || scriptUtils.newScript();
   });
 };
 
@@ -297,16 +300,18 @@ VMDB.prototype.saveScript = function (script, tx) {
 
 VMDB.prototype.fetchCache = function () {
   var requests = {};
-  return function (url, tx, check) {
+  return function (url, check) {
     var _this = this;
     return requests[url]
     || (requests[url] = scriptUtils.fetch(url, 'blob').then(function (res) {
-      return check ? check(res.response) : res.response;
+      return (check ? check(res.response) : Promise.resolve()).then(function () {
+        return res.response;
+      });
     }).then(function (data) {
       return new Promise(function (resolve, reject) {
         var reader = new FileReader;
         reader.onload = function (e) {
-          _this.saveCache(url, window.btoa(this.result), tx).then(function () {
+          _this.saveCache(url, window.btoa(this.result)).then(function () {
             delete requests[url];
             resolve();
           });
@@ -322,11 +327,11 @@ VMDB.prototype.fetchCache = function () {
 
 VMDB.prototype.fetchRequire = function () {
   var requests = {};
-  return function (url, tx) {
+  return function (url) {
     var _this = this;
     return requests[url]
     || (requests[url] = scriptUtils.fetch(url).then(function (res) {
-      return _this.saveRequire(url, res.responseText, tx);
+      return _this.saveRequire(url, res.responseText);
     }).then(function () {
       delete requests[url];
     }));
@@ -474,10 +479,10 @@ VMDB.prototype.vacuum = function () {
   }).then(function (data) {
     return Promise.all([
       Object.keys(data.require).map(function (k) {
-        return data.require[k] === 1 && _this.fetchRequire(k, tx);
+        return data.require[k] === 1 && _this.fetchRequire(k);
       }),
       Object.keys(data.cache).map(function (k) {
-        return data.cache[k] === 1 && _this.fetchCache(k, tx);
+        return data.cache[k] === 1 && _this.fetchCache(k);
       }),
     ]);
   });
@@ -511,17 +516,17 @@ VMDB.prototype.parseScript = function (data) {
   // @require
   meta.require.forEach(function (url) {
     var cache = data.require && data.require[url];
-    cache ? _this.saveRequire(url, cache, tx) : _this.fetchRequire(url, tx);
+    cache ? _this.saveRequire(url, cache, tx) : _this.fetchRequire(url);
   });
   // @resource
   Object.keys(meta.resources).forEach(function (k) {
     var url = meta.resources[k];
     var cache = data.resources && data.resources[url];
-    cache ? _this.saveCache(url, cache, tx) : _this.fetchCache(url, tx);
+    cache ? _this.saveCache(url, cache, tx) : _this.fetchCache(url);
   });
   // @icon
   if (scriptUtils.isRemote(meta.icon))
-    _this.fetchCache(meta.icon, tx, function (blob) {
+    _this.fetchCache(meta.icon, function (blob) {
       return new Promise(function (resolve, reject) {
         var url = URL.createObjectURL(blob);
         var image = new Image;
@@ -530,7 +535,7 @@ VMDB.prototype.parseScript = function (data) {
         };
         image.onload = function () {
           free();
-          resolve();
+          resolve(blob);
         };
         image.onerror = function () {
           free();

+ 1 - 0
src/background/main.js

@@ -60,6 +60,7 @@ var commands = {
           isClickable: true,
         });
       _.messenger.post(res);
+      return res.data;
     });
   },
   CheckUpdate: function (id, src) {

+ 66 - 66
src/background/requests.js

@@ -108,75 +108,75 @@ var requests = function () {
     clearRequest(req);
   }
 
+  // Watch URL redirects
+  chrome.webRequest.onBeforeRedirect.addListener(function (details) {
+    var reqId = verify[details.requestId];
+    if (reqId) {
+      var req = requests[reqId];
+      if (req) req.finalUrl = details.redirectUrl;
+    }
+  }, {
+    urls: ['<all_urls>'],
+    types: ['xmlhttprequest'],
+  });
+
+  // Modifications on headers
+  chrome.webRequest.onBeforeSendHeaders.addListener(function (details) {
+    var headers = details.requestHeaders;
+    var new_headers = [];
+    var vm_headers = {};
+    headers.forEach(function (header) {
+      if (header.name.substr(0, 3) == 'VM-')
+        vm_headers[header.name.slice(3)] = header.value;
+      else
+        new_headers.push(header);
+    });
+    var reqId = vm_headers['Verify'];
+    if (reqId) {
+      var req = requests[reqId];
+      if (req) {
+        delete vm_headers['Verify'];
+        verify[details.requestId] = reqId;
+        req.coreId = details.requestId;
+        for (var i in vm_headers)
+          if (~special_headers.indexOf(i.toLowerCase()))
+            new_headers.push({name: i, value: vm_headers[i]});
+      }
+    }
+    return {requestHeaders: new_headers};
+  }, {
+    urls: ['<all_urls>'],
+    types: ['xmlhttprequest'],
+  }, ['blocking', 'requestHeaders']);
+
+  chrome.webRequest.onBeforeRequest.addListener(function (req) {
+    // onBeforeRequest is fired for local files too
+    if (/\.user\.js([\?#]|$)/.test(req.url)) {
+      var x = new XMLHttpRequest();
+      x.open('GET', req.url, false);
+      x.send();
+      if ((!x.status || x.status == 200) && !/^\s*</.test(x.responseText)) {
+        if (req.tabId < 0)
+          chrome.tabs.create({
+            url: chrome.extension.getURL('/options/index.html') + '#confirm/' + encodeURIComponent(req.url),
+          });
+        else
+          chrome.tabs.get(req.tabId, function (t) {
+            chrome.tabs.create({
+              url: chrome.extension.getURL('/options/index.html') + '#confirm/' + encodeURIComponent(req.url) + '/' + encodeURIComponent(t.url),
+            });
+          });
+        return {redirectUrl: 'javascript:history.back()'};
+      }
+    }
+  }, {
+    urls: ['<all_urls>'],
+    types: ['main_frame'],
+  }, ['blocking']);
+
   return {
     getRequestId: getRequestId,
     abortRequest: abortRequest,
     httpRequest: httpRequest,
   };
 }();
-
-// Watch URL redirects
-chrome.webRequest.onBeforeRedirect.addListener(function (details) {
-	var reqId = verify[details.requestId];
-	if (reqId) {
-		var req = requests[reqId];
-		if (req) req.finalUrl = details.redirectUrl;
-	}
-}, {
-	urls: ['<all_urls>'],
-	types: ['xmlhttprequest'],
-});
-
-// Modifications on headers
-chrome.webRequest.onBeforeSendHeaders.addListener(function (details) {
-	var headers = details.requestHeaders;
-	var new_headers = [];
-	var vm_headers = {};
-	headers.forEach(function (header) {
-		if (header.name.substr(0, 3) == 'VM-')
-			vm_headers[header.name.slice(3)] = header.value;
-		else
-			new_headers.push(header);
-	});
-	var reqId = vm_headers['Verify'];
-	if (reqId) {
-		var req = requests[reqId];
-		if (req) {
-			delete vm_headers['Verify'];
-			verify[details.requestId] = reqId;
-			req.coreId = details.requestId;
-			for (var i in vm_headers)
-				if (~special_headers.indexOf(i.toLowerCase()))
-					new_headers.push({name: i, value: vm_headers[i]});
-		}
-	}
-	return {requestHeaders: new_headers};
-}, {
-	urls: ['<all_urls>'],
-	types: ['xmlhttprequest'],
-}, ['blocking', 'requestHeaders']);
-
-chrome.webRequest.onBeforeRequest.addListener(function (req) {
-	// onBeforeRequest is fired for local files too
-	if (/\.user\.js([\?#]|$)/.test(req.url)) {
-		var x = new XMLHttpRequest();
-		x.open('GET', req.url, false);
-		x.send();
-		if ((!x.status || x.status == 200) && !/^\s*</.test(x.responseText)) {
-			if (req.tabId < 0)
-				chrome.tabs.create({
-					url: chrome.extension.getURL('/options/index.html') + '#confirm/' + encodeURIComponent(req.url),
-				});
-			else
-				chrome.tabs.get(req.tabId, function (t) {
-					chrome.tabs.create({
-						url: chrome.extension.getURL('/options/index.html') + '#confirm/' + encodeURIComponent(req.url) + '/' + encodeURIComponent(t.url),
-					});
-				});
-			return {redirectUrl: 'javascript:history.back()'};
-		}
-	}
-}, {
-	urls: ['<all_urls>'],
-	types: ['main_frame'],
-}, ['blocking']);

+ 16 - 0
src/options/app.js

@@ -8,6 +8,7 @@ var App = Backbone.Router.extend({
     'confirm/:url/:from': 'renderConfirm',
   },
   renderMain: function (tab) {
+    scriptList || initMain();
     this.view = new MainView(tab);
   },
   renderConfirm: function (url, _from) {
@@ -22,3 +23,18 @@ if (!Backbone.history.start())
   app.navigate('', {trigger: true, replace: true});
 
 BaseView.prototype.initI18n.call(window);
+
+var scriptList;
+function initMain() {
+  scriptList = new ScriptList();
+  var port = chrome.runtime.connect({name: 'Options'});
+  port.onMessage.addListener(function (res) {
+    if (res.cmd === 'add') {
+      res.data.message = '';
+      scriptList.push(res.data);
+    } else if (res.data) {
+      var model = scriptList.get(res.data.id);
+      if (model) model.set(res.data);
+    }
+  });
+}

+ 0 - 12
src/options/model.js

@@ -40,15 +40,3 @@ var ScriptList = Backbone.Collection.extend({
     });
   },
 });
-
-var scriptList = new ScriptList();
-
-var port = chrome.runtime.connect({name: 'Options'});
-port.onMessage.addListener(function (res) {
-  if (res.cmd === 'add')
-    scriptList.push(res.data);
-  else if (res.data) {
-    var model = scriptList.get(res.data.id);
-    if (model) model.set(res.data);
-  }
-});

+ 3 - 3
src/options/view.js

@@ -212,15 +212,15 @@ DND.prototype.animate = function ($elements, delta) {
     $el.addClass('dragging-moving').css({
       transition: 'none',
       transform: 'translateY(' + delta + 'px)',
+    }).one('transitionend', function (e) {
+      $(e.target).removeClass('dragging-moving');
     });
     setTimeout(function () {
       $el.css({
         transition: '',
         transform: '',
-      }).one('transitionend', function (e) {
-        $(e.target).removeClass('dragging-moving');
       });
-    })
+    }, 20);
   });
 };
 DND.prototype.mouseup = function (e) {