From e6e5f23cf8481db31b94c18244f404dd3374ad90 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 00:39:15 +0200 Subject: fix API calls when Backend isn't ready yet --- ext/mixed/js/api.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'ext/mixed/js') 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; -- cgit v1.2.3 From 967e99b7f69d24fc76999675cef44b919602dd31 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 04:51:45 +0200 Subject: ensure Backend prepare in other places --- ext/bg/js/backend.js | 22 +++++++++++++++------- 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, 34 insertions(+), 38 deletions(-) (limited to 'ext/mixed/js') 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,19 +114,24 @@ class Backend { } this.clipboardMonitor.onClipboardText = this._onClipboardText.bind(this); - } - onOptionsUpdated(source) { - this.applyOptions(); + 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: 'optionsUpdated', params: {source}}, callback); + chrome.tabs.sendMessage(tab.id, {action, params}, callback); } }); } + onOptionsUpdated(source) { + this.applyOptions(); + this._sendMessageAllTabs('optionsUpdated', {source}); + } + onMessage({action, params}, sender, callback) { const handler = this._messageHandlers.get(action); if (typeof handler !== 'function') { return false; } @@ -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]); -- cgit v1.2.3 From bd48d2f919e1387063c66ef91c40ec86a1131118 Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 10:35:46 +0200 Subject: 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(-) (limited to 'ext/mixed/js') 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 } } }; -- cgit v1.2.3 From 56b2f2c853494b228aa4467a64ed91486432bffd Mon Sep 17 00:00:00 2001 From: siikamiika Date: Mon, 2 Mar 2020 11:31:09 +0200 Subject: trigger yomichanCoreReady only when preparing --- ext/mixed/js/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mixed/js') 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; } -- cgit v1.2.3