// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. import * as frames from './frames'; import * as types from './types'; import * as injectedSource from './generated/injectedSource'; import * as cssSelectorEngineSource from './generated/cssSelectorEngineSource'; import * as xpathSelectorEngineSource from './generated/xpathSelectorEngineSource'; export interface ExecutionContextDelegate, ElementHandle extends types.ElementHandle, Response> { evaluate(context: ExecutionContext, returnByValue: boolean, pageFunction: string | Function, ...args: any[]): Promise; } export class ExecutionContext, ElementHandle extends types.ElementHandle, Response> { _delegate: ExecutionContextDelegate; private _frame: frames.Frame; private _injectedPromise: Promise | null = null; private _documentPromise: Promise | null = null; constructor(delegate: ExecutionContextDelegate, frame: frames.Frame | null) { this._delegate = delegate; this._frame = frame; } frame(): frames.Frame | null { return this._frame; } evaluate: types.Evaluate = (pageFunction, ...args) => { return this._delegate.evaluate(this, true /* returnByValue */, pageFunction, ...args); } evaluateHandle: types.EvaluateHandle = (pageFunction, ...args) => { return this._delegate.evaluate(this, false /* returnByValue */, pageFunction, ...args); } _injected(): Promise { if (!this._injectedPromise) { const engineSources = [cssSelectorEngineSource.source, xpathSelectorEngineSource.source]; const source = ` new (${injectedSource.source})([ ${engineSources.join(',\n')} ]) `; this._injectedPromise = this.evaluateHandle(source); } return this._injectedPromise; } _document(): Promise { if (!this._documentPromise) this._documentPromise = this.evaluateHandle('document').then(handle => handle.asElement()!); return this._documentPromise; } }