From 2abf46b6fa9d6c03be0d98045e111f2d8e1e41d5 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Sun, 1 Mar 2020 23:06:37 +0200 Subject: [PATCH 01/10] simplify backend prepare --- ext/bg/js/backend.js | 69 ++++++++++++------------------------ ext/bg/js/settings/backup.js | 2 +- 2 files changed, 24 insertions(+), 47 deletions(-) diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index b99d1ca4..07dca370 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -39,9 +39,6 @@ class Backend { url: window.location.href }; - this.isPreparedResolve = null; - this.isPreparedPromise = new Promise((resolve) => (this.isPreparedResolve = resolve)); - this.clipboardPasteTarget = document.querySelector('#clipboard-paste-target'); this.popupWindow = null; @@ -110,15 +107,11 @@ class Backend { } chrome.runtime.onMessage.addListener(this.onMessage.bind(this)); - const options = this.getOptionsSync(this.optionsContext); + const options = this.getOptions(this.optionsContext); if (options.general.showGuide) { chrome.tabs.create({url: chrome.runtime.getURL('/bg/guide.html')}); } - this.isPreparedResolve(); - this.isPreparedResolve = null; - this.isPreparedPromise = null; - this.clipboardMonitor.onClipboardText = this._onClipboardText.bind(this); } @@ -160,7 +153,7 @@ class Backend { } applyOptions() { - const options = this.getOptionsSync(this.optionsContext); + const options = this.getOptions(this.optionsContext); if (!options.general.enable) { this.setExtensionBadgeBackgroundColor('#555555'); this.setExtensionBadgeText('off'); @@ -186,24 +179,15 @@ class Backend { } } - async getOptionsSchema() { - if (this.isPreparedPromise !== null) { - await this.isPreparedPromise; - } + getOptionsSchema() { return this.optionsSchema; } - async getFullOptions() { - if (this.isPreparedPromise !== null) { - await this.isPreparedPromise; - } + getFullOptions() { return this.options; } - async setFullOptions(options) { - if (this.isPreparedPromise !== null) { - await this.isPreparedPromise; - } + setFullOptions(options) { try { this.options = JsonSchema.getValidValueOrDefault(this.optionsSchema, utilIsolate(options)); } catch (e) { @@ -212,18 +196,11 @@ class Backend { } } - async getOptions(optionsContext) { - if (this.isPreparedPromise !== null) { - await this.isPreparedPromise; - } - return this.getOptionsSync(optionsContext); + getOptions(optionsContext) { + return this.getProfile(optionsContext).options; } - getOptionsSync(optionsContext) { - return this.getProfileSync(optionsContext).options; - } - - getProfileSync(optionsContext) { + getProfile(optionsContext) { const profiles = this.options.profiles; if (typeof optionsContext.index === 'number') { return profiles[optionsContext.index]; @@ -290,20 +267,20 @@ class Backend { // Message handlers - _onApiOptionsSchemaGet() { + async _onApiOptionsSchemaGet() { return this.getOptionsSchema(); } - _onApiOptionsGet({optionsContext}) { + async _onApiOptionsGet({optionsContext}) { return this.getOptions(optionsContext); } - _onApiOptionsGetFull() { + async _onApiOptionsGetFull() { return this.getFullOptions(); } async _onApiOptionsSet({changedOptions, optionsContext, source}) { - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); function getValuePaths(obj) { const valuePaths = []; @@ -343,20 +320,20 @@ class Backend { } async _onApiOptionsSave({source}) { - const options = await this.getFullOptions(); + const options = this.getFullOptions(); await optionsSave(options); this.onOptionsUpdated(source); } async _onApiKanjiFind({text, optionsContext}) { - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); const definitions = await this.translator.findKanji(text, options); definitions.splice(options.general.maxResults); return definitions; } async _onApiTermsFind({text, details, optionsContext}) { - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); const mode = options.general.resultOutputMode; const [definitions, length] = await this.translator.findTerms(mode, text, details, options); definitions.splice(options.general.maxResults); @@ -364,7 +341,7 @@ class Backend { } async _onApiTextParse({text, optionsContext}) { - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); const results = []; while (text.length > 0) { const term = []; @@ -394,7 +371,7 @@ class Backend { } async _onApiTextParseMecab({text, optionsContext}) { - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); const results = []; const rawResults = await this.mecab.parseText(text); for (const [mecabName, parsedLines] of Object.entries(rawResults)) { @@ -425,7 +402,7 @@ class Backend { } async _onApiDefinitionAdd({definition, mode, context, optionsContext}) { - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); const templates = this.defaultAnkiFieldTemplates; if (mode !== 'kanji') { @@ -450,7 +427,7 @@ class Backend { } async _onApiDefinitionsAddable({definitions, modes, optionsContext}) { - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); const templates = this.defaultAnkiFieldTemplates; const states = []; @@ -497,7 +474,7 @@ class Backend { } async _onApiNoteView({noteId}) { - return this.anki.guiBrowse(`nid:${noteId}`); + return await this.anki.guiBrowse(`nid:${noteId}`); } async _onApiTemplateRender({template, data}) { @@ -509,7 +486,7 @@ class Backend { } async _onApiAudioGetUrl({definition, source, optionsContext}) { - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); return await audioGetUrl(definition, source, options); } @@ -668,7 +645,7 @@ class Backend { async _onCommandSearch(params) { const {mode='existingOrNewTab', query} = params || {}; - const options = await this.getOptions(this.optionsContext); + const options = this.getOptions(this.optionsContext); const {popupWidth, popupHeight} = options.general; const baseUrl = chrome.runtime.getURL('/bg/search.html'); @@ -752,7 +729,7 @@ class Backend { }; const source = 'popup'; - const options = await this.getOptions(optionsContext); + const options = this.getOptions(optionsContext); options.general.enable = !options.general.enable; await this._onApiOptionsSave({source}); } diff --git a/ext/bg/js/settings/backup.js b/ext/bg/js/settings/backup.js index e945d186..acd21920 100644 --- a/ext/bg/js/settings/backup.js +++ b/ext/bg/js/settings/backup.js @@ -120,7 +120,7 @@ async function _onSettingsExportClick() { // Importing async function _settingsImportSetOptionsFull(optionsFull) { - return utilIsolate(await utilBackend().setFullOptions( + return utilIsolate(utilBackend().setFullOptions( utilBackgroundIsolate(optionsFull) )); } From e6e5f23cf8481db31b94c18244f404dd3374ad90 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 00:39:15 +0200 Subject: [PATCH 02/10] fix API calls when Backend isn't ready yet --- ext/bg/js/backend.js | 5 +++++ ext/mixed/js/api.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 07dca370..e849bc69 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -48,6 +48,7 @@ class Backend { this.messageToken = yomichan.generateId(16); this._messageHandlers = new Map([ + ['isBackendReady', this._onApiIsBackendReady.bind(this)], ['optionsSchemaGet', this._onApiOptionsSchemaGet.bind(this)], ['optionsGet', this._onApiOptionsGet.bind(this)], ['optionsGetFull', this._onApiOptionsGetFull.bind(this)], @@ -267,6 +268,10 @@ class Backend { // Message handlers + async _onApiIsBackendReady() { + return true; + } + async _onApiOptionsSchemaGet() { return this.getOptionsSchema(); } diff --git a/ext/mixed/js/api.js b/ext/mixed/js/api.js index 26f4389d..fa61a1e2 100644 --- a/ext/mixed/js/api.js +++ b/ext/mixed/js/api.js @@ -122,6 +122,30 @@ function apiGetDefaultAnkiFieldTemplates() { } function _apiInvoke(action, params={}) { + if (!_isBackendReady) { + if (_isBackendReadyPromise === null) { + _isBackendReadyPromise = new Promise((resolve) => (_isBackendReadyResolve = resolve)); + const checkBackendReady = async () => { + try { + if (await _apiInvokeRaw('isBackendReady')) { + _isBackendReady = true; + _isBackendReadyResolve(); + } + } catch (e) { + // NOP + } + setTimeout(checkBackendReady, 100); // poll Backend until it responds + }; + checkBackendReady(); + } + return _isBackendReadyPromise.then( + () => _apiInvokeRaw(action, params) + ); + } + return _apiInvokeRaw(action, params); +} + +function _apiInvokeRaw(action, params={}) { const data = {action, params}; return new Promise((resolve, reject) => { try { @@ -148,3 +172,7 @@ function _apiInvoke(action, params={}) { function _apiCheckLastError() { // NOP } + +let _isBackendReady = false; +let _isBackendReadyResolve = null; +let _isBackendReadyPromise = null; From 967e99b7f69d24fc76999675cef44b919602dd31 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 04:51:45 +0200 Subject: [PATCH 03/10] ensure Backend prepare in other places --- ext/bg/js/backend.js | 28 ++++++++++++++++++---------- ext/bg/js/search-frontend.js | 2 ++ ext/bg/js/search.js | 5 ++--- ext/fg/js/frontend.js | 1 + ext/mixed/js/api.js | 28 ---------------------------- ext/mixed/js/core.js | 13 +++++++++++++ ext/mixed/js/display.js | 1 + 7 files changed, 37 insertions(+), 41 deletions(-) diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index e849bc69..81578462 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -48,7 +48,7 @@ class Backend { this.messageToken = yomichan.generateId(16); this._messageHandlers = new Map([ - ['isBackendReady', this._onApiIsBackendReady.bind(this)], + ['yomichanOnline', this._onApiYomichanOnline.bind(this)], ['optionsSchemaGet', this._onApiOptionsSchemaGet.bind(this)], ['optionsGet', this._onApiOptionsGet.bind(this)], ['optionsGetFull', this._onApiOptionsGetFull.bind(this)], @@ -114,17 +114,22 @@ class Backend { } this.clipboardMonitor.onClipboardText = this._onClipboardText.bind(this); + + this._sendMessageAllTabs('backendPrepared'); + } + + _sendMessageAllTabs(action, params={}) { + const callback = () => this.checkLastError(chrome.runtime.lastError); + chrome.tabs.query({}, (tabs) => { + for (const tab of tabs) { + chrome.tabs.sendMessage(tab.id, {action, params}, callback); + } + }); } onOptionsUpdated(source) { this.applyOptions(); - - const callback = () => this.checkLastError(chrome.runtime.lastError); - chrome.tabs.query({}, (tabs) => { - for (const tab of tabs) { - chrome.tabs.sendMessage(tab.id, {action: 'optionsUpdated', params: {source}}, callback); - } - }); + this._sendMessageAllTabs('optionsUpdated', {source}); } onMessage({action, params}, sender, callback) { @@ -268,8 +273,11 @@ class Backend { // Message handlers - async _onApiIsBackendReady() { - return true; + async _onApiYomichanOnline(_params, sender) { + const tabId = sender.tab.id; + return new Promise((resolve) => { + chrome.tabs.sendMessage(tabId, {action: 'backendPrepared'}, resolve); + }); } async _onApiOptionsSchemaGet() { diff --git a/ext/bg/js/search-frontend.js b/ext/bg/js/search-frontend.js index 509c4009..453a0b79 100644 --- a/ext/bg/js/search-frontend.js +++ b/ext/bg/js/search-frontend.js @@ -19,6 +19,8 @@ /*global apiOptionsGet*/ async function searchFrontendSetup() { + await yomichan.prepare(); + const optionsContext = { depth: 0, url: window.location.href diff --git a/ext/bg/js/search.js b/ext/bg/js/search.js index 0a7a5fe1..f3cba7ae 100644 --- a/ext/bg/js/search.js +++ b/ext/bg/js/search.js @@ -68,9 +68,8 @@ class DisplaySearch extends Display { async prepare() { try { - const superPromise = super.prepare(); - const queryParserPromise = this.queryParser.prepare(); - await Promise.all([superPromise, queryParserPromise]); + await super.prepare(); + await this.queryParser.prepare(); const {queryParams: {query='', mode=''}} = parseUrl(window.location.href); diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js index 929ab56a..203366c3 100644 --- a/ext/fg/js/frontend.js +++ b/ext/fg/js/frontend.js @@ -52,6 +52,7 @@ class Frontend extends TextScanner { async prepare() { try { + await yomichan.prepare(); await this.updateOptions(); const {zoomFactor} = await apiGetZoom(); this._pageZoomFactor = zoomFactor; diff --git a/ext/mixed/js/api.js b/ext/mixed/js/api.js index fa61a1e2..26f4389d 100644 --- a/ext/mixed/js/api.js +++ b/ext/mixed/js/api.js @@ -122,30 +122,6 @@ function apiGetDefaultAnkiFieldTemplates() { } function _apiInvoke(action, params={}) { - if (!_isBackendReady) { - if (_isBackendReadyPromise === null) { - _isBackendReadyPromise = new Promise((resolve) => (_isBackendReadyResolve = resolve)); - const checkBackendReady = async () => { - try { - if (await _apiInvokeRaw('isBackendReady')) { - _isBackendReady = true; - _isBackendReadyResolve(); - } - } catch (e) { - // NOP - } - setTimeout(checkBackendReady, 100); // poll Backend until it responds - }; - checkBackendReady(); - } - return _isBackendReadyPromise.then( - () => _apiInvokeRaw(action, params) - ); - } - return _apiInvokeRaw(action, params); -} - -function _apiInvokeRaw(action, params={}) { const data = {action, params}; return new Promise((resolve, reject) => { try { @@ -172,7 +148,3 @@ function _apiInvokeRaw(action, params={}) { function _apiCheckLastError() { // NOP } - -let _isBackendReady = false; -let _isBackendReadyResolve = null; -let _isBackendReadyPromise = null; diff --git a/ext/mixed/js/core.js b/ext/mixed/js/core.js index 83813796..a3cb2459 100644 --- a/ext/mixed/js/core.js +++ b/ext/mixed/js/core.js @@ -269,17 +269,26 @@ const yomichan = (() => { constructor() { super(); + this._isBackendPreparedResolve = null; + this._isBackendPreparedPromise = new Promise((resolve) => (this._isBackendPreparedResolve = resolve)); + this._messageHandlers = new Map([ + ['backendPrepared', this._onBackendPrepared.bind(this)], ['getUrl', this._onMessageGetUrl.bind(this)], ['optionsUpdated', this._onMessageOptionsUpdated.bind(this)], ['zoomChanged', this._onMessageZoomChanged.bind(this)] ]); chrome.runtime.onMessage.addListener(this._onMessage.bind(this)); + chrome.runtime.sendMessage({action: 'yomichanOnline'}); } // Public + prepare() { + return this._isBackendPreparedPromise; + } + generateId(length) { const array = new Uint8Array(length); window.crypto.getRandomValues(array); @@ -305,6 +314,10 @@ const yomichan = (() => { return false; } + _onBackendPrepared() { + this._isBackendPreparedResolve(); + } + _onMessageGetUrl() { return {url: window.location.href}; } diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index e3e5e7df..6a762a65 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -153,6 +153,7 @@ class Display { } async prepare(options=null) { + await yomichan.prepare(); const displayGeneratorPromise = this.displayGenerator.prepare(); const updateOptionsPromise = this.updateOptions(options); await Promise.all([displayGeneratorPromise, updateOptionsPromise]); From bd48d2f919e1387063c66ef91c40ec86a1131118 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 10:35:46 +0200 Subject: [PATCH 04/10] fix Yomichan core message issues --- ext/bg/js/backend.js | 4 ++-- ext/mixed/js/core.js | 2 +- test/test-database.js | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 81578462..cdcfb7ad 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -48,7 +48,7 @@ class Backend { this.messageToken = yomichan.generateId(16); this._messageHandlers = new Map([ - ['yomichanOnline', this._onApiYomichanOnline.bind(this)], + ['yomichanCoreReady', this._onApiYomichanCoreReady.bind(this)], ['optionsSchemaGet', this._onApiOptionsSchemaGet.bind(this)], ['optionsGet', this._onApiOptionsGet.bind(this)], ['optionsGetFull', this._onApiOptionsGetFull.bind(this)], @@ -273,7 +273,7 @@ class Backend { // Message handlers - async _onApiYomichanOnline(_params, sender) { + async _onApiYomichanCoreReady(_params, sender) { const tabId = sender.tab.id; return new Promise((resolve) => { chrome.tabs.sendMessage(tabId, {action: 'backendPrepared'}, resolve); diff --git a/ext/mixed/js/core.js b/ext/mixed/js/core.js index a3cb2459..b7ac8743 100644 --- a/ext/mixed/js/core.js +++ b/ext/mixed/js/core.js @@ -280,7 +280,7 @@ const yomichan = (() => { ]); chrome.runtime.onMessage.addListener(this._onMessage.bind(this)); - chrome.runtime.sendMessage({action: 'yomichanOnline'}); + chrome.runtime.sendMessage({action: 'yomichanCoreReady'}); } // Public diff --git a/test/test-database.js b/test/test-database.js index 35f22523..9a24a393 100644 --- a/test/test-database.js +++ b/test/test-database.js @@ -30,6 +30,9 @@ const chrome = { }, getURL(path2) { return url.pathToFileURL(path.join(__dirname, '..', 'ext', path2.replace(/^\//, ''))); + }, + sendMessage() { + // NOP } } }; From e0edb30efd51ac18167880d77c2dea11c73a1bfc Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 11:18:09 +0200 Subject: [PATCH 05/10] fix Backend prepare issues in settings --- ext/bg/js/backend.js | 4 ++++ ext/bg/js/settings/backup.js | 4 ++-- ext/bg/js/settings/main.js | 5 ++++- ext/bg/js/util.js | 6 +++++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index cdcfb7ad..be43ecf6 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -39,6 +39,8 @@ class Backend { url: window.location.href }; + this.isPrepared = false; + this.clipboardPasteTarget = document.querySelector('#clipboard-paste-target'); this.popupWindow = null; @@ -108,6 +110,8 @@ class Backend { } chrome.runtime.onMessage.addListener(this.onMessage.bind(this)); + this.isPrepared = true; + const options = this.getOptions(this.optionsContext); if (options.general.showGuide) { chrome.tabs.create({url: chrome.runtime.getURL('/bg/guide.html')}); diff --git a/ext/bg/js/settings/backup.js b/ext/bg/js/settings/backup.js index acd21920..daa08c61 100644 --- a/ext/bg/js/settings/backup.js +++ b/ext/bg/js/settings/backup.js @@ -362,10 +362,10 @@ async function _onSettingsResetConfirmClick() { // Setup -window.addEventListener('DOMContentLoaded', () => { +function backupInitialize() { document.querySelector('#settings-export').addEventListener('click', _onSettingsExportClick, false); document.querySelector('#settings-import').addEventListener('click', _onSettingsImportClick, false); document.querySelector('#settings-import-file').addEventListener('change', _onSettingsImportFileChange, false); document.querySelector('#settings-reset').addEventListener('click', _onSettingsResetClick, false); document.querySelector('#settings-reset-modal-confirm').addEventListener('click', _onSettingsResetConfirmClick, false); -}, false); +} diff --git a/ext/bg/js/settings/main.js b/ext/bg/js/settings/main.js index 127a6d2b..1bf1444c 100644 --- a/ext/bg/js/settings/main.js +++ b/ext/bg/js/settings/main.js @@ -21,7 +21,7 @@ utilBackend, utilIsolate, utilBackgroundIsolate ankiErrorShown, ankiFieldsToDict ankiTemplatesUpdateValue, onAnkiOptionsChanged, onDictionaryOptionsChanged appearanceInitialize, audioSettingsInitialize, profileOptionsSetup, dictSettingsInitialize -ankiInitialize, ankiTemplatesInitialize, storageInfoInitialize +ankiInitialize, ankiTemplatesInitialize, storageInfoInitialize, backupInitialize */ function getOptionsMutable(optionsContext) { @@ -262,6 +262,8 @@ function showExtensionInformation() { async function onReady() { + await yomichan.prepare(); + showExtensionInformation(); formSetupEventListeners(); @@ -271,6 +273,7 @@ async function onReady() { await dictSettingsInitialize(); ankiInitialize(); ankiTemplatesInitialize(); + backupInitialize(); storageInfoInitialize(); diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index 5ce4b08c..79c6af06 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -73,7 +73,11 @@ function utilStringHashCode(string) { } function utilBackend() { - return chrome.extension.getBackgroundPage().yomichanBackend; + const backend = chrome.extension.getBackgroundPage().yomichanBackend; + if (!backend.isPrepared) { + throw new Error('Backend not ready yet'); + } + return backend; } async function utilAnkiGetModelNames() { From 56b2f2c853494b228aa4467a64ed91486432bffd Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 11:31:09 +0200 Subject: [PATCH 06/10] trigger yomichanCoreReady only when preparing --- ext/mixed/js/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mixed/js/core.js b/ext/mixed/js/core.js index b7ac8743..0e22b9ac 100644 --- a/ext/mixed/js/core.js +++ b/ext/mixed/js/core.js @@ -280,12 +280,12 @@ const yomichan = (() => { ]); chrome.runtime.onMessage.addListener(this._onMessage.bind(this)); - chrome.runtime.sendMessage({action: 'yomichanCoreReady'}); } // Public prepare() { + chrome.runtime.sendMessage({action: 'yomichanCoreReady'}); return this._isBackendPreparedPromise; } From a05a05c4f49d97f44dc3e1599906047c4a346512 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 12:01:53 +0200 Subject: [PATCH 07/10] fix content script entry point Yomichan prepare Covers Popup stuff in addition to Frontend --- ext/fg/js/frontend-initialize.js | 2 ++ ext/fg/js/frontend.js | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/fg/js/frontend-initialize.js b/ext/fg/js/frontend-initialize.js index 54b874f2..bbb789cc 100644 --- a/ext/fg/js/frontend-initialize.js +++ b/ext/fg/js/frontend-initialize.js @@ -19,6 +19,8 @@ /*global PopupProxyHost, PopupProxy, Frontend*/ async function main() { + await yomichan.prepare(); + const data = window.frontendInitializationData || {}; const {id, depth=0, parentFrameId, ignoreNodes, url, proxy=false} = data; diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js index 203366c3..929ab56a 100644 --- a/ext/fg/js/frontend.js +++ b/ext/fg/js/frontend.js @@ -52,7 +52,6 @@ class Frontend extends TextScanner { async prepare() { try { - await yomichan.prepare(); await this.updateOptions(); const {zoomFactor} = await apiGetZoom(); this._pageZoomFactor = zoomFactor; From e6347a94e7ff0b7a5c1db7e6f83f50d93c2d4545 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 23:26:55 +0200 Subject: [PATCH 08/10] prepare Backend for browser_action --- ext/bg/js/backend.js | 5 +++++ ext/bg/js/context.js | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index be43ecf6..14b0aff1 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -278,6 +278,11 @@ class Backend { // Message handlers async _onApiYomichanCoreReady(_params, sender) { + // tab ID isn't set in background (e.g. browser_action) + if (typeof sender.tab === 'undefined') { + return chrome.runtime.sendMessage({action: 'backendPrepared'}); + } + const tabId = sender.tab.id; return new Promise((resolve) => { chrome.tabs.sendMessage(tabId, {action: 'backendPrepared'}, resolve); diff --git a/ext/bg/js/context.js b/ext/bg/js/context.js index bec964fb..1095c7e0 100644 --- a/ext/bg/js/context.js +++ b/ext/bg/js/context.js @@ -48,7 +48,9 @@ function setupButtonEvents(selector, command, url) { } } -window.addEventListener('DOMContentLoaded', () => { +window.addEventListener('DOMContentLoaded', async () => { + await yomichan.prepare(); + showExtensionInfo(); apiGetEnvironmentInfo().then(({browser}) => { From 9ceb663f290f3167bd427171a4f5cc2116e1a765 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Tue, 3 Mar 2020 00:05:01 +0200 Subject: [PATCH 09/10] add missing runtime message for backendPrepared --- ext/bg/js/backend.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 14b0aff1..0677b4b1 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -120,6 +120,7 @@ class Backend { this.clipboardMonitor.onClipboardText = this._onClipboardText.bind(this); this._sendMessageAllTabs('backendPrepared'); + chrome.runtime.sendMessage({action: 'backendPrepared'}); } _sendMessageAllTabs(action, params={}) { From de8d9e6bf12f693d6579a2fb965fd7597a04288c Mon Sep 17 00:00:00 2001 From: siikamiika Date: Wed, 4 Mar 2020 05:28:22 +0200 Subject: [PATCH 10/10] fix return type --- ext/bg/js/backend.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 0677b4b1..5b7ab084 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -278,10 +278,11 @@ class Backend { // Message handlers - async _onApiYomichanCoreReady(_params, sender) { + _onApiYomichanCoreReady(_params, sender) { // tab ID isn't set in background (e.g. browser_action) if (typeof sender.tab === 'undefined') { - return chrome.runtime.sendMessage({action: 'backendPrepared'}); + chrome.runtime.sendMessage({action: 'backendPrepared'}); + return Promise.resolve(); } const tabId = sender.tab.id;