diff options
Diffstat (limited to 'ext/js/background')
-rw-r--r-- | ext/js/background/backend.js | 151 |
1 files changed, 2 insertions, 149 deletions
diff --git a/ext/js/background/backend.js b/ext/js/background/backend.js index d62c852b..c62685b2 100644 --- a/ext/js/background/backend.js +++ b/ext/js/background/backend.js @@ -22,9 +22,9 @@ import {AnkiConnect} from '../comm/anki-connect.js'; import {ClipboardMonitor} from '../comm/clipboard-monitor.js'; import {ClipboardReader} from '../comm/clipboard-reader.js'; import {Mecab} from '../comm/mecab.js'; -import {clone, deferPromise, generateId, invokeMessageHandler, isObject, log, promiseTimeout} from '../core.js'; +import {clone, deferPromise, invokeMessageHandler, isObject, log, promiseTimeout} from '../core.js'; import {ExtensionError} from '../core/extension-error.js'; -import {parseJson, readResponseJson} from '../core/json.js'; +import {readResponseJson} from '../core/json.js'; import {AnkiUtil} from '../data/anki-util.js'; import {OptionsUtil} from '../data/options-util.js'; import {PermissionsUtil} from '../data/permissions-util.js'; @@ -36,7 +36,6 @@ import {JapaneseUtil} from '../language/sandbox/japanese-util.js'; import {Translator} from '../language/translator.js'; import {AudioDownloader} from '../media/audio-downloader.js'; import {MediaUtil} from '../media/media-util.js'; -import {yomitan} from '../yomitan.js'; import {ClipboardReaderProxy, DictionaryDatabaseProxy, OffscreenProxy, TranslatorProxy} from './offscreen-proxy.js'; import {ProfileConditionsUtil} from './profile-conditions-util.js'; import {RequestBuilder} from './request-builder.js'; @@ -179,7 +178,6 @@ export class Backend { ['getMedia', this._onApiGetMedia.bind(this)], ['log', this._onApiLog.bind(this)], ['logIndicatorClear', this._onApiLogIndicatorClear.bind(this)], - ['createActionPort', this._onApiCreateActionPort.bind(this)], ['modifySettings', this._onApiModifySettings.bind(this)], ['getSettings', this._onApiGetSettings.bind(this)], ['setAllSettings', this._onApiSetAllSettings.bind(this)], @@ -194,10 +192,6 @@ export class Backend { ['openCrossFramePort', this._onApiOpenCrossFramePort.bind(this)] ])); /* eslint-enable no-multi-spaces */ - /** @type {import('backend').MessageHandlerWithProgressMap} */ - this._messageHandlersWithProgress = new Map(/** @type {import('backend').MessageHandlerWithProgressMapInit} */ ([ - // Empty - ])); /** @type {Map<string, (params?: import('core').SerializableObject) => void>} */ this._commandHandlers = new Map(/** @type {[name: string, handler: (params?: import('core').SerializableObject) => void][]} */ ([ @@ -746,31 +740,6 @@ export class Backend { this._updateBadge(); } - /** @type {import('api').Handler<import('api').CreateActionPortDetails, import('api').CreateActionPortResult, true>} */ - _onApiCreateActionPort(_params, sender) { - if (!sender || !sender.tab) { throw new Error('Invalid sender'); } - const tabId = sender.tab.id; - if (typeof tabId !== 'number') { throw new Error('Sender has invalid tab ID'); } - - const frameId = sender.frameId; - const id = generateId(16); - /** @type {import('cross-frame-api').ActionPortDetails} */ - const details = { - name: 'action-port', - id - }; - - const port = chrome.tabs.connect(tabId, {name: JSON.stringify(details), frameId}); - try { - this._createActionListenerPort(port, sender, this._messageHandlersWithProgress); - } catch (e) { - port.disconnect(); - throw e; - } - - return details; - } - /** @type {import('api').Handler<import('api').ModifySettingsDetails, import('api').ModifySettingsResult>} */ _onApiModifySettings({targets, source}) { return this._modifySettings(targets, source); @@ -1484,107 +1453,6 @@ export class Backend { } /** - * @param {chrome.runtime.Port} port - * @param {chrome.runtime.MessageSender} sender - * @param {import('backend').MessageHandlerWithProgressMap} handlers - */ - _createActionListenerPort(port, sender, handlers) { - let done = false; - let hasStarted = false; - /** @type {?string} */ - let messageString = ''; - - /** - * @param {...unknown} data - */ - const onProgress = (...data) => { - try { - if (done) { return; } - port.postMessage(/** @type {import('backend').InvokeWithProgressResponseProgressMessage} */ ({type: 'progress', data})); - } catch (e) { - // NOP - } - }; - - /** - * @param {import('backend').InvokeWithProgressRequestMessage} message - */ - const onMessage = (message) => { - if (hasStarted) { return; } - - try { - const {action} = message; - switch (action) { - case 'fragment': - messageString += message.data; - break; - case 'invoke': - if (messageString !== null) { - hasStarted = true; - port.onMessage.removeListener(onMessage); - - /** @type {{action: string, params?: import('core').SerializableObject}} */ - const messageData = parseJson(messageString); - messageString = null; - onMessageComplete(messageData); - } - break; - } - } catch (e) { - cleanup(e); - } - }; - - /** - * @param {{action: string, params?: import('core').SerializableObject}} message - */ - const onMessageComplete = async (message) => { - try { - const {action, params} = message; - port.postMessage(/** @type {import('backend').InvokeWithProgressResponseAcknowledgeMessage} */ ({type: 'ack'})); - - const messageHandler = handlers.get(action); - if (typeof messageHandler === 'undefined') { - throw new Error('Invalid action'); - } - const {handler, async, contentScript} = messageHandler; - - if (!contentScript) { - this._validatePrivilegedMessageSender(sender); - } - - const promiseOrResult = handler(params, sender, onProgress); - const result = async ? await promiseOrResult : promiseOrResult; - port.postMessage(/** @type {import('backend').InvokeWithProgressResponseCompleteMessage} */ ({type: 'complete', data: result})); - } catch (e) { - cleanup(e); - } - }; - - const onDisconnect = () => { - cleanup(null); - }; - - /** - * @param {unknown} error - */ - const cleanup = (error) => { - if (done) { return; } - if (error !== null) { - port.postMessage(/** @type {import('backend').InvokeWithProgressResponseErrorMessage} */ ({type: 'error', data: ExtensionError.serialize(error)})); - } - if (!hasStarted) { - port.onMessage.removeListener(onMessage); - } - port.onDisconnect.removeListener(onDisconnect); - done = true; - }; - - port.onMessage.addListener(onMessage); - port.onDisconnect.addListener(onDisconnect); - } - - /** * @param {?import('log').LogLevel} errorLevel * @returns {number} */ @@ -1693,21 +1561,6 @@ export class Backend { } /** - * @param {chrome.runtime.MessageSender} sender - * @throws {Error} - */ - _validatePrivilegedMessageSender(sender) { - let {url} = sender; - if (typeof url === 'string' && yomitan.isExtensionUrl(url)) { return; } - const {tab} = sender; - if (typeof tab === 'object' && tab !== null) { - ({url} = tab); - if (typeof url === 'string' && yomitan.isExtensionUrl(url)) { return; } - } - throw new Error('Invalid message sender'); - } - - /** * @returns {Promise<string>} */ _getBrowserIconTitle() { |