From 5382f2353e693bc8e2682eb045e8bb9930829adc Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Wed, 17 Mar 2021 22:50:23 +0900 Subject: Load content scripts on document.body is ready --- src/content/Bootstrap.ts | 27 +++++++++++++++++++++++++++ src/content/index.ts | 34 ++++++++++++++++++++++------------ 2 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 src/content/Bootstrap.ts (limited to 'src/content') diff --git a/src/content/Bootstrap.ts b/src/content/Bootstrap.ts new file mode 100644 index 0000000..62e1530 --- /dev/null +++ b/src/content/Bootstrap.ts @@ -0,0 +1,27 @@ +type Callback = () => void; + +export default class Bootstrap { + constructor() {} + + isReady(): boolean { + return document.body !== null; + } + + waitForReady(callback: Callback): void { + const observer = new MutationObserver(() => { + if (document.body != null) { + observer.disconnect(); + callback(); + } + }); + + observer.observe(document, { + attributes: false, + attributeOldValue: false, + characterData: false, + characterDataOldValue: false, + childList: true, + subtree: true, + }); + } +} diff --git a/src/content/index.ts b/src/content/index.ts index b575e0d..5252338 100644 --- a/src/content/index.ts +++ b/src/content/index.ts @@ -1,22 +1,32 @@ import "reflect-metadata"; import Application from "./Application"; +import Bootstrap from "./Bootstrap"; import consoleFrameStyle from "./site-style"; import { ConsoleFramePresenterImpl } from "./presenters/ConsoleFramePresenter"; import { container } from "tsyringe"; import "./di"; -if (window.self === window.top) { - new ConsoleFramePresenterImpl().initialize(); -} +const initDom = () => { + if (window.self === window.top) { + new ConsoleFramePresenterImpl().initialize(); + } -try { - const app = container.resolve(Application); - app.run(); -} catch (e) { - console.error(e); -} + try { + const app = container.resolve(Application); + app.run(); + } catch (e) { + console.error(e); + } -const style = window.document.createElement("style"); -style.textContent = consoleFrameStyle; -window.document.head.appendChild(style); + const style = window.document.createElement("style"); + style.textContent = consoleFrameStyle; + window.document.head.appendChild(style); +}; + +const bootstrap = new Bootstrap(); +if (bootstrap.isReady()) { + initDom(); +} else { + bootstrap.waitForReady(() => initDom()); +} -- cgit v1.2.3 From 3ffb4b066cdcc60a49ce4ecd0bbc498da6256534 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Wed, 17 Mar 2021 23:20:41 +0900 Subject: Attach/detach console iframe on addon enabled/disabled --- src/content/index.ts | 5 ----- .../operators/impls/AddonOperatorFactoryChain.ts | 14 ++++++++---- .../operators/impls/DisableAddonOperator.ts | 5 ++++- src/content/operators/impls/EnableAddonOperator.ts | 5 ++++- src/content/operators/impls/ToggleAddonOperator.ts | 15 +++++++++---- src/content/presenters/ConsoleFramePresenter.ts | 25 ++++++++++++++++++---- src/content/usecases/AddonEnabledUseCase.ts | 14 +++++++++--- .../impls/AddonOperatorFactoryChain.test.ts | 4 +++- .../operators/impls/DisableAddonOperator.test.ts | 5 ++++- .../operators/impls/EnableAddonOperator.test.ts | 5 ++++- .../operators/impls/MockConsoleFramePresenter.ts | 22 +++++++++++++++++++ .../operators/impls/ToggleAddonOperator.test.ts | 6 +++++- test/content/usecases/AddonEnabledUseCase.test.ts | 11 ++++++++-- 13 files changed, 108 insertions(+), 28 deletions(-) create mode 100644 test/content/operators/impls/MockConsoleFramePresenter.ts (limited to 'src/content') diff --git a/src/content/index.ts b/src/content/index.ts index 5252338..20dbbcc 100644 --- a/src/content/index.ts +++ b/src/content/index.ts @@ -3,15 +3,10 @@ import "reflect-metadata"; import Application from "./Application"; import Bootstrap from "./Bootstrap"; import consoleFrameStyle from "./site-style"; -import { ConsoleFramePresenterImpl } from "./presenters/ConsoleFramePresenter"; import { container } from "tsyringe"; import "./di"; const initDom = () => { - if (window.self === window.top) { - new ConsoleFramePresenterImpl().initialize(); - } - try { const app = container.resolve(Application); app.run(); diff --git a/src/content/operators/impls/AddonOperatorFactoryChain.ts b/src/content/operators/impls/AddonOperatorFactoryChain.ts index 54880c4..5e464e8 100644 --- a/src/content/operators/impls/AddonOperatorFactoryChain.ts +++ b/src/content/operators/impls/AddonOperatorFactoryChain.ts @@ -7,6 +7,7 @@ import Operator from "../Operator"; import EnableAddonOperator from "./EnableAddonOperator"; import DisableAddonOperator from "./DisableAddonOperator"; import ToggleAddonOperator from "./ToggleAddonOperator"; +import ConsoleFramePresenter from "../../presenters/ConsoleFramePresenter"; @injectable() export default class AddonOperatorFactoryChain implements OperatorFactoryChain { @@ -14,7 +15,9 @@ export default class AddonOperatorFactoryChain implements OperatorFactoryChain { @inject("AddonIndicatorClient") private readonly addonIndicatorClient: AddonIndicatorClient, @inject("AddonEnabledRepository") - private readonly addonEnabledRepository: AddonEnabledRepository + private readonly addonEnabledRepository: AddonEnabledRepository, + @inject("ConsoleFramePresenter") + private readonly consoleFramePresenter: ConsoleFramePresenter ) {} create(op: operations.Operation, _repeat: number): Operator | null { @@ -22,17 +25,20 @@ export default class AddonOperatorFactoryChain implements OperatorFactoryChain { case operations.ADDON_ENABLE: return new EnableAddonOperator( this.addonIndicatorClient, - this.addonEnabledRepository + this.addonEnabledRepository, + this.consoleFramePresenter ); case operations.ADDON_DISABLE: return new DisableAddonOperator( this.addonIndicatorClient, - this.addonEnabledRepository + this.addonEnabledRepository, + this.consoleFramePresenter ); case operations.ADDON_TOGGLE_ENABLED: return new ToggleAddonOperator( this.addonIndicatorClient, - this.addonEnabledRepository + this.addonEnabledRepository, + this.consoleFramePresenter ); } return null; diff --git a/src/content/operators/impls/DisableAddonOperator.ts b/src/content/operators/impls/DisableAddonOperator.ts index 28811fe..a92e04b 100644 --- a/src/content/operators/impls/DisableAddonOperator.ts +++ b/src/content/operators/impls/DisableAddonOperator.ts @@ -1,15 +1,18 @@ import Operator from "../Operator"; import AddonIndicatorClient from "../../client/AddonIndicatorClient"; import AddonEnabledRepository from "../../repositories/AddonEnabledRepository"; +import ConsoleFramePresenter from "../../presenters/ConsoleFramePresenter"; export default class DisableAddonOperator implements Operator { constructor( private readonly indicator: AddonIndicatorClient, - private readonly repository: AddonEnabledRepository + private readonly repository: AddonEnabledRepository, + private readonly consoleFramePresenter: ConsoleFramePresenter ) {} async run(): Promise { this.repository.set(false); + this.consoleFramePresenter.detach(); await this.indicator.setEnabled(false); } } diff --git a/src/content/operators/impls/EnableAddonOperator.ts b/src/content/operators/impls/EnableAddonOperator.ts index b5b1d79..fe2b771 100644 --- a/src/content/operators/impls/EnableAddonOperator.ts +++ b/src/content/operators/impls/EnableAddonOperator.ts @@ -1,15 +1,18 @@ import Operator from "../Operator"; import AddonIndicatorClient from "../../client/AddonIndicatorClient"; import AddonEnabledRepository from "../../repositories/AddonEnabledRepository"; +import ConsoleFramePresenter from "../../presenters/ConsoleFramePresenter"; export default class EnableAddonOperator implements Operator { constructor( private readonly indicator: AddonIndicatorClient, - private readonly repository: AddonEnabledRepository + private readonly repository: AddonEnabledRepository, + private readonly consoleFramePresenter: ConsoleFramePresenter ) {} async run(): Promise { this.repository.set(true); + this.consoleFramePresenter.attach(); await this.indicator.setEnabled(true); } } diff --git a/src/content/operators/impls/ToggleAddonOperator.ts b/src/content/operators/impls/ToggleAddonOperator.ts index 2a249d6..1019b8b 100644 --- a/src/content/operators/impls/ToggleAddonOperator.ts +++ b/src/content/operators/impls/ToggleAddonOperator.ts @@ -1,16 +1,23 @@ import Operator from "../Operator"; import AddonIndicatorClient from "../../client/AddonIndicatorClient"; import AddonEnabledRepository from "../../repositories/AddonEnabledRepository"; +import ConsoleFramePresenter from "../../presenters/ConsoleFramePresenter"; export default class ToggleAddonOperator implements Operator { constructor( private readonly indicator: AddonIndicatorClient, - private readonly repository: AddonEnabledRepository + private readonly repository: AddonEnabledRepository, + private readonly consoleFramePresenter: ConsoleFramePresenter ) {} async run(): Promise { - const current = this.repository.get(); - this.repository.set(!current); - await this.indicator.setEnabled(!current); + const enabled = !this.repository.get(); + this.repository.set(enabled); + if (enabled) { + this.consoleFramePresenter.attach(); + } else { + this.consoleFramePresenter.detach(); + } + await this.indicator.setEnabled(enabled); } } diff --git a/src/content/presenters/ConsoleFramePresenter.ts b/src/content/presenters/ConsoleFramePresenter.ts index ccc196b..9c4b3f1 100644 --- a/src/content/presenters/ConsoleFramePresenter.ts +++ b/src/content/presenters/ConsoleFramePresenter.ts @@ -1,5 +1,7 @@ export default interface ConsoleFramePresenter { - initialize(): void; + attach(): void; + + detach(): void; blur(): void; @@ -7,18 +9,33 @@ export default interface ConsoleFramePresenter { } export class ConsoleFramePresenterImpl implements ConsoleFramePresenter { - initialize(): void { + private static readonly IframeId = "vimvixen-console-frame" as const; + + attach(): void { + const ele = document.getElementById("vimvixen-console-frame"); + if (ele) { + return; + } + const iframe = document.createElement("iframe"); iframe.src = browser.runtime.getURL("build/console.html"); - iframe.id = "vimvixen-console-frame"; + iframe.id = ConsoleFramePresenterImpl.IframeId; iframe.className = "vimvixen-console-frame"; document.body.append(iframe); } + detach(): void { + const ele = document.getElementById(ConsoleFramePresenterImpl.IframeId); + if (!ele) { + return; + } + ele.remove(); + } + blur(): void { const ele = document.getElementById("vimvixen-console-frame"); if (!ele) { - throw new Error("console frame not created"); + return; } ele.blur(); } diff --git a/src/content/usecases/AddonEnabledUseCase.ts b/src/content/usecases/AddonEnabledUseCase.ts index f7e78c5..b45c47f 100644 --- a/src/content/usecases/AddonEnabledUseCase.ts +++ b/src/content/usecases/AddonEnabledUseCase.ts @@ -1,15 +1,17 @@ import { injectable, inject } from "tsyringe"; import AddonIndicatorClient from "../client/AddonIndicatorClient"; import AddonEnabledRepository from "../repositories/AddonEnabledRepository"; +import ConsoleFramePresenter from "../presenters/ConsoleFramePresenter"; @injectable() export default class AddonEnabledUseCase { constructor( @inject("AddonIndicatorClient") - private indicator: AddonIndicatorClient, - + private readonly indicator: AddonIndicatorClient, @inject("AddonEnabledRepository") - private repository: AddonEnabledRepository + private readonly repository: AddonEnabledRepository, + @inject("ConsoleFramePresenter") + private readonly consoleFramePresenter: ConsoleFramePresenter ) {} async enable(): Promise { @@ -31,6 +33,12 @@ export default class AddonEnabledUseCase { private async setEnabled(on: boolean): Promise { this.repository.set(on); + + if (on) { + this.consoleFramePresenter.attach(); + } else { + this.consoleFramePresenter.detach(); + } await this.indicator.setEnabled(on); } } diff --git a/test/content/operators/impls/AddonOperatorFactoryChain.test.ts b/test/content/operators/impls/AddonOperatorFactoryChain.test.ts index c064bb9..dde5a35 100644 --- a/test/content/operators/impls/AddonOperatorFactoryChain.test.ts +++ b/test/content/operators/impls/AddonOperatorFactoryChain.test.ts @@ -6,13 +6,15 @@ import * as operations from "../../../../src/shared/operations"; import { expect } from "chai"; import MockAddonIndicatorClient from "../../mock/MockAddonIndicatorClient"; import MockAddonEnabledRepository from "../../mock/MockAddonEnabledRepository"; +import MockConsoleFramePresenter from "./MockConsoleFramePresenter"; describe("AddonOperatorFactoryChain", () => { describe("#create", () => { it("returns an operator", () => { const sut = new AddonOperatorFactoryChain( new MockAddonIndicatorClient(), - new MockAddonEnabledRepository() + new MockAddonEnabledRepository(), + new MockConsoleFramePresenter(false) ); expect(sut.create({ type: operations.ADDON_ENABLE }, 0)).to.be.instanceOf( EnableAddonOperator diff --git a/test/content/operators/impls/DisableAddonOperator.test.ts b/test/content/operators/impls/DisableAddonOperator.test.ts index 358ae44..e05d1f1 100644 --- a/test/content/operators/impls/DisableAddonOperator.test.ts +++ b/test/content/operators/impls/DisableAddonOperator.test.ts @@ -2,18 +2,21 @@ import { expect } from "chai"; import DisableAddonOperator from "../../../../src/content/operators/impls/DisableAddonOperator"; import MockAddonIndicatorClient from "../../mock/MockAddonIndicatorClient"; import MockAddonEnabledRepository from "../../mock/MockAddonEnabledRepository"; +import MockConsoleFramePresenter from "./MockConsoleFramePresenter"; describe("DisableAddonOperator", () => { describe("#run", () => { it("disables addon", async () => { const client = new MockAddonIndicatorClient(true); const repository = new MockAddonEnabledRepository(true); - const sut = new DisableAddonOperator(client, repository); + const presenter = new MockConsoleFramePresenter(true); + const sut = new DisableAddonOperator(client, repository, presenter); await sut.run(); expect(client.enabled).to.be.false; expect(repository.enabled).to.be.false; + expect(presenter.attached).to.be.false; }); }); }); diff --git a/test/content/operators/impls/EnableAddonOperator.test.ts b/test/content/operators/impls/EnableAddonOperator.test.ts index a6ca31b..6025608 100644 --- a/test/content/operators/impls/EnableAddonOperator.test.ts +++ b/test/content/operators/impls/EnableAddonOperator.test.ts @@ -2,18 +2,21 @@ import { expect } from "chai"; import EnableAddonOperator from "../../../../src/content/operators/impls/EnableAddonOperator"; import MockAddonIndicatorClient from "../../mock/MockAddonIndicatorClient"; import MockAddonEnabledRepository from "../../mock/MockAddonEnabledRepository"; +import MockConsoleFramePresenter from "./MockConsoleFramePresenter"; describe("EnableAddonOperator", () => { describe("#run", () => { it("enabled addon", async () => { const client = new MockAddonIndicatorClient(false); const repository = new MockAddonEnabledRepository(false); - const sut = new EnableAddonOperator(client, repository); + const presenter = new MockConsoleFramePresenter(false); + const sut = new EnableAddonOperator(client, repository, presenter); await sut.run(); expect(client.enabled).to.be.true; expect(repository.enabled).to.be.true; + expect(presenter.attached).to.be.true; }); }); }); diff --git a/test/content/operators/impls/MockConsoleFramePresenter.ts b/test/content/operators/impls/MockConsoleFramePresenter.ts new file mode 100644 index 0000000..f8ac70b --- /dev/null +++ b/test/content/operators/impls/MockConsoleFramePresenter.ts @@ -0,0 +1,22 @@ +import ConsoleFramePresenter from "../../../../src/content/presenters/ConsoleFramePresenter"; + +export default class MockConsoleFramePresenter + implements ConsoleFramePresenter { + constructor(public attached: boolean) {} + + attach(): void { + this.attached = true; + } + + detach(): void { + this.attached = false; + } + + blur(): void { + throw new Error("not implemented"); + } + + resize(_width: number, _height: number): void { + throw new Error("not implemented"); + } +} diff --git a/test/content/operators/impls/ToggleAddonOperator.test.ts b/test/content/operators/impls/ToggleAddonOperator.test.ts index 6026eb1..1f291b5 100644 --- a/test/content/operators/impls/ToggleAddonOperator.test.ts +++ b/test/content/operators/impls/ToggleAddonOperator.test.ts @@ -2,23 +2,27 @@ import { expect } from "chai"; import ToggleAddonOperator from "../../../../src/content/operators/impls/ToggleAddonOperator"; import MockAddonIndicatorClient from "../../mock/MockAddonIndicatorClient"; import MockAddonEnabledRepository from "../../mock/MockAddonEnabledRepository"; +import MockConsoleFramePresenter from "./MockConsoleFramePresenter"; describe("ToggleAddonOperator", () => { describe("#run", () => { it("toggles addon-enabled state", async () => { const client = new MockAddonIndicatorClient(true); const repository = new MockAddonEnabledRepository(true); - const sut = new ToggleAddonOperator(client, repository); + const presenter = new MockConsoleFramePresenter(true); + const sut = new ToggleAddonOperator(client, repository, presenter); await sut.run(); expect(client.enabled).to.be.false; expect(repository.enabled).to.be.false; + expect(presenter.attached).to.be.false; await sut.run(); expect(client.enabled).to.be.true; expect(repository.enabled).to.be.true; + expect(presenter.attached).to.be.true; }); }); }); diff --git a/test/content/usecases/AddonEnabledUseCase.test.ts b/test/content/usecases/AddonEnabledUseCase.test.ts index 885da83..8a614c5 100644 --- a/test/content/usecases/AddonEnabledUseCase.test.ts +++ b/test/content/usecases/AddonEnabledUseCase.test.ts @@ -2,6 +2,7 @@ import AddonEnabledRepository from "../../../src/content/repositories/AddonEnabl import AddonEnabledUseCase from "../../../src/content/usecases/AddonEnabledUseCase"; import AddonIndicatorClient from "../../../src/content/client/AddonIndicatorClient"; import { expect } from "chai"; +import MockConsoleFramePresenter from "../operators/impls/MockConsoleFramePresenter"; class MockAddonEnabledRepository implements AddonEnabledRepository { private enabled: boolean; @@ -35,12 +36,14 @@ class MockAddonIndicatorClient implements AddonIndicatorClient { describe("AddonEnabledUseCase", () => { let repository: MockAddonEnabledRepository; let indicator: MockAddonIndicatorClient; + let presenter: MockConsoleFramePresenter; let sut: AddonEnabledUseCase; beforeEach(() => { - repository = new MockAddonEnabledRepository(true); + repository = new MockAddonEnabledRepository(false); indicator = new MockAddonIndicatorClient(false); - sut = new AddonEnabledUseCase(indicator, repository); + presenter = new MockConsoleFramePresenter(false); + sut = new AddonEnabledUseCase(indicator, repository, presenter); }); describe("#enable", () => { @@ -49,6 +52,7 @@ describe("AddonEnabledUseCase", () => { expect(repository.get()).to.be.true; expect(indicator.enabled).to.be.true; + expect(presenter.attached).to.be.true; }); }); @@ -58,6 +62,7 @@ describe("AddonEnabledUseCase", () => { expect(repository.get()).to.be.false; expect(indicator.enabled).to.be.false; + expect(presenter.attached).to.be.false; }); }); @@ -68,6 +73,7 @@ describe("AddonEnabledUseCase", () => { expect(repository.get()).to.be.false; expect(indicator.enabled).to.be.false; + expect(presenter.attached).to.be.false; repository.set(false); @@ -75,6 +81,7 @@ describe("AddonEnabledUseCase", () => { expect(repository.get()).to.be.true; expect(indicator.enabled).to.be.true; + expect(presenter.attached).to.be.true; }); }); -- cgit v1.2.3 From 8828d175d9754e7afedf1dbb0b7bda2824608b0a Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sat, 20 Mar 2021 11:51:08 +0900 Subject: Inject iframe on top window --- src/content/presenters/ConsoleFramePresenter.ts | 6 ++++++ src/content/usecases/AddonEnabledUseCase.ts | 10 ++++++---- test/content/operators/impls/MockConsoleFramePresenter.ts | 4 ++++ 3 files changed, 16 insertions(+), 4 deletions(-) (limited to 'src/content') diff --git a/src/content/presenters/ConsoleFramePresenter.ts b/src/content/presenters/ConsoleFramePresenter.ts index 9c4b3f1..0db58f0 100644 --- a/src/content/presenters/ConsoleFramePresenter.ts +++ b/src/content/presenters/ConsoleFramePresenter.ts @@ -6,6 +6,8 @@ export default interface ConsoleFramePresenter { blur(): void; resize(width: number, height: number): void; + + isTopWindow(): boolean; } export class ConsoleFramePresenterImpl implements ConsoleFramePresenter { @@ -47,4 +49,8 @@ export class ConsoleFramePresenterImpl implements ConsoleFramePresenter { } ele.style.height = `${height}px`; } + + isTopWindow(): boolean { + return window.top === window; + } } diff --git a/src/content/usecases/AddonEnabledUseCase.ts b/src/content/usecases/AddonEnabledUseCase.ts index b45c47f..f49fde5 100644 --- a/src/content/usecases/AddonEnabledUseCase.ts +++ b/src/content/usecases/AddonEnabledUseCase.ts @@ -34,10 +34,12 @@ export default class AddonEnabledUseCase { private async setEnabled(on: boolean): Promise { this.repository.set(on); - if (on) { - this.consoleFramePresenter.attach(); - } else { - this.consoleFramePresenter.detach(); + if (this.consoleFramePresenter.isTopWindow()) { + if (on) { + this.consoleFramePresenter.attach(); + } else { + this.consoleFramePresenter.detach(); + } } await this.indicator.setEnabled(on); } diff --git a/test/content/operators/impls/MockConsoleFramePresenter.ts b/test/content/operators/impls/MockConsoleFramePresenter.ts index f8ac70b..23bc27f 100644 --- a/test/content/operators/impls/MockConsoleFramePresenter.ts +++ b/test/content/operators/impls/MockConsoleFramePresenter.ts @@ -19,4 +19,8 @@ export default class MockConsoleFramePresenter resize(_width: number, _height: number): void { throw new Error("not implemented"); } + + isTopWindow(): boolean { + return true; + } } -- cgit v1.2.3 From 690c9c080a2a511a30d555a90e5005e06b750351 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 21 Mar 2021 16:54:34 +0900 Subject: change bootstrap order --- e2e/lib/Page.ts | 13 +++++++++++-- src/content/Application.ts | 8 ++++---- src/content/index.ts | 14 ++++++++------ 3 files changed, 23 insertions(+), 12 deletions(-) (limited to 'src/content') diff --git a/e2e/lib/Page.ts b/e2e/lib/Page.ts index 46d67b0..13bf70f 100644 --- a/e2e/lib/Page.ts +++ b/e2e/lib/Page.ts @@ -122,8 +122,17 @@ export default class Page { if (!topFrame) { return; } - await webdriver.wait(until.elementLocated(By.id("vimvixen-console-frame"))); - await webdriver.switchTo().frame(0); + // style tag is injected at end of add-on loading + await webdriver.wait(until.elementLocated(By.tagName("style"))); + + const iframe = await webdriver.findElements( + By.id("vimvixen-console-frame") + ); + if (iframe.length === 0) { + return; + } + + await webdriver.switchTo().frame(iframe[0]); await Page.waitForDocumentCompleted(webdriver); await webdriver.switchTo().parentFrame(); } diff --git a/src/content/Application.ts b/src/content/Application.ts index 7c8e588..b09edfa 100644 --- a/src/content/Application.ts +++ b/src/content/Application.ts @@ -36,12 +36,12 @@ export default class Application { private navigateController: NavigateController ) {} - run() { - this.routeCommonComponents(); + init(): Promise { this.routeFocusEvents(); if (window.self === window.top) { this.routeMasterComponents(); } + return this.routeCommonComponents(); } private routeMasterComponents() { @@ -76,7 +76,7 @@ export default class Application { }); } - private routeCommonComponents() { + private routeCommonComponents(): Promise { this.messageListener.onWebMessage((msg: Message) => { switch (msg.type) { case messages.FOLLOW_REQUEST_COUNT_TARGETS: @@ -117,7 +117,7 @@ export default class Application { inputDriver.onKey((key) => this.markKeyController.press(key)); inputDriver.onKey((key) => this.keymapController.press(key)); - this.settingController.initSettings(); + return this.settingController.initSettings(); } private routeFocusEvents() { diff --git a/src/content/index.ts b/src/content/index.ts index 20dbbcc..82f3a4c 100644 --- a/src/content/index.ts +++ b/src/content/index.ts @@ -7,12 +7,14 @@ import { container } from "tsyringe"; import "./di"; const initDom = () => { - try { - const app = container.resolve(Application); - app.run(); - } catch (e) { - console.error(e); - } + (async () => { + try { + const app = container.resolve(Application); + await app.init(); + } catch (e) { + console.error(e); + } + })(); const style = window.document.createElement("style"); style.textContent = consoleFrameStyle; -- cgit v1.2.3