diff options
Diffstat (limited to 'ext/bg/js')
| -rw-r--r-- | ext/bg/js/api.js | 17 | ||||
| -rw-r--r-- | ext/bg/js/backend.js | 19 | ||||
| -rw-r--r-- | ext/bg/js/options.js | 138 | 
3 files changed, 90 insertions, 84 deletions
| diff --git a/ext/bg/js/api.js b/ext/bg/js/api.js index b8ef4362..9839aef5 100644 --- a/ext/bg/js/api.js +++ b/ext/bg/js/api.js @@ -17,16 +17,16 @@   */ -async function apiOptionsSet(options) { -    utilBackend().onOptionsUpdated(options); +function apiOptionsGetSync() { +    return utilBackend().options;  }  async function apiOptionsGet() { -    return utilBackend().options; +    return apiOptionsGetSync();  }  async function apiTermsFind(text) { -    const options = utilBackend().options; +    const options = apiOptionsGetSync();      const translator = utilBackend().translator;      const searcher = { @@ -48,13 +48,13 @@ async function apiTermsFind(text) {  }  async function apiKanjiFind(text) { -    const options = utilBackend().options; +    const options = apiOptionsGetSync();      const definitions = await utilBackend().translator.findKanji(text, dictEnabledSet(options));      return definitions.slice(0, options.general.maxResults);  }  async function apiDefinitionAdd(definition, mode, context) { -    const options = utilBackend().options; +    const options = apiOptionsGetSync();      if (mode !== 'kanji') {          await audioInject( @@ -83,7 +83,7 @@ async function apiDefinitionsAddable(definitions, modes) {          const notes = [];          for (const definition of definitions) {              for (const mode of modes) { -                const note = await dictNoteFormat(definition, mode, utilBackend().options); +                const note = await dictNoteFormat(definition, mode, apiOptionsGetSync());                  notes.push(note);              }          } @@ -131,10 +131,9 @@ async function apiCommandExec(command) {          },          toggle: async () => { -            const options = utilBackend().options; +            const options = apiOptionsGetSync();              options.general.enable = !options.general.enable;              await optionsSave(options); -            await apiOptionsSet(options);          }      }; diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 39fd4288..b3e737da 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -28,7 +28,7 @@ class Backend {      async prepare() {          await this.translator.prepare(); -        await apiOptionsSet(await optionsLoad()); +        this.onOptionsUpdated(await optionsLoad());          if (chrome.commands !== null && typeof chrome.commands === 'object') {              chrome.commands.onCommand.addListener(this.onCommand.bind(this)); @@ -41,7 +41,8 @@ class Backend {      }      onOptionsUpdated(options) { -        this.options = utilIsolate(options); +        options = utilIsolate(options); +        this.options = options;          if (!options.general.enable) {              this.setExtensionBadgeBackgroundColor('#555555'); @@ -53,16 +54,12 @@ class Backend {              this.setExtensionBadgeText('');          } -        if (options.anki.enable) { -            this.anki = new AnkiConnect(options.anki.server); -        } else { -            this.anki = new AnkiNull(); -        } +        this.anki = options.anki.enable ? new AnkiConnect(options.anki.server) : new AnkiNull();          const callback = () => this.checkLastError(chrome.runtime.lastError);          chrome.tabs.query({}, tabs => {              for (const tab of tabs) { -                chrome.tabs.sendMessage(tab.id, {action: 'optionsSet', params: options}, callback); +                chrome.tabs.sendMessage(tab.id, {action: 'optionsSet', params: {options}}, callback);              }          });      } @@ -85,10 +82,6 @@ class Backend {                  forward(apiOptionsGet(), callback);              }, -            optionsSet: ({options, callback}) => { -                forward(apiOptionsSet(options), callback); -            }, -              kanjiFind: ({text, callback}) => {                  forward(apiKanjiFind(text), callback);              }, @@ -148,7 +141,7 @@ class Backend {              chrome.browserAction.setBadgeBackgroundColor({color});          }      } -     +      setExtensionBadgeText(text) {          if (typeof chrome.browserAction.setBadgeText === 'function') {              chrome.browserAction.setBadgeText({text}); diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js index df95aae9..69c662e6 100644 --- a/ext/bg/js/options.js +++ b/ext/bg/js/options.js @@ -17,6 +17,57 @@   */ +function optionsApplyUpdates(options, updates) { +    const targetVersion = updates.length; +    const currentVersion = options.version; +    if (typeof currentVersion === 'number' && Number.isFinite(currentVersion)) { +        for (let i = Math.max(0, Math.floor(currentVersion)); i < targetVersion; ++i) { +            const update = updates[i]; +            if (update !== null) { +                update(options); +            } +        } +    } + +    options.version = targetVersion; +    return options; +} + +const optionsVersionUpdates = [ +    null, +    null, +    null, +    null, +    (options) => { +        options.general.audioSource = options.general.audioPlayback ? 'jpod101' : 'disabled'; +    }, +    (options) => { +        options.general.showGuide = false; +    }, +    (options) => { +        options.scanning.modifier = options.scanning.requireShift ? 'shift' : 'none'; +    }, +    (options) => { +        const fieldTemplatesDefault = profileCreateDefaultFieldTemplates(); +        options.general.resultOutputMode = options.general.groupResults ? 'group' : 'split'; +        options.anki.fieldTemplates = ( +            (utilStringHashCode(options.anki.fieldTemplates) !== -805327496) ? +            `{{#if merge}}${fieldTemplatesDefault}{{else}}${options.anki.fieldTemplates}{{/if}}` : +            fieldTemplatesDefault +        ); +    }, +    (options) => { +        if (utilStringHashCode(options.anki.fieldTemplates) === 1285806040) { +            options.anki.fieldTemplates = profileCreateDefaultFieldTemplates(); +        } +    }, +    (options) => { +        if (utilStringHashCode(options.anki.fieldTemplates) === -250091611) { +            options.anki.fieldTemplates = profileCreateDefaultFieldTemplates(); +        } +    } +]; +  function optionsFieldTemplates() {      return `  {{#*inline "glossary-single"}} @@ -183,8 +234,8 @@ function optionsFieldTemplates() {  `.trim();  } -function optionsSetDefaults(options) { -    const defaults = { +function optionsCreateDefaults() { +    return {          general: {              enable: true,              audioSource: 'jpod101', @@ -238,6 +289,10 @@ function optionsSetDefaults(options) {              fieldTemplates: optionsFieldTemplates()          }      }; +} + +function optionsSetDefaults(options) { +    const defaults = optionsCreateDefaults();      const combine = (target, source) => {          for (const key in source) { @@ -258,70 +313,29 @@ function optionsSetDefaults(options) {  }  function optionsVersion(options) { -    const fixups = [ -        () => {}, -        () => {}, -        () => {}, -        () => {}, -        () => { -            if (options.general.audioPlayback) { -                options.general.audioSource = 'jpod101'; -            } else { -                options.general.audioSource = 'disabled'; -            } -        }, -        () => { -            options.general.showGuide = false; -        }, -        () => { -            if (options.scanning.requireShift) { -                options.scanning.modifier = 'shift'; -            } else { -                options.scanning.modifier = 'none'; -            } -        }, -        () => { -            if (options.general.groupResults) { -                options.general.resultOutputMode = 'group'; -            } else { -                options.general.resultOutputMode = 'split'; -            } -            if (utilStringHashCode(options.anki.fieldTemplates) !== -805327496) { -                options.anki.fieldTemplates = `{{#if merge}}${optionsFieldTemplates()}{{else}}${options.anki.fieldTemplates}{{/if}}`; -            } else { -                options.anki.fieldTemplates = optionsFieldTemplates(); -            } -        }, -        () => { -            if (utilStringHashCode(options.anki.fieldTemplates) === 1285806040) { -                options.anki.fieldTemplates = optionsFieldTemplates(); -            } -        }, -        () => { -            if (utilStringHashCode(options.anki.fieldTemplates) === -250091611) { -                options.anki.fieldTemplates = optionsFieldTemplates(); -            } -        } -    ]; -      optionsSetDefaults(options); -    if (!options.hasOwnProperty('version')) { -        options.version = fixups.length; -    } - -    while (options.version < fixups.length) { -        fixups[options.version++](); -    } - -    return options; +    return optionsApplyUpdates(options, optionsVersionUpdates);  }  function optionsLoad() {      return new Promise((resolve, reject) => { -        chrome.storage.local.get(null, store => resolve(store.options)); +        chrome.storage.local.get(['options'], store => { +            const error = chrome.runtime.lastError; +            if (error) { +                reject(error); +            } else { +                resolve(store.options); +            } +        });      }).then(optionsStr => { -        return optionsStr ? JSON.parse(optionsStr) : {}; -    }).catch(error => { +        if (typeof optionsStr === 'string') { +            const options = JSON.parse(optionsStr); +            if (typeof options === 'object' && options !== null && !Array.isArray(options)) { +                return options; +            } +        } +        return {}; +    }).catch(() => {          return {};      }).then(options => {          return optionsVersion(options); @@ -329,9 +343,9 @@ function optionsLoad() {  }  function optionsSave(options) { -    return new Promise((resolve, reject) => { +    return new Promise((resolve) => {          chrome.storage.local.set({options: JSON.stringify(options)}, resolve);      }).then(() => { -        apiOptionsSet(options); +        utilBackend().onOptionsUpdated(options);      });  } |