feat: get sandbox window using ad iframes
This commit is contained in:
parent
1f62f47dc8
commit
01514f651b
1 changed files with 22 additions and 2 deletions
24
src/utils.ts
24
src/utils.ts
|
@ -47,9 +47,29 @@ export const useTimeout = async <T> (promise: T | Promise<T>, ms: number): Promi
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getSandboxWindowAsync = async (targetEl = document.documentElement): Promise<Window> => {
|
export const getSandboxWindowAsync = async (targetEl: Element | undefined = undefined): Promise<Window> => {
|
||||||
if (typeof document === 'undefined') return {} as any as Window
|
if (typeof document === 'undefined') return {} as any as Window
|
||||||
|
|
||||||
|
if (!targetEl) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
// You need ads in your pages, right?
|
||||||
|
const observer = new MutationObserver(() => {
|
||||||
|
for (let i = 0; i < window.frames.length; i++) {
|
||||||
|
// find iframe windows created by ads
|
||||||
|
const frame = frames[i]
|
||||||
|
try {
|
||||||
|
const href = frame.location.href
|
||||||
|
if (href === location.href || href === 'about:blank') {
|
||||||
|
resolve(frame)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} catch { }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
observer.observe(document.body, { subtree: true, childList: true })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const eventName = 'onmousemove'
|
const eventName = 'onmousemove'
|
||||||
const id = Math.random().toString()
|
const id = Math.random().toString()
|
||||||
|
@ -75,7 +95,7 @@ export const getUnsafeWindow = (): Window => {
|
||||||
|
|
||||||
export const console: Console = (window || global).console // Object.is(window.console, unsafeWindow.console) == false
|
export const console: Console = (window || global).console // Object.is(window.console, unsafeWindow.console) == false
|
||||||
|
|
||||||
export const windowOpenAsync = (targetEl = document.documentElement, ...args: Parameters<Window['open']>): Promise<Window | null> => {
|
export const windowOpenAsync = (targetEl: Element | undefined, ...args: Parameters<Window['open']>): Promise<Window | null> => {
|
||||||
return getSandboxWindowAsync(targetEl).then(w => w.open(...args))
|
return getSandboxWindowAsync(targetEl).then(w => w.open(...args))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue