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 (!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) => { | ||||
|     const eventName = 'onmousemove' | ||||
|     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 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)) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue