mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	chore: expose injectedScript.extend (#3784)
This commit is contained in:
		
							parent
							
								
									d6cd0224ab
								
							
						
					
					
						commit
						fea3ceb36c
					
				| @ -16,10 +16,8 @@ | |||||||
| 
 | 
 | ||||||
| import { BrowserContext } from '../server/browserContext'; | import { BrowserContext } from '../server/browserContext'; | ||||||
| import * as frames from '../server/frames'; | import * as frames from '../server/frames'; | ||||||
| import * as js from '../server/javascript'; |  | ||||||
| import { Page } from '../server/page'; | import { Page } from '../server/page'; | ||||||
| import { InstrumentingAgent } from '../server/instrumentation'; | import { InstrumentingAgent } from '../server/instrumentation'; | ||||||
| import type DebugScript from './injected/debugScript'; |  | ||||||
| import { Progress } from '../server/progress'; | import { Progress } from '../server/progress'; | ||||||
| import { isDebugMode } from '../utils/utils'; | import { isDebugMode } from '../utils/utils'; | ||||||
| import * as debugScriptSource from '../generated/debugScriptSource'; | import * as debugScriptSource from '../generated/debugScriptSource'; | ||||||
| @ -33,12 +31,7 @@ export class DebugController implements InstrumentingAgent { | |||||||
|       if ((mainContext as any)[debugScriptSymbol]) |       if ((mainContext as any)[debugScriptSymbol]) | ||||||
|         return; |         return; | ||||||
|       (mainContext as any)[debugScriptSymbol] = true; |       (mainContext as any)[debugScriptSymbol] = true; | ||||||
|       const objectId = await mainContext._delegate.rawEvaluate(`new (${debugScriptSource.source})()`); |       await mainContext.extendInjectedScript(debugScriptSource.source); | ||||||
|       const debugScript = new js.JSHandle(mainContext, 'object', objectId) as js.JSHandle<DebugScript>; |  | ||||||
|       const injectedScript = await mainContext.injectedScript(); |  | ||||||
|       await debugScript.evaluate((debugScript, injectedScript) => { |  | ||||||
|         debugScript.initialize(injectedScript, { console: true }); |  | ||||||
|       }, injectedScript); |  | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -19,9 +19,7 @@ import type InjectedScript from '../../server/injected/injectedScript'; | |||||||
| 
 | 
 | ||||||
| export default class DebugScript { | export default class DebugScript { | ||||||
|   consoleAPI: ConsoleAPI | undefined; |   consoleAPI: ConsoleAPI | undefined; | ||||||
| 
 |   constructor(injectedScript: InjectedScript) { | ||||||
|   initialize(injectedScript: InjectedScript, options: { console?: boolean }) { |  | ||||||
|     if (options.console) |  | ||||||
|     this.consoleAPI = new ConsoleAPI(injectedScript); |     this.consoleAPI = new ConsoleAPI(injectedScript); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -90,6 +90,13 @@ export class FrameExecutionContext extends js.ExecutionContext { | |||||||
|     return this._injectedScriptPromise; |     return this._injectedScriptPromise; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   async extendInjectedScript(source: string, params?: any) { | ||||||
|  |     const injectedScriptHandle = await this.injectedScript(); | ||||||
|  |     return injectedScriptHandle.evaluate((injectedScript, {source, params}) => { | ||||||
|  |       return injectedScript.extend(source, params); | ||||||
|  |     }, { source, params }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   async doSlowMo() { |   async doSlowMo() { | ||||||
|     return this.frame._page._doSlowMo(); |     return this.frame._page._doSlowMo(); | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ import { createCSSEngine } from './cssSelectorEngine'; | |||||||
| import { SelectorEngine, SelectorRoot } from './selectorEngine'; | import { SelectorEngine, SelectorRoot } from './selectorEngine'; | ||||||
| import { createTextSelector } from './textSelectorEngine'; | import { createTextSelector } from './textSelectorEngine'; | ||||||
| import { XPathEngine } from './xpathSelectorEngine'; | import { XPathEngine } from './xpathSelectorEngine'; | ||||||
| import { ParsedSelector } from '../common/selectorParser'; | import { ParsedSelector, parseSelector } from '../common/selectorParser'; | ||||||
| import { FatalDOMError } from '../common/domErrors'; | import { FatalDOMError } from '../common/domErrors'; | ||||||
| 
 | 
 | ||||||
| type Predicate<T> = (progress: InjectedScriptProgress, continuePolling: symbol) => T | symbol; | type Predicate<T> = (progress: InjectedScriptProgress, continuePolling: symbol) => T | symbol; | ||||||
| @ -63,6 +63,10 @@ export class InjectedScript { | |||||||
|       this.engines.set(name, engine); |       this.engines.set(name, engine); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   parseSelector(selector: string): ParsedSelector { | ||||||
|  |     return parseSelector(selector); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   querySelector(selector: ParsedSelector, root: Node): Element | undefined { |   querySelector(selector: ParsedSelector, root: Node): Element | undefined { | ||||||
|     if (!(root as any)['querySelector']) |     if (!(root as any)['querySelector']) | ||||||
|       throw new Error('Node is not queryable.'); |       throw new Error('Node is not queryable.'); | ||||||
| @ -108,6 +112,11 @@ export class InjectedScript { | |||||||
|     return candidates.filter(e => !!this._querySelectorRecursively(e, partial, 0)); |     return candidates.filter(e => !!this._querySelectorRecursively(e, partial, 0)); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   extend(source: string, params: any): any { | ||||||
|  |     const constrFunction = global.eval(source); | ||||||
|  |     return new constrFunction(this, params); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   isVisible(element: Element): boolean { |   isVisible(element: Element): boolean { | ||||||
|     // Note: this logic should be similar to waitForDisplayedAtStablePosition() to avoid surprises.
 |     // Note: this logic should be similar to waitForDisplayedAtStablePosition() to avoid surprises.
 | ||||||
|     if (!element.ownerDocument || !element.ownerDocument.defaultView) |     if (!element.ownerDocument || !element.ownerDocument.defaultView) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Pavel Feldman
						Pavel Feldman