diff --git a/src/btn.ts b/src/btn.ts index 4d3e162..6c07aa0 100644 --- a/src/btn.ts +++ b/src/btn.ts @@ -1,6 +1,6 @@ import { loadMscore, WebMscore } from './mscore' -import { useTimeout } from './utils' +import { useTimeout, windowOpen } from './utils' import i18n from './i18n' // @ts-ignore import btnListCss from './btn.css' @@ -128,7 +128,7 @@ export class BtnList { case BtnListMode.ExtWindow: { const div = this._commit() - const w = window.open('', undefined, 'resizable,width=230,height=270') + const w = windowOpen('', undefined, 'resizable,width=230,height=270') // eslint-disable-next-line no-unused-expressions w?.document.body.append(div) window.addEventListener('unload', () => w?.close()) @@ -156,7 +156,7 @@ export namespace BtnAction { export const openUrl = (url: UrlInput): BtnAction => { return process(async (): Promise => { - window.open(await normalizeUrlInput(url)) + windowOpen(await normalizeUrlInput(url)) }) } @@ -175,7 +175,7 @@ export namespace BtnAction { btn.onclick = null setText(i18n('PROCESSING')()) - const w = window.open('') as Window + const w = windowOpen('') as Window const txt = document.createTextNode(i18n('PROCESSING')()) w.document.body.append(txt) diff --git a/src/utils.ts b/src/utils.ts index 2665295..ad92874 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -32,6 +32,18 @@ export const useTimeout = async (promise: T | Promise, ms: number): Promi }) } +export const getSandboxWindow = (): Window => { + const iframe = document.createElement('iframe') + iframe.style.display = 'none' + document.body.append(iframe) + const w = iframe.contentWindow + return w as Window +} + +export const windowOpen: Window['open'] = (...args): Window | null => { + return getSandboxWindow().open(...args) +} + export const waitForDocumentLoaded = (): Promise => { if (document.readyState !== 'complete') { return new Promise(resolve => {