diff options
Diffstat (limited to 'ext/js/yomitan.js')
| -rw-r--r-- | ext/js/yomitan.js | 56 | 
1 files changed, 22 insertions, 34 deletions
| diff --git a/ext/js/yomitan.js b/ext/js/yomitan.js index 7505c0ca..621e9cf0 100644 --- a/ext/js/yomitan.js +++ b/ext/js/yomitan.js @@ -18,7 +18,8 @@  import {API} from './comm/api.js';  import {CrossFrameAPI} from './comm/cross-frame-api.js'; -import {EventDispatcher, deferPromise, invokeMessageHandler, log} from './core.js'; +import {EventDispatcher, deferPromise, log} from './core.js'; +import {createApiMap, invokeApiMapHandler} from './core/api-map.js';  import {ExtensionError} from './core/extension-error.js';  /** @@ -95,15 +96,15 @@ export class Yomitan extends EventDispatcher {          this._isBackendReadyPromiseResolve = resolve;          /* eslint-disable no-multi-spaces */ -        /** @type {import('core').MessageHandlerMap} */ -        this._messageHandlers = new Map(/** @type {import('core').MessageHandlerMapInit} */ ([ -            ['Yomitan.isReady',         this._onMessageIsReady.bind(this)], -            ['Yomitan.backendReady',    this._onMessageBackendReady.bind(this)], -            ['Yomitan.getUrl',          this._onMessageGetUrl.bind(this)], -            ['Yomitan.optionsUpdated',  this._onMessageOptionsUpdated.bind(this)], -            ['Yomitan.databaseUpdated', this._onMessageDatabaseUpdated.bind(this)], -            ['Yomitan.zoomChanged',     this._onMessageZoomChanged.bind(this)] -        ])); +        /** @type {import('application').ApiMap} */ +        this._apiMap = createApiMap([ +            ['applicationIsReady',         this._onMessageIsReady.bind(this)], +            ['applicationBackendReady',    this._onMessageBackendReady.bind(this)], +            ['applicationGetUrl',          this._onMessageGetUrl.bind(this)], +            ['applicationOptionsUpdated',  this._onMessageOptionsUpdated.bind(this)], +            ['applicationDatabaseUpdated', this._onMessageDatabaseUpdated.bind(this)], +            ['applicationZoomChanged',     this._onMessageZoomChanged.bind(this)] +        ]);          /* eslint-enable no-multi-spaces */      } @@ -171,7 +172,7 @@ export class Yomitan extends EventDispatcher {       */      ready() {          this._isReady = true; -        this.sendMessage({action: 'yomitanReady'}); +        this.sendMessage({action: 'applicationReady'});      }      /** @@ -183,6 +184,7 @@ export class Yomitan extends EventDispatcher {          return this._extensionUrlBase !== null && url.startsWith(this._extensionUrlBase);      } +    // TODO : this function needs type safety      /**       * Runs `chrome.runtime.sendMessage()` with additional exception handling events.       * @param {import('extension').ChromeRuntimeSendMessageArgs} args The arguments to be passed to `chrome.runtime.sendMessage()`. @@ -221,55 +223,41 @@ export class Yomitan extends EventDispatcher {          return location.href;      } -    /** @type {import('extension').ChromeRuntimeOnMessageCallback} */ -    _onMessage({action, params}, sender, callback) { -        const messageHandler = this._messageHandlers.get(action); -        if (typeof messageHandler === 'undefined') { return false; } -        return invokeMessageHandler(messageHandler, params, callback, sender); +    /** @type {import('extension').ChromeRuntimeOnMessageCallback<import('application').ApiMessageAny>} */ +    _onMessage({action, params}, _sender, callback) { +        return invokeApiMapHandler(this._apiMap, action, params, [], callback);      } -    /** -     * @returns {boolean} -     */ +    /** @type {import('application').ApiHandler<'applicationIsReady'>} */      _onMessageIsReady() {          return this._isReady;      } -    /** -     * @returns {void} -     */ +    /** @type {import('application').ApiHandler<'applicationBackendReady'>} */      _onMessageBackendReady() {          if (this._isBackendReadyPromiseResolve === null) { return; }          this._isBackendReadyPromiseResolve();          this._isBackendReadyPromiseResolve = null;      } -    /** -     * @returns {{url: string}} -     */ +    /** @type {import('application').ApiHandler<'applicationGetUrl'>} */      _onMessageGetUrl() {          return {url: this._getUrl()};      } -    /** -     * @param {{source: string}} params -     */ +    /** @type {import('application').ApiHandler<'applicationOptionsUpdated'>} */      _onMessageOptionsUpdated({source}) {          if (source !== 'background') {              this.trigger('optionsUpdated', {source});          }      } -    /** -     * @param {{type: string, cause: string}} params -     */ +    /** @type {import('application').ApiHandler<'applicationDatabaseUpdated'>} */      _onMessageDatabaseUpdated({type, cause}) {          this.trigger('databaseUpdated', {type, cause});      } -    /** -     * @param {{oldZoomFactor: number, newZoomFactor: number}} params -     */ +    /** @type {import('application').ApiHandler<'applicationZoomChanged'>} */      _onMessageZoomChanged({oldZoomFactor, newZoomFactor}) {          this.trigger('zoomChanged', {oldZoomFactor, newZoomFactor});      } |