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/presenters/ConsoleFramePresenter.ts | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'src/content/presenters') 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(); } -- 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/presenters') 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