feat: global sandbox

This commit is contained in:
Xmader 2020-11-25 21:06:35 -05:00
parent aa7622e953
commit 1f132bdfbd
No known key found for this signature in database
GPG key ID: A20B97FB9EB730E4
4 changed files with 15 additions and 20 deletions

View file

@ -1,7 +1,7 @@
import { ScoreInfo } from './scoreinfo'
import { loadMscore, WebMscore } from './mscore'
import { useTimeout, windowOpen, console, _Element } from './utils'
import { useTimeout, windowOpen, console, attachShadow } from './utils'
import i18n from './i18n'
// @ts-ignore
import btnListCss from './btn.css'
@ -43,10 +43,6 @@ const cloneBtn = (btn: HTMLButtonElement) => {
return n
}
const attachShadow = (el: Element): ShadowRoot => {
return _Element.prototype.attachShadow.call(el, { mode: 'closed' }) as ShadowRoot
}
interface BtnOptions {
readonly name: string;
readonly action: BtnAction;

View file

@ -11,6 +11,6 @@
// @match https://musescore.com/*/*
// @license MIT
// @copyright Copyright (c) 2019-2020 Xmader
// @grant none
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==

View file

@ -47,21 +47,19 @@ export const useTimeout = async <T> (promise: T | Promise<T>, ms: number): Promi
})
}
export const getSandboxWindow = (): Window => {
if (typeof document === 'undefined') return {} as any as Window
const iframe = document.createElement('iframe')
iframe.style.display = 'none'
document.body.append(iframe)
const w = iframe.contentWindow
return w as Window
export const getUnsafeWindow = (): Window => {
// eslint-disable-next-line no-eval
return window.eval('window') as Window
}
export const sandboxWindow = getSandboxWindow()
export const console: Console = sandboxWindow['console']
export const _Element: typeof Element = sandboxWindow['Element']
export const console: Console = window.console // Object.is(window.console, unsafeWindow.console) == false
export const windowOpen: Window['open'] = (...args): Window | null => {
return sandboxWindow.open(...args)
return window.open(...args) // Object.is(window.open, unsafeWindow.open) == false
}
export const attachShadow = (el: Element): ShadowRoot => {
return Element.prototype.attachShadow.call(el, { mode: 'closed' }) as ShadowRoot
}
export const waitForDocumentLoaded = (): Promise<void> => {

View file

@ -2,7 +2,7 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { hookNative } from './anti-detection'
import { console } from './utils'
import { console, getUnsafeWindow } from './utils'
const CHUNK_PUSH_FN = /^function [^r]\(\w\){/
@ -86,9 +86,10 @@ export const [webpackGlobalOverride, onPackLoad] = (() => {
}
// hook `webpackJsonpmusescore.push` as soon as `webpackJsonpmusescore` is available
let jsonp = window['webpackJsonpmusescore']
const _w = getUnsafeWindow()
let jsonp = _w['webpackJsonpmusescore']
let hooked = false
Object.defineProperty(window, 'webpackJsonpmusescore', {
Object.defineProperty(_w, 'webpackJsonpmusescore', {
get () { return jsonp },
set (v: WebpackJson) {
jsonp = v