diff --git a/packages/playwright-core/src/server/bidi/bidiExecutionContext.ts b/packages/playwright-core/src/server/bidi/bidiExecutionContext.ts index e4214fe2f5..18f5824b87 100644 --- a/packages/playwright-core/src/server/bidi/bidiExecutionContext.ts +++ b/packages/playwright-core/src/server/bidi/bidiExecutionContext.ts @@ -61,7 +61,7 @@ export class BidiExecutionContext implements js.ExecutionContextDelegate { throw new js.JavaScriptErrorInEvaluate('Unexpected response type: ' + JSON.stringify(response)); } - async rawEvaluateHandle(context: js.ExecutionContext, expression: string, handlePreview: string): Promise { + async rawEvaluateHandle(context: js.ExecutionContext, expression: string): Promise { const response = await this._session.send('script.evaluate', { expression, target: this._target, @@ -72,7 +72,7 @@ export class BidiExecutionContext implements js.ExecutionContextDelegate { }); if (response.type === 'success') { if ('handle' in response.result) - return createHandle(context, response.result, handlePreview); + return createHandle(context, response.result); throw new js.JavaScriptErrorInEvaluate('Cannot get handle: ' + JSON.stringify(response.result)); } if (response.type === 'exception') @@ -207,11 +207,11 @@ function remoteObjectValue(remoteObject: bidi.Script.RemoteValue): any { return undefined; } -export function createHandle(context: js.ExecutionContext, remoteObject: bidi.Script.RemoteValue, handlePreview?: string): js.JSHandle { +export function createHandle(context: js.ExecutionContext, remoteObject: bidi.Script.RemoteValue): js.JSHandle { if (remoteObject.type === 'node') { assert(context instanceof dom.FrameExecutionContext); return new dom.ElementHandle(context, remoteObject.handle!); } const objectId = 'handle' in remoteObject ? remoteObject.handle : undefined; - return new js.JSHandle(context, remoteObject.type, handlePreview ?? renderPreview(remoteObject), objectId, remoteObjectValue(remoteObject)); + return new js.JSHandle(context, remoteObject.type, renderPreview(remoteObject), objectId, remoteObjectValue(remoteObject)); } diff --git a/packages/playwright-core/src/server/chromium/crExecutionContext.ts b/packages/playwright-core/src/server/chromium/crExecutionContext.ts index 5d9e46b813..a085c48318 100644 --- a/packages/playwright-core/src/server/chromium/crExecutionContext.ts +++ b/packages/playwright-core/src/server/chromium/crExecutionContext.ts @@ -46,14 +46,14 @@ export class CRExecutionContext implements js.ExecutionContextDelegate { return remoteObject.value; } - async rawEvaluateHandle(context: js.ExecutionContext, expression: string, handlePreview: string): Promise { + async rawEvaluateHandle(context: js.ExecutionContext, expression: string): Promise { const { exceptionDetails, result: remoteObject } = await this._client.send('Runtime.evaluate', { expression, contextId: this._contextId, }).catch(rewriteError); if (exceptionDetails) throw new js.JavaScriptErrorInEvaluate(getExceptionMessage(exceptionDetails)); - return createHandle(context, remoteObject, handlePreview); + return createHandle(context, remoteObject); } async evaluateWithArguments(expression: string, returnByValue: boolean, utilityScript: js.JSHandle, values: any[], handles: js.JSHandle[]): Promise { @@ -131,10 +131,10 @@ function renderPreview(object: Protocol.Runtime.RemoteObject): string | undefine return object.description; } -export function createHandle(context: js.ExecutionContext, remoteObject: Protocol.Runtime.RemoteObject, handlePreview?: string): js.JSHandle { +export function createHandle(context: js.ExecutionContext, remoteObject: Protocol.Runtime.RemoteObject): js.JSHandle { if (remoteObject.subtype === 'node') { assert(context instanceof dom.FrameExecutionContext); return new dom.ElementHandle(context, remoteObject.objectId!); } - return new js.JSHandle(context, remoteObject.subtype || remoteObject.type, handlePreview ?? renderPreview(remoteObject), remoteObject.objectId, potentiallyUnserializableValue(remoteObject)); + return new js.JSHandle(context, remoteObject.subtype || remoteObject.type, renderPreview(remoteObject), remoteObject.objectId, potentiallyUnserializableValue(remoteObject)); } diff --git a/packages/playwright-core/src/server/dom.ts b/packages/playwright-core/src/server/dom.ts index 2049951267..fbea38b814 100644 --- a/packages/playwright-core/src/server/dom.ts +++ b/packages/playwright-core/src/server/dom.ts @@ -105,7 +105,11 @@ export class FrameExecutionContext extends js.ExecutionContext { ); })(); `; - this._injectedScriptPromise = this.rawEvaluateHandle(source, 'InjectedScript'); + this._injectedScriptPromise = this.rawEvaluateHandle(source) + .then(handle => { + handle._setPreview('InjectedScript'); + return handle; + }); } return this._injectedScriptPromise; } diff --git a/packages/playwright-core/src/server/firefox/ffExecutionContext.ts b/packages/playwright-core/src/server/firefox/ffExecutionContext.ts index 1af45c9a66..cf67d59d00 100644 --- a/packages/playwright-core/src/server/firefox/ffExecutionContext.ts +++ b/packages/playwright-core/src/server/firefox/ffExecutionContext.ts @@ -44,14 +44,14 @@ export class FFExecutionContext implements js.ExecutionContextDelegate { return payload.result!.value; } - async rawEvaluateHandle(context: js.ExecutionContext, expression: string, handlePreview: string): Promise { + async rawEvaluateHandle(context: js.ExecutionContext, expression: string): Promise { const payload = await this._session.send('Runtime.evaluate', { expression, returnByValue: false, executionContextId: this._executionContextId, }).catch(rewriteError); checkException(payload.exceptionDetails); - return createHandle(context, payload.result!, handlePreview); + return createHandle(context, payload.result!); } async evaluateWithArguments(expression: string, returnByValue: boolean, utilityScript: js.JSHandle, values: any[], handles: js.JSHandle[]): Promise { @@ -134,10 +134,10 @@ function renderPreview(object: Protocol.Runtime.RemoteObject): string | undefine return String(object.value); } -export function createHandle(context: js.ExecutionContext, remoteObject: Protocol.Runtime.RemoteObject, handlePreview?: string): js.JSHandle { +export function createHandle(context: js.ExecutionContext, remoteObject: Protocol.Runtime.RemoteObject): js.JSHandle { if (remoteObject.subtype === 'node') { assert(context instanceof dom.FrameExecutionContext); return new dom.ElementHandle(context, remoteObject.objectId!); } - return new js.JSHandle(context, remoteObject.subtype || remoteObject.type || '', handlePreview ?? renderPreview(remoteObject), remoteObject.objectId, potentiallyUnserializableValue(remoteObject)); + return new js.JSHandle(context, remoteObject.subtype || remoteObject.type || '', renderPreview(remoteObject), remoteObject.objectId, potentiallyUnserializableValue(remoteObject)); } diff --git a/packages/playwright-core/src/server/javascript.ts b/packages/playwright-core/src/server/javascript.ts index 52649a7fc2..974b2375ae 100644 --- a/packages/playwright-core/src/server/javascript.ts +++ b/packages/playwright-core/src/server/javascript.ts @@ -47,7 +47,7 @@ export type SmartHandle = T extends Node ? dom.ElementHandle : JSHandle export interface ExecutionContextDelegate { rawEvaluateJSON(expression: string): Promise; - rawEvaluateHandle(context: ExecutionContext, expression: string, handlePreview: string): Promise; + rawEvaluateHandle(context: ExecutionContext, expression: string): Promise; evaluateWithArguments(expression: string, returnByValue: boolean, utilityScript: JSHandle, values: any[], handles: JSHandle[]): Promise; getProperties(object: JSHandle): Promise>; releaseHandle(handle: JSHandle): Promise; @@ -77,8 +77,8 @@ export class ExecutionContext extends SdkObject { return this._raceAgainstContextDestroyed(this.delegate.rawEvaluateJSON(expression)); } - rawEvaluateHandle(expression: string, preview: string): Promise { - return this._raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, expression, preview)); + rawEvaluateHandle(expression: string): Promise { + return this._raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, expression)); } async evaluateWithArguments(expression: string, returnByValue: boolean, values: any[], handles: JSHandle[]): Promise { @@ -106,7 +106,11 @@ export class ExecutionContext extends SdkObject { ${utilityScriptSource.source} return new (module.exports.UtilityScript())(${isUnderTest()}); })();`; - this._utilityScriptPromise = this._raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, source, 'UtilityScript')); + this._utilityScriptPromise = this._raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, source)) + .then(handle => { + handle._setPreview('UtilityScript'); + return handle; + }); } return this._utilityScriptPromise; } diff --git a/packages/playwright-core/src/server/webkit/wkExecutionContext.ts b/packages/playwright-core/src/server/webkit/wkExecutionContext.ts index 24611a72a7..a3f519ee6c 100644 --- a/packages/playwright-core/src/server/webkit/wkExecutionContext.ts +++ b/packages/playwright-core/src/server/webkit/wkExecutionContext.ts @@ -48,7 +48,7 @@ export class WKExecutionContext implements js.ExecutionContextDelegate { } } - async rawEvaluateHandle(context: js.ExecutionContext, expression: string, handlePreview: string): Promise { + async rawEvaluateHandle(context: js.ExecutionContext, expression: string): Promise { try { const response = await this._session.send('Runtime.evaluate', { expression, @@ -57,7 +57,7 @@ export class WKExecutionContext implements js.ExecutionContextDelegate { }); if (response.wasThrown) throw new js.JavaScriptErrorInEvaluate(response.result.description); - return createHandle(context, response.result, handlePreview); + return createHandle(context, response.result); } catch (error) { throw rewriteError(error); } @@ -137,7 +137,7 @@ function renderPreview(object: Protocol.Runtime.RemoteObject): string | undefine return object.description; } -export function createHandle(context: js.ExecutionContext, remoteObject: Protocol.Runtime.RemoteObject, handlePreview?: string): js.JSHandle { +export function createHandle(context: js.ExecutionContext, remoteObject: Protocol.Runtime.RemoteObject): js.JSHandle { if (remoteObject.subtype === 'node') { assert(context instanceof dom.FrameExecutionContext); return new dom.ElementHandle(context as dom.FrameExecutionContext, remoteObject.objectId!);