diff options
Diffstat (limited to 'ext/js/app')
-rw-r--r-- | ext/js/app/frontend.js | 53 |
1 files changed, 22 insertions, 31 deletions
diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index b68b55f3..b093ec33 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -16,7 +16,8 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ -import {EventListenerCollection, invokeMessageHandler, log, promiseAnimationFrame} from '../core.js'; +import {EventListenerCollection, log, promiseAnimationFrame} from '../core.js'; +import {createApiMap, invokeApiMapHandler} from '../core/api-map.js'; import {DocumentUtil} from '../dom/document-util.js'; import {TextSourceElement} from '../dom/text-source-element.js'; import {TextSourceRange} from '../dom/text-source-range.js'; @@ -106,12 +107,12 @@ export class Frontend { this._optionsContextOverride = null; /* eslint-disable no-multi-spaces */ - /** @type {import('core').MessageHandlerMap} */ - this._runtimeMessageHandlers = new Map(/** @type {import('core').MessageHandlerMapInit} */ ([ - ['Frontend.requestReadyBroadcast', this._onMessageRequestFrontendReadyBroadcast.bind(this)], - ['Frontend.setAllVisibleOverride', this._onApiSetAllVisibleOverride.bind(this)], - ['Frontend.clearAllVisibleOverride', this._onApiClearAllVisibleOverride.bind(this)] - ])); + /** @type {import('application').ApiMap} */ + this._runtimeApiMap = createApiMap([ + ['frontendRequestReadyBroadcast', this._onMessageRequestFrontendReadyBroadcast.bind(this)], + ['frontendSetAllVisibleOverride', this._onApiSetAllVisibleOverride.bind(this)], + ['frontendClearAllVisibleOverride', this._onApiClearAllVisibleOverride.bind(this)] + ]); this._hotkeyHandler.registerActions([ ['scanSelectedText', this._onActionScanSelectedText.bind(this)], @@ -239,9 +240,7 @@ export class Frontend { // Message handlers - /** - * @param {import('frontend').FrontendRequestReadyBroadcastParams} params - */ + /** @type {import('application').ApiHandler<'frontendRequestReadyBroadcast'>} */ _onMessageRequestFrontendReadyBroadcast({frameId}) { this._signalFrontendReady(frameId); } @@ -313,10 +312,7 @@ export class Frontend { }; } - /** - * @param {{value: boolean, priority: number, awaitFrame: boolean}} params - * @returns {Promise<import('core').TokenString>} - */ + /** @type {import('application').ApiHandler<'frontendSetAllVisibleOverride'>} */ async _onApiSetAllVisibleOverride({value, priority, awaitFrame}) { const result = await this._popupFactory.setAllVisibleOverride(value, priority); if (awaitFrame) { @@ -325,10 +321,7 @@ export class Frontend { return result; } - /** - * @param {{token: import('core').TokenString}} params - * @returns {Promise<boolean>} - */ + /** @type {import('application').ApiHandler<'frontendClearAllVisibleOverride'>} */ async _onApiClearAllVisibleOverride({token}) { return await this._popupFactory.clearAllVisibleOverride(token); } @@ -342,11 +335,9 @@ export class Frontend { this._updatePopupPosition(); } - /** @type {import('extension').ChromeRuntimeOnMessageCallback} */ - _onRuntimeMessage({action, params}, sender, callback) { - const messageHandler = this._runtimeMessageHandlers.get(action); - if (typeof messageHandler === 'undefined') { return false; } - return invokeMessageHandler(messageHandler, params, callback, sender); + /** @type {import('extension').ChromeRuntimeOnMessageCallback<import('application').ApiMessageAny>} */ + _onRuntimeMessage({action, params}, _sender, callback) { + return invokeApiMapHandler(this._runtimeApiMap, action, params, [], callback); } /** @@ -827,12 +818,12 @@ export class Frontend { * @param {?number} targetFrameId */ _signalFrontendReady(targetFrameId) { - /** @type {import('frontend').FrontendReadyDetails} */ - const params = {frameId: this._frameId}; + /** @type {import('application').ApiMessageNoFrameId<'frontendReady'>} */ + const message = {action: 'frontendReady', params: {frameId: this._frameId}}; if (targetFrameId === null) { - yomitan.api.broadcastTab('frontendReady', params); + yomitan.api.broadcastTab(message); } else { - yomitan.api.sendMessageToFrame(targetFrameId, 'frontendReady', params); + yomitan.api.sendMessageToFrame(targetFrameId, message); } } @@ -853,11 +844,11 @@ export class Frontend { } chrome.runtime.onMessage.removeListener(onMessage); }; - /** @type {import('extension').ChromeRuntimeOnMessageCallback} */ + /** @type {import('extension').ChromeRuntimeOnMessageCallback<import('application').ApiMessageAny>} */ const onMessage = (message, _sender, sendResponse) => { try { - const {action, params} = message; - if (action === 'frontendReady' && /** @type {import('frontend').FrontendReadyDetails} */ (params).frameId === frameId) { + const {action} = message; + if (action === 'frontendReady' && message.params.frameId === frameId) { cleanup(); resolve(); sendResponse(); @@ -876,7 +867,7 @@ export class Frontend { } chrome.runtime.onMessage.addListener(onMessage); - yomitan.api.broadcastTab('Frontend.requestReadyBroadcast', {frameId: this._frameId}); + yomitan.api.broadcastTab({action: 'frontendRequestReadyBroadcast', params: {frameId: this._frameId}}); }); } |