From 6dd2f37e2e59154f0162a8fdca90ab88e4e8554c Mon Sep 17 00:00:00 2001 From: Xmader Date: Fri, 13 Nov 2020 15:55:41 -0500 Subject: [PATCH] fix: window.open --- src/btn.ts | 8 ++++---- src/utils.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) 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 => {