diff options
| author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2024-02-18 09:27:16 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-18 14:27:16 +0000 | 
| commit | 65fa65fc7765bc9a6557d3ce6f8bdcef5b5e0cf7 (patch) | |
| tree | 4e91bc8ec3e0dadbabe3e3d4c6c92d2b6f9fd2a5 /ext/js | |
| parent | cfc65c31313731dfa0d36c2eceaca35e9d50992f (diff) | |
Application main updates (#708)
* Move waitForBackendReady
* Add option to wait for DOM before running main
* Move script load to be earlier
Diffstat (limited to 'ext/js')
| -rw-r--r-- | ext/js/app/content-script-main.js | 2 | ||||
| -rw-r--r-- | ext/js/application.js | 59 | ||||
| -rw-r--r-- | ext/js/display/popup-main.js | 2 | ||||
| -rw-r--r-- | ext/js/display/search-main.js | 2 | ||||
| -rw-r--r-- | ext/js/pages/action-popup-main.js | 2 | ||||
| -rw-r--r-- | ext/js/pages/info-main.js | 2 | ||||
| -rw-r--r-- | ext/js/pages/permissions-main.js | 2 | ||||
| -rw-r--r-- | ext/js/pages/settings/popup-preview-frame-main.js | 2 | ||||
| -rw-r--r-- | ext/js/pages/settings/settings-main.js | 2 | ||||
| -rw-r--r-- | ext/js/pages/welcome-main.js | 2 | 
10 files changed, 48 insertions, 29 deletions
| diff --git a/ext/js/app/content-script-main.js b/ext/js/app/content-script-main.js index 34160fd1..c17acbfe 100644 --- a/ext/js/app/content-script-main.js +++ b/ext/js/app/content-script-main.js @@ -21,7 +21,7 @@ import {HotkeyHandler} from '../input/hotkey-handler.js';  import {Frontend} from './frontend.js';  import {PopupFactory} from './popup-factory.js'; -await Application.main(async (application) => { +await Application.main(false, async (application) => {      const hotkeyHandler = new HotkeyHandler();      hotkeyHandler.prepare(application.crossFrame); diff --git a/ext/js/application.js b/ext/js/application.js index 350a4210..ec5c7e02 100644 --- a/ext/js/application.js +++ b/ext/js/application.js @@ -52,6 +52,41 @@ if (checkChromeNotAvailable()) {  }  /** + * @param {WebExtension} webExtension + */ +async function waitForBackendReady(webExtension) { +    const {promise, resolve} = /** @type {import('core').DeferredPromiseDetails<void>} */ (deferPromise()); +    /** @type {import('application').ApiMap} */ +    const apiMap = createApiMap([['applicationBackendReady', () => { resolve(); }]]); +    /** @type {import('extension').ChromeRuntimeOnMessageCallback<import('application').ApiMessageAny>} */ +    const onMessage = ({action, params}, _sender, callback) => invokeApiMapHandler(apiMap, action, params, [], callback); +    chrome.runtime.onMessage.addListener(onMessage); +    try { +        await webExtension.sendMessagePromise({action: 'requestBackendReadySignal'}); +        await promise; +    } finally { +        chrome.runtime.onMessage.removeListener(onMessage); +    } +} + +/** + * @returns {Promise<void>} + */ +function waitForDomContentLoaded() { +    return new Promise((resolve) => { +        if (document.readyState !== 'loading') { +            resolve(); +            return; +        } +        const onDomContentLoaded = () => { +            document.removeEventListener('DOMContentLoaded', onDomContentLoaded); +            resolve(); +        }; +        document.addEventListener('DOMContentLoaded', onDomContentLoaded); +    }); +} + +/**   * The Yomitan class is a core component through which various APIs are handled and invoked.   * @augments EventDispatcher<import('application').Events>   */ @@ -151,18 +186,20 @@ export class Application extends EventDispatcher {      }      /** +     * @param {boolean} waitForDom       * @param {(application: Application) => (Promise<void>)} mainFunction       */ -    static async main(mainFunction) { +    static async main(waitForDom, mainFunction) {          const webExtension = new WebExtension();          log.configure(webExtension.extensionName);          const api = new API(webExtension); -        await this.waitForBackendReady(webExtension); +        await waitForBackendReady(webExtension);          const {tabId, frameId} = await api.frameInformationGet();          const crossFrameApi = new CrossFrameAPI(api, tabId, frameId);          crossFrameApi.prepare();          const application = new Application(api, crossFrameApi);          application.prepare(); +        if (waitForDom) { await waitForDomContentLoaded(); }          try {              await mainFunction(application);          } catch (error) { @@ -172,24 +209,6 @@ export class Application extends EventDispatcher {          }      } -    /** -     * @param {WebExtension} webExtension -     */ -    static async waitForBackendReady(webExtension) { -        const {promise, resolve} = /** @type {import('core').DeferredPromiseDetails<void>} */ (deferPromise()); -        /** @type {import('application').ApiMap} */ -        const apiMap = createApiMap([['applicationBackendReady', () => { resolve(); }]]); -        /** @type {import('extension').ChromeRuntimeOnMessageCallback<import('application').ApiMessageAny>} */ -        const onMessage = ({action, params}, _sender, callback) => invokeApiMapHandler(apiMap, action, params, [], callback); -        chrome.runtime.onMessage.addListener(onMessage); -        try { -            await webExtension.sendMessagePromise({action: 'requestBackendReadySignal'}); -            await promise; -        } finally { -            chrome.runtime.onMessage.removeListener(onMessage); -        } -    } -      // Private      /** diff --git a/ext/js/display/popup-main.js b/ext/js/display/popup-main.js index 8f92aaa8..fe1d20dd 100644 --- a/ext/js/display/popup-main.js +++ b/ext/js/display/popup-main.js @@ -25,7 +25,7 @@ import {DisplayProfileSelection} from './display-profile-selection.js';  import {DisplayResizer} from './display-resizer.js';  import {Display} from './display.js'; -await Application.main(async (application) => { +await Application.main(true, async (application) => {      const documentFocusController = new DocumentFocusController();      documentFocusController.prepare(); diff --git a/ext/js/display/search-main.js b/ext/js/display/search-main.js index fd90ee0e..c3c292a1 100644 --- a/ext/js/display/search-main.js +++ b/ext/js/display/search-main.js @@ -26,7 +26,7 @@ import {SearchActionPopupController} from './search-action-popup-controller.js';  import {SearchDisplayController} from './search-display-controller.js';  import {SearchPersistentStateController} from './search-persistent-state-controller.js'; -await Application.main(async (application) => { +await Application.main(true, async (application) => {      const documentFocusController = new DocumentFocusController('#search-textbox');      documentFocusController.prepare(); diff --git a/ext/js/pages/action-popup-main.js b/ext/js/pages/action-popup-main.js index f58083a7..0a14c669 100644 --- a/ext/js/pages/action-popup-main.js +++ b/ext/js/pages/action-popup-main.js @@ -306,7 +306,7 @@ class DisplayController {      }  } -await Application.main(async (application) => { +await Application.main(true, async (application) => {      application.api.logIndicatorClear();      const displayController = new DisplayController(application.api); diff --git a/ext/js/pages/info-main.js b/ext/js/pages/info-main.js index 0bc84d97..dda1c4e2 100644 --- a/ext/js/pages/info-main.js +++ b/ext/js/pages/info-main.js @@ -115,7 +115,7 @@ async function showDictionaryInfo(api) {      container.appendChild(fragment);  } -await Application.main(async (application) => { +await Application.main(true, async (application) => {      const documentFocusController = new DocumentFocusController();      documentFocusController.prepare(); diff --git a/ext/js/pages/permissions-main.js b/ext/js/pages/permissions-main.js index 3be97b78..40dbceb2 100644 --- a/ext/js/pages/permissions-main.js +++ b/ext/js/pages/permissions-main.js @@ -86,7 +86,7 @@ function setupPermissionsToggles() {      }  } -await Application.main(async (application) => { +await Application.main(true, async (application) => {      const documentFocusController = new DocumentFocusController();      documentFocusController.prepare(); diff --git a/ext/js/pages/settings/popup-preview-frame-main.js b/ext/js/pages/settings/popup-preview-frame-main.js index c6c694cd..978b102e 100644 --- a/ext/js/pages/settings/popup-preview-frame-main.js +++ b/ext/js/pages/settings/popup-preview-frame-main.js @@ -21,7 +21,7 @@ import {Application} from '../../application.js';  import {HotkeyHandler} from '../../input/hotkey-handler.js';  import {PopupPreviewFrame} from './popup-preview-frame.js'; -await Application.main(async (application) => { +await Application.main(true, async (application) => {      const hotkeyHandler = new HotkeyHandler();      hotkeyHandler.prepare(application.crossFrame); diff --git a/ext/js/pages/settings/settings-main.js b/ext/js/pages/settings/settings-main.js index 0b115246..82fc91a5 100644 --- a/ext/js/pages/settings/settings-main.js +++ b/ext/js/pages/settings/settings-main.js @@ -58,7 +58,7 @@ async function setupGenericSettingController(genericSettingController) {      await genericSettingController.refresh();  } -await Application.main(async (application) => { +await Application.main(true, async (application) => {      const documentFocusController = new DocumentFocusController();      documentFocusController.prepare(); diff --git a/ext/js/pages/welcome-main.js b/ext/js/pages/welcome-main.js index 9990b4e7..d1d1a6b2 100644 --- a/ext/js/pages/welcome-main.js +++ b/ext/js/pages/welcome-main.js @@ -49,7 +49,7 @@ async function setupGenericSettingsController(genericSettingController) {      await genericSettingController.refresh();  } -await Application.main(async (application) => { +await Application.main(true, async (application) => {      const documentFocusController = new DocumentFocusController();      documentFocusController.prepare(); |