diff options
Diffstat (limited to 'ext/js/display')
-rw-r--r-- | ext/js/display/display-anki.js | 15 | ||||
-rw-r--r-- | ext/js/display/display-audio.js | 3 | ||||
-rw-r--r-- | ext/js/display/display-content-manager.js | 3 | ||||
-rw-r--r-- | ext/js/display/display-generator.js | 9 | ||||
-rw-r--r-- | ext/js/display/display-profile-selection.js | 7 | ||||
-rw-r--r-- | ext/js/display/display.js | 48 | ||||
-rw-r--r-- | ext/js/display/option-toggle-hotkey-handler.js | 7 | ||||
-rw-r--r-- | ext/js/display/popup-main.js | 13 | ||||
-rw-r--r-- | ext/js/display/query-parser.js | 10 | ||||
-rw-r--r-- | ext/js/display/search-display-controller.js | 9 | ||||
-rw-r--r-- | ext/js/display/search-main.js | 14 |
11 files changed, 74 insertions, 64 deletions
diff --git a/ext/js/display/display-anki.js b/ext/js/display/display-anki.js index 68d28d33..c19cfa22 100644 --- a/ext/js/display/display-anki.js +++ b/ext/js/display/display-anki.js @@ -24,7 +24,6 @@ import {isNoteDataValid} from '../data/anki-util.js'; import {PopupMenu} from '../dom/popup-menu.js'; import {querySelectorNotNull} from '../dom/query-selector.js'; import {TemplateRendererProxy} from '../templates/template-renderer-proxy.js'; -import {yomitan} from '../yomitan.js'; export class DisplayAnki { /** @@ -41,7 +40,7 @@ export class DisplayAnki { /** @type {?string} */ this._ankiFieldTemplatesDefault = null; /** @type {AnkiNoteBuilder} */ - this._ankiNoteBuilder = new AnkiNoteBuilder(new TemplateRendererProxy()); + this._ankiNoteBuilder = new AnkiNoteBuilder(display.application.api, new TemplateRendererProxy()); /** @type {?import('./display-notification.js').DisplayNotification} */ this._errorNotification = null; /** @type {?EventListenerCollection} */ @@ -487,7 +486,7 @@ export class DisplayAnki { let noteId = null; let addNoteOkay = false; try { - noteId = await yomitan.api.addAnkiNote(note); + noteId = await this._display.application.api.addAnkiNote(note); addNoteOkay = true; } catch (e) { allErrors.length = 0; @@ -500,7 +499,7 @@ export class DisplayAnki { } else { if (this._suspendNewCards) { try { - await yomitan.api.suspendAnkiCardsForNote(noteId); + await this._display.application.api.suspendAnkiCardsForNote(noteId); } catch (e) { allErrors.push(toError(e)); } @@ -605,7 +604,7 @@ export class DisplayAnki { templates = this._ankiFieldTemplatesDefault; if (typeof templates === 'string') { return templates; } - templates = await yomitan.api.getDefaultAnkiFieldTemplates(); + templates = await this._display.application.api.getDefaultAnkiFieldTemplates(); this._ankiFieldTemplatesDefault = templates; return templates; } @@ -639,12 +638,12 @@ export class DisplayAnki { let ankiError = null; try { if (forceCanAddValue !== null) { - if (!await yomitan.api.isAnkiConnected()) { + if (!await this._display.application.api.isAnkiConnected()) { throw new Error('Anki not connected'); } infos = this._getAnkiNoteInfoForceValue(notes, forceCanAddValue); } else { - infos = await yomitan.api.getAnkiNoteInfo(notes, fetchAdditionalInfo); + infos = await this._display.application.api.getAnkiNoteInfo(notes, fetchAdditionalInfo); } } catch (e) { infos = this._getAnkiNoteInfoForceValue(notes, false); @@ -853,7 +852,7 @@ export class DisplayAnki { const noteIds = this._getNodeNoteIds(node); if (noteIds.length === 0) { return; } try { - await yomitan.api.noteView(noteIds[0], this._noteGuiMode, false); + await this._display.application.api.noteView(noteIds[0], this._noteGuiMode, false); } catch (e) { const displayErrors = ( toError(e).message === 'Mode not supported' ? diff --git a/ext/js/display/display-audio.js b/ext/js/display/display-audio.js index 8cbfc83f..4acd6494 100644 --- a/ext/js/display/display-audio.js +++ b/ext/js/display/display-audio.js @@ -20,7 +20,6 @@ import {EventListenerCollection} from '../core/event-listener-collection.js'; import {PopupMenu} from '../dom/popup-menu.js'; import {querySelectorNotNull} from '../dom/query-selector.js'; import {AudioSystem} from '../media/audio-system.js'; -import {yomitan} from '../yomitan.js'; export class DisplayAudio { /** @@ -676,7 +675,7 @@ export class DisplayAudio { */ async _getTermAudioInfoList(source, term, reading) { const sourceData = this._getSourceData(source); - const infoList = await yomitan.api.getTermAudioInfoList(sourceData, term, reading); + const infoList = await this._display.application.api.getTermAudioInfoList(sourceData, term, reading); return infoList.map((info) => ({info, audioPromise: null, audioResolved: false, audio: null})); } diff --git a/ext/js/display/display-content-manager.js b/ext/js/display/display-content-manager.js index 4465ce3e..81742279 100644 --- a/ext/js/display/display-content-manager.js +++ b/ext/js/display/display-content-manager.js @@ -18,7 +18,6 @@ import {EventListenerCollection} from '../core/event-listener-collection.js'; import {base64ToArrayBuffer} from '../data/sandbox/array-buffer-util.js'; -import {yomitan} from '../yomitan.js'; /** * The content manager which is used when generating HTML display content. @@ -140,7 +139,7 @@ export class DisplayContentManager { */ async _getMediaData(path, dictionary) { const token = this._token; - const datas = await yomitan.api.getMedia([{path, dictionary}]); + const datas = await this._display.application.api.getMedia([{path, dictionary}]); if (token === this._token && datas.length > 0) { const data = datas[0]; const buffer = base64ToArrayBuffer(data.content); diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js index 01f6f38b..fdfe3d4a 100644 --- a/ext/js/display/display-generator.js +++ b/ext/js/display/display-generator.js @@ -21,7 +21,6 @@ import {isObject} from '../core/utilities.js'; import {getDisambiguations, getGroupedPronunciations, getTermFrequency, groupKanjiFrequencies, groupTermFrequencies, groupTermTags, isNonNounVerbOrAdjective} from '../dictionary/dictionary-data-util.js'; import {HtmlTemplateCollection} from '../dom/html-template-collection.js'; import {distributeFurigana, getKanaMorae, getPitchCategory, isCodePointKanji, isStringPartiallyJapanese} from '../language/japanese.js'; -import {yomitan} from '../yomitan.js'; import {createPronunciationDownstepPosition, createPronunciationGraph, createPronunciationText} from './sandbox/pronunciation-generator.js'; import {StructuredContentGenerator} from './sandbox/structured-content-generator.js'; @@ -40,9 +39,11 @@ export class DisplayGenerator { this._structuredContentGenerator = new StructuredContentGenerator(this._contentManager, document); } - /** */ - async prepare() { - const html = await yomitan.api.getDisplayTemplatesHtml(); + /** + * @param {import('../comm/api.js').API} api + */ + async prepare(api) { + const html = await api.getDisplayTemplatesHtml(); this._templates.load(html); this.updateHotkeys(); } diff --git a/ext/js/display/display-profile-selection.js b/ext/js/display/display-profile-selection.js index b61b49d5..3df79b74 100644 --- a/ext/js/display/display-profile-selection.js +++ b/ext/js/display/display-profile-selection.js @@ -20,7 +20,6 @@ import {EventListenerCollection} from '../core/event-listener-collection.js'; import {generateId} from '../core/utilities.js'; import {PanelElement} from '../dom/panel-element.js'; import {querySelectorNotNull} from '../dom/query-selector.js'; -import {yomitan} from '../yomitan.js'; export class DisplayProfileSelection { /** @@ -50,7 +49,7 @@ export class DisplayProfileSelection { /** */ async prepare() { - yomitan.on('optionsUpdated', this._onOptionsUpdated.bind(this)); + this._display.application.on('optionsUpdated', this._onOptionsUpdated.bind(this)); this._profileButton.addEventListener('click', this._onProfileButtonClick.bind(this), false); this._profileListNeedsUpdate = true; } @@ -92,7 +91,7 @@ export class DisplayProfileSelection { /** */ async _updateProfileList() { this._profileListNeedsUpdate = false; - const options = await yomitan.api.optionsGetFull(); + const options = await this._display.application.api.optionsGetFull(); this._eventListeners.removeAllEventListeners(); const displayGenerator = this._display.displayGenerator; @@ -138,7 +137,7 @@ export class DisplayProfileSelection { scope: 'global', optionsContext: null }; - await yomitan.api.modifySettings([modification], this._source); + await this._display.application.api.modifySettings([modification], this._source); this._setProfilePanelVisible(false); } } diff --git a/ext/js/display/display.js b/ext/js/display/display.js index c7a2775d..4114cc45 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -32,7 +32,6 @@ import {ScrollElement} from '../dom/scroll-element.js'; import {TextSourceGenerator} from '../dom/text-source-generator.js'; import {HotkeyHelpController} from '../input/hotkey-help-controller.js'; import {TextScanner} from '../language/text-scanner.js'; -import {yomitan} from '../yomitan.js'; import {DisplayContentManager} from './display-content-manager.js'; import {DisplayGenerator} from './display-generator.js'; import {DisplayHistory} from './display-history.js'; @@ -46,14 +45,17 @@ import {QueryParser} from './query-parser.js'; */ export class Display extends EventDispatcher { /** + * @param {import('../application.js').Application} application * @param {number|undefined} tabId * @param {number|undefined} frameId * @param {import('display').DisplayPageType} pageType * @param {import('../dom/document-focus-controller.js').DocumentFocusController} documentFocusController * @param {import('../input/hotkey-handler.js').HotkeyHandler} hotkeyHandler */ - constructor(tabId, frameId, pageType, documentFocusController, hotkeyHandler) { + constructor(application, tabId, frameId, pageType, documentFocusController, hotkeyHandler) { super(); + /** @type {import('../application.js').Application} */ + this._application = application; /** @type {number|undefined} */ this._tabId = tabId; /** @type {number|undefined} */ @@ -131,6 +133,7 @@ export class Display extends EventDispatcher { this._textSourceGenerator = new TextSourceGenerator(); /** @type {QueryParser} */ this._queryParser = new QueryParser({ + api: application.api, getSearchContext: this._getSearchContext.bind(this), textSourceGenerator: this._textSourceGenerator }); @@ -163,7 +166,7 @@ export class Display extends EventDispatcher { /** @type {boolean} */ this._childrenSupported = true; /** @type {?FrameEndpoint} */ - this._frameEndpoint = (pageType === 'popup' ? new FrameEndpoint() : null); + this._frameEndpoint = (pageType === 'popup' ? new FrameEndpoint(this._application.api) : null); /** @type {?import('environment').Browser} */ this._browser = null; /** @type {?HTMLTextAreaElement} */ @@ -224,6 +227,11 @@ export class Display extends EventDispatcher { /* eslint-enable no-multi-spaces */ } + /** @type {import('../application.js').Application} */ + get application() { + return this._application; + } + /** @type {DisplayGenerator} */ get displayGenerator() { return this._displayGenerator; @@ -307,7 +315,7 @@ export class Display extends EventDispatcher { // State setup const {documentElement} = document; - const {browser} = await yomitan.api.getEnvironmentInfo(); + const {browser} = await this._application.api.getEnvironmentInfo(); this._browser = browser; if (documentElement !== null) { @@ -315,8 +323,8 @@ export class Display extends EventDispatcher { } // Prepare - await this._hotkeyHelpController.prepare(); - await this._displayGenerator.prepare(); + await this._hotkeyHelpController.prepare(this._application.api); + await this._displayGenerator.prepare(this._application.api); this._queryParser.prepare(); this._history.prepare(); this._optionToggleHotkeyHandler.prepare(); @@ -325,8 +333,8 @@ export class Display extends EventDispatcher { this._history.on('stateChanged', this._onStateChanged.bind(this)); this._queryParser.on('searched', this._onQueryParserSearch.bind(this)); this._progressIndicatorVisible.on('change', this._onProgressIndicatorVisibleChanged.bind(this)); - yomitan.on('extensionUnloaded', this._onExtensionUnloaded.bind(this)); - yomitan.crossFrame.registerHandlers([ + this._application.on('extensionUnloaded', this._onExtensionUnloaded.bind(this)); + this._application.crossFrame.registerHandlers([ ['displayPopupMessage1', this._onDisplayPopupMessage1.bind(this)], ['displayPopupMessage2', this._onDisplayPopupMessage2.bind(this)] ]); @@ -384,7 +392,7 @@ export class Display extends EventDispatcher { * @param {Error} error */ onError(error) { - if (yomitan.webExtension.unloaded) { return; } + if (this._application.webExtension.unloaded) { return; } log.error(error); } @@ -412,7 +420,7 @@ export class Display extends EventDispatcher { /** */ async updateOptions() { - const options = await yomitan.api.optionsGet(this.getOptionsContext()); + const options = await this._application.api.optionsGet(this.getOptionsContext()); const {scanning: scanningOptions, sentenceParsing: sentenceParsingOptions} = options; this._options = options; @@ -586,7 +594,7 @@ export class Display extends EventDispatcher { if (typeof this._contentOriginTabId !== 'number' || typeof this._contentOriginFrameId !== 'number') { throw new Error('No content origin is assigned'); } - return await yomitan.crossFrame.invokeTab(this._contentOriginTabId, this._contentOriginFrameId, action, params); + return await this._application.crossFrame.invokeTab(this._contentOriginTabId, this._contentOriginFrameId, action, params); } /** @@ -599,7 +607,7 @@ export class Display extends EventDispatcher { if (this._parentFrameId === null || this._parentFrameId === this._frameId) { throw new Error('Invalid parent frame'); } - return await yomitan.crossFrame.invoke(this._parentFrameId, action, params); + return await this._application.crossFrame.invoke(this._parentFrameId, action, params); } /** @@ -721,7 +729,7 @@ export class Display extends EventDispatcher { /** @type {import('display').WindowApiHandler<'displayExtensionUnloaded'>} */ _onMessageExtensionUnloaded() { - yomitan.webExtension.triggerUnloaded(); + this._application.webExtension.triggerUnloaded(); } // Private @@ -900,7 +908,7 @@ export class Display extends EventDispatcher { const element = /** @type {Element} */ (e.currentTarget); let query = element.textContent; if (query === null) { query = ''; } - const dictionaryEntries = await yomitan.api.kanjiFind(query, optionsContext); + const dictionaryEntries = await this._application.api.kanjiFind(query, optionsContext); /** @type {import('display').ContentDetails} */ const details = { focus: false, @@ -1136,7 +1144,7 @@ export class Display extends EventDispatcher { */ async _findDictionaryEntries(isKanji, source, wildcardsEnabled, optionsContext) { if (isKanji) { - const dictionaryEntries = await yomitan.api.kanjiFind(source, optionsContext); + const dictionaryEntries = await this._application.api.kanjiFind(source, optionsContext); return dictionaryEntries; } else { /** @type {import('api').FindTermsDetails} */ @@ -1155,7 +1163,7 @@ export class Display extends EventDispatcher { } } - const {dictionaryEntries} = await yomitan.api.termsFind(source, findDetails, optionsContext); + const {dictionaryEntries} = await this._application.api.termsFind(source, findDetails, optionsContext); return dictionaryEntries; } } @@ -1640,7 +1648,7 @@ export class Display extends EventDispatcher { /** */ _closePopups() { - yomitan.triggerClosePopups(); + this._application.triggerClosePopups(); } /** @@ -1711,11 +1719,12 @@ export class Display extends EventDispatcher { import('../app/frontend.js') ]); - const popupFactory = new PopupFactory(this._frameId); + const popupFactory = new PopupFactory(this._application, this._frameId); popupFactory.prepare(); /** @type {import('frontend').ConstructorDetails} */ const setupNestedPopupsOptions = { + application: this._application, useProxyPopup, parentPopupId, parentFrameId, @@ -1828,6 +1837,7 @@ export class Display extends EventDispatcher { if (this._contentTextScanner === null) { this._contentTextScanner = new TextScanner({ + api: this._application.api, node: window, getSearchContext: this._getSearchContext.bind(this), searchTerms: true, @@ -1888,7 +1898,7 @@ export class Display extends EventDispatcher { * @param {import('text-scanner').SearchedEventDetails} details */ _onContentTextScannerSearched({type, dictionaryEntries, sentence, textSource, optionsContext, error}) { - if (error !== null && !yomitan.webExtension.unloaded) { + if (error !== null && !this._application.webExtension.unloaded) { log.error(error); } diff --git a/ext/js/display/option-toggle-hotkey-handler.js b/ext/js/display/option-toggle-hotkey-handler.js index d9065e7f..b2f48a3e 100644 --- a/ext/js/display/option-toggle-hotkey-handler.js +++ b/ext/js/display/option-toggle-hotkey-handler.js @@ -16,10 +16,9 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ -import {generateId} from '../core/utilities.js'; import {ExtensionError} from '../core/extension-error.js'; import {toError} from '../core/to-error.js'; -import {yomitan} from '../yomitan.js'; +import {generateId} from '../core/utilities.js'; export class OptionToggleHotkeyHandler { /** @@ -72,7 +71,7 @@ export class OptionToggleHotkeyHandler { try { const optionsContext = this._display.getOptionsContext(); - const getSettingsResponse = (await yomitan.api.getSettings([{ + const getSettingsResponse = (await this._display.application.api.getSettings([{ scope: 'profile', path, optionsContext @@ -97,7 +96,7 @@ export class OptionToggleHotkeyHandler { value, optionsContext }; - const modifySettingsResponse = (await yomitan.api.modifySettings([modification], this._source))[0]; + const modifySettingsResponse = (await this._display.application.api.modifySettings([modification], this._source))[0]; const {error: modifySettingsError} = modifySettingsResponse; if (typeof modifySettingsError !== 'undefined') { throw ExtensionError.deserialize(modifySettingsError); diff --git a/ext/js/display/popup-main.js b/ext/js/display/popup-main.js index 870e039e..2ca2fcd3 100644 --- a/ext/js/display/popup-main.js +++ b/ext/js/display/popup-main.js @@ -16,10 +16,10 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ +import {Application} from '../application.js'; import {log} from '../core/logger.js'; import {DocumentFocusController} from '../dom/document-focus-controller.js'; import {HotkeyHandler} from '../input/hotkey-handler.js'; -import {yomitan} from '../yomitan.js'; import {DisplayAnki} from './display-anki.js'; import {DisplayAudio} from './display-audio.js'; import {DisplayProfileSelection} from './display-profile-selection.js'; @@ -32,14 +32,15 @@ async function main() { const documentFocusController = new DocumentFocusController(); documentFocusController.prepare(); - await yomitan.prepare(); + const application = new Application(); + await application.prepare(); - const {tabId, frameId} = await yomitan.api.frameInformationGet(); + const {tabId, frameId} = await application.api.frameInformationGet(); const hotkeyHandler = new HotkeyHandler(); - hotkeyHandler.prepare(); + hotkeyHandler.prepare(application.crossFrame); - const display = new Display(tabId, frameId, 'popup', documentFocusController, hotkeyHandler); + const display = new Display(application, tabId, frameId, 'popup', documentFocusController, hotkeyHandler); await display.prepare(); const displayAudio = new DisplayAudio(display); @@ -58,7 +59,7 @@ async function main() { document.documentElement.dataset.loaded = 'true'; - yomitan.ready(); + application.ready(); } catch (e) { log.error(e); } diff --git a/ext/js/display/query-parser.js b/ext/js/display/query-parser.js index 178bb110..daa298d2 100644 --- a/ext/js/display/query-parser.js +++ b/ext/js/display/query-parser.js @@ -21,7 +21,6 @@ import {log} from '../core/logger.js'; import {querySelectorNotNull} from '../dom/query-selector.js'; import {convertHiraganaToKatakana, convertKatakanaToHiragana, isStringEntirelyKana} from '../language/japanese.js'; import {TextScanner} from '../language/text-scanner.js'; -import {yomitan} from '../yomitan.js'; /** * @augments EventDispatcher<import('query-parser').Events> @@ -30,8 +29,10 @@ export class QueryParser extends EventDispatcher { /** * @param {import('display').QueryParserConstructorDetails} details */ - constructor({getSearchContext, textSourceGenerator}) { + constructor({api, getSearchContext, textSourceGenerator}) { super(); + /** @type {import('../comm/api.js').API} */ + this._api = api; /** @type {import('display').GetSearchContextCallback} */ this._getSearchContext = getSearchContext; /** @type {string} */ @@ -58,6 +59,7 @@ export class QueryParser extends EventDispatcher { this._queryParserModeSelect = querySelectorNotNull(document, '#query-parser-mode-select'); /** @type {TextScanner} */ this._textScanner = new TextScanner({ + api, node: this._queryParser, getSearchContext, searchTerms: true, @@ -128,7 +130,7 @@ export class QueryParser extends EventDispatcher { /** @type {?import('core').TokenObject} */ const token = {}; this._setTextToken = token; - this._parseResults = await yomitan.api.parseText(text, this._getOptionsContext(), this._scanLength, this._useInternalParser, this._useMecabParser); + this._parseResults = await this._api.parseText(text, this._getOptionsContext(), this._scanLength, this._useInternalParser, this._useMecabParser); if (this._setTextToken !== token) { return; } this._refreshSelectedParser(); @@ -214,7 +216,7 @@ export class QueryParser extends EventDispatcher { scope: 'profile', optionsContext }; - yomitan.api.modifySettings([modification], 'search'); + this._api.modifySettings([modification], 'search'); } /** diff --git a/ext/js/display/search-display-controller.js b/ext/js/display/search-display-controller.js index ff4340c1..49c69520 100644 --- a/ext/js/display/search-display-controller.js +++ b/ext/js/display/search-display-controller.js @@ -21,7 +21,6 @@ import {ClipboardMonitor} from '../comm/clipboard-monitor.js'; import {createApiMap, invokeApiMapHandler} from '../core/api-map.js'; import {EventListenerCollection} from '../core/event-listener-collection.js'; import {querySelectorNotNull} from '../dom/query-selector.js'; -import {yomitan} from '../yomitan.js'; export class SearchDisplayController { /** @@ -71,7 +70,7 @@ export class SearchDisplayController { /** @type {ClipboardMonitor} */ this._clipboardMonitor = new ClipboardMonitor({ clipboardReader: { - getText: yomitan.api.clipboardGet.bind(yomitan.api) + getText: this._display.application.api.clipboardGet.bind(this._display.application.api) } }); /** @type {import('application').ApiMap} */ @@ -89,7 +88,7 @@ export class SearchDisplayController { this._searchPersistentStateController.on('modeChange', this._onModeChange.bind(this)); chrome.runtime.onMessage.addListener(this._onMessage.bind(this)); - yomitan.on('optionsUpdated', this._onOptionsUpdated.bind(this)); + this._display.application.on('optionsUpdated', this._onOptionsUpdated.bind(this)); this._display.on('optionsUpdated', this._onDisplayOptionsUpdated.bind(this)); this._display.on('contentUpdateStart', this._onContentUpdateStart.bind(this)); @@ -297,7 +296,7 @@ export class SearchDisplayController { scope: 'profile', optionsContext: this._display.getOptionsContext() }; - yomitan.api.modifySettings([modification], 'search'); + this._display.application.api.modifySettings([modification], 'search'); } /** @@ -430,7 +429,7 @@ export class SearchDisplayController { scope: 'profile', optionsContext: this._display.getOptionsContext() }; - await yomitan.api.modifySettings([modification], 'search'); + await this._display.application.api.modifySettings([modification], 'search'); } /** */ diff --git a/ext/js/display/search-main.js b/ext/js/display/search-main.js index dedad163..dc4f1b7e 100644 --- a/ext/js/display/search-main.js +++ b/ext/js/display/search-main.js @@ -16,10 +16,10 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ +import {Application} from '../application.js'; import {log} from '../core/logger.js'; import {DocumentFocusController} from '../dom/document-focus-controller.js'; import {HotkeyHandler} from '../input/hotkey-handler.js'; -import {yomitan} from '../yomitan.js'; import {DisplayAnki} from './display-anki.js'; import {DisplayAudio} from './display-audio.js'; import {Display} from './display.js'; @@ -30,6 +30,8 @@ import {SearchPersistentStateController} from './search-persistent-state-control /** Entry point. */ async function main() { try { + const application = new Application(); + const documentFocusController = new DocumentFocusController('#search-textbox'); documentFocusController.prepare(); @@ -39,14 +41,14 @@ async function main() { const searchActionPopupController = new SearchActionPopupController(searchPersistentStateController); searchActionPopupController.prepare(); - await yomitan.prepare(); + await application.prepare(); - const {tabId, frameId} = await yomitan.api.frameInformationGet(); + const {tabId, frameId} = await application.api.frameInformationGet(); const hotkeyHandler = new HotkeyHandler(); - hotkeyHandler.prepare(); + hotkeyHandler.prepare(application.crossFrame); - const display = new Display(tabId, frameId, 'search', documentFocusController, hotkeyHandler); + const display = new Display(application, tabId, frameId, 'search', documentFocusController, hotkeyHandler); await display.prepare(); const displayAudio = new DisplayAudio(display); @@ -62,7 +64,7 @@ async function main() { document.documentElement.dataset.loaded = 'true'; - yomitan.ready(); + application.ready(); } catch (e) { log.error(e); } |