Browse Source

fix: avoid double encoding

Gerald 6 years ago
parent
commit
a96ed9f64d

+ 9 - 10
src/background/sync/base.js

@@ -1,6 +1,5 @@
 import {
   debounce, normalizeKeys, request, noop,
-  encodeFilename, decodeFilename,
 } from '#/common';
 import {
   objectGet, objectSet, objectPick, objectPurify,
@@ -23,11 +22,10 @@ let syncConfig;
 
 export function getItemFilename({ name, uri }) {
   // When get or remove, current name should be prefered
+  if (name) return name;
   // otherwise uri derived name should be prefered
-  return name || getFilename(uri);
-}
-export function getFilename(uri) {
-  return `vm@2-${encodeFilename(uri)}`;
+  // uri is already encoded by `encodeFilename`
+  return `vm@2-${uri}`;
 }
 export function isScriptFile(name) {
   return /^vm(?:@\d+)?-/.test(name);
@@ -36,7 +34,8 @@ export function getURI(name) {
   const i = name.indexOf('-');
   const [, version] = name.slice(0, i).split('@');
   if (version === '2') {
-    return decodeFilename(name.slice(i + 1));
+    // uri is encoded by `encodedFilename`, so we should not decode it here
+    return name.slice(i + 1);
   }
   try {
     return decodeURIComponent(name.slice(3));
@@ -448,7 +447,7 @@ export const BaseService = serviceFactory({
       });
       const promiseQueue = [
         ...putLocal.map(({ remote, info }) => {
-          this.log('Download script:', getFilename(remote.uri));
+          this.log('Download script:', remote.uri);
           return this.get(remote)
           .then((raw) => {
             const data = parseScriptData(raw);
@@ -464,7 +463,7 @@ export const BaseService = serviceFactory({
           });
         }),
         ...putRemote.map(({ local, remote }) => {
-          this.log('Upload script:', getFilename(local.props.uri));
+          this.log('Upload script:', local.props.uri);
           return pluginScript.get(local.props.id)
           .then((code) => {
             // XXX use version 1 to be compatible with Violentmonkey on other platforms
@@ -484,13 +483,13 @@ export const BaseService = serviceFactory({
           });
         }),
         ...delRemote.map(({ remote }) => {
-          this.log('Remove remote script:', getFilename(remote.uri));
+          this.log('Remove remote script:', remote.uri);
           delete remoteMetaData.info[remote.uri];
           remoteChanged = true;
           return this.remove(remote);
         }),
         ...delLocal.map(({ local }) => {
-          this.log('Remove local script:', getFilename(local.props.uri));
+          this.log('Remove local script:', local.props.uri);
           return pluginScript.remove(local.props.id);
         }),
         ...updateLocal.map(({ local, info }) => {

+ 1 - 0
src/background/utils/db.js

@@ -161,6 +161,7 @@ function initialize() {
         ...getDefaultCustom(),
         ...script.custom,
       };
+      script.props.uri = getNameURI(script);
     });
     Object.assign(store, {
       scripts,

+ 0 - 10
src/background/utils/script.js

@@ -111,13 +111,3 @@ export function getNameURI(script) {
   if (!ns && !name) nameURI += script.props.id || '';
   return nameURI;
 }
-
-export function compareVersion(ver1, ver2) {
-  const parts1 = (ver1 || '').split('.');
-  const parts2 = (ver2 || '').split('.');
-  for (let i = 0; i < parts1.length || i < parts2.length; i += 1) {
-    const delta = (parseInt(parts1[i], 10) || 0) - (parseInt(parts2[i], 10) || 0);
-    if (delta) return delta < 0 ? -1 : 1;
-  }
-  return 0;
-}

+ 2 - 2
src/background/utils/update.js

@@ -1,6 +1,6 @@
-import { i18n, request } from '#/common';
+import { i18n, request, compareVersion } from '#/common';
 import { parseScript } from './db';
-import { parseMeta, compareVersion } from './script';
+import { parseMeta } from './script';
 import { getOption } from './options';
 import { notify, sendMessageOrIgnore } from './message';
 

+ 10 - 0
src/common/index.js

@@ -213,3 +213,13 @@ export function encodeFilename(name) {
 export function decodeFilename(filename) {
   return filename.replace(/-x([0-9a-f]{2})/g, (_m, g) => String.fromCharCode(+`0x${g}`));
 }
+
+export function compareVersion(ver1, ver2) {
+  const parts1 = (ver1 || '').split('.');
+  const parts2 = (ver2 || '').split('.');
+  for (let i = 0; i < parts1.length || i < parts2.length; i += 1) {
+    const delta = (parseInt(parts1[i], 10) || 0) - (parseInt(parts2[i], 10) || 0);
+    if (delta) return delta < 0 ? -1 : 1;
+  }
+  return 0;
+}

+ 1 - 12
test/background/script.test.js

@@ -1,16 +1,5 @@
 import test from 'tape';
-import { compareVersion, parseMeta } from '#/background/utils/script';
-
-test('compareVersion', (t) => {
-  t.equal(compareVersion('1.2.3', '1.2.3'), 0);
-  t.equal(compareVersion('1.2.3', '1.2.0'), 1);
-  t.equal(compareVersion('1.2.3', '1.2.4'), -1);
-  t.equal(compareVersion('1.2.0', '1.2'), 0);
-  t.equal(compareVersion('1.2.1', '1.2'), 1);
-  t.equal(compareVersion('1.1.9', '1.2'), -1);
-  t.equal(compareVersion('1.10', '1.9'), 1);
-  t.end();
-});
+import { parseMeta } from '#/background/utils/script';
 
 const baseMeta = {
   include: [],

+ 12 - 1
test/common/index.test.js

@@ -1,5 +1,5 @@
 import test from 'tape';
-import { isRemote } from '#/common';
+import { isRemote, compareVersion } from '#/common';
 
 test('isRemote', (t) => {
   t.notOk(isRemote());
@@ -12,3 +12,14 @@ test('isRemote', (t) => {
   t.notOk(isRemote('http://127.0.0.1/a.user.js'));
   t.end();
 });
+
+test('compareVersion', (t) => {
+  t.equal(compareVersion('1.2.3', '1.2.3'), 0);
+  t.equal(compareVersion('1.2.3', '1.2.0'), 1);
+  t.equal(compareVersion('1.2.3', '1.2.4'), -1);
+  t.equal(compareVersion('1.2.0', '1.2'), 0);
+  t.equal(compareVersion('1.2.1', '1.2'), 1);
+  t.equal(compareVersion('1.1.9', '1.2'), -1);
+  t.equal(compareVersion('1.10', '1.9'), 1);
+  t.end();
+});