fix(debug): do not generate source urls for anonymous scripts (#3787)

This commit is contained in:
Pavel Feldman 2020-09-07 15:50:25 -07:00 committed by GitHub
parent c83b2da54f
commit 74f1a64e36
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 43 additions and 14 deletions

View file

@ -410,6 +410,11 @@ export class Frame extends ChannelOwner<channels.FrameChannel, channels.FrameIni
return (await this._channel.title()).value;
});
}
async _extendInjectedScript<Arg>(source: string, arg?: Arg): Promise<JSHandle> {
const result = await this._channel.extendInjectedScript({ source, arg: serializeArgument(arg) });
return JSHandle.from(result.handle);
}
}
export function verifyLoadState(name: string, waitUntil: LifecycleEvent): LifecycleEvent {

View file

@ -22,16 +22,10 @@ import { Progress } from '../server/progress';
import { isDebugMode } from '../utils/utils';
import * as debugScriptSource from '../generated/debugScriptSource';
const debugScriptSymbol = Symbol('debugScript');
export class DebugController implements InstrumentingAgent {
private async ensureInstalledInFrame(frame: frames.Frame) {
try {
const mainContext = await frame._mainContext();
if ((mainContext as any)[debugScriptSymbol])
return;
(mainContext as any)[debugScriptSymbol] = true;
await mainContext.extendInjectedScript(debugScriptSource.source);
await frame.extendInjectedScript(debugScriptSource.source);
} catch (e) {
}
}

View file

@ -20,6 +20,8 @@ import type InjectedScript from '../../server/injected/injectedScript';
export default class DebugScript {
consoleAPI: ConsoleAPI | undefined;
constructor(injectedScript: InjectedScript) {
if ((window as any).playwright)
return;
this.consoleAPI = new ConsoleAPI(injectedScript);
}
}

View file

@ -178,4 +178,8 @@ export class FrameDispatcher extends Dispatcher<Frame, channels.FrameInitializer
async title(): Promise<channels.FrameTitleResult> {
return { value: await this._frame.title() };
}
async extendInjectedScript(params: channels.FrameExtendInjectedScriptParams): Promise<channels.FrameExtendInjectedScriptResult> {
return { handle: createHandle(this._scope, await this._frame.extendInjectedScript(params.source, parseArgument(params.arg))) };
}
}

View file

@ -1111,6 +1111,7 @@ export interface FrameChannel extends Channel {
uncheck(params: FrameUncheckParams): Promise<FrameUncheckResult>;
waitForFunction(params: FrameWaitForFunctionParams): Promise<FrameWaitForFunctionResult>;
waitForSelector(params: FrameWaitForSelectorParams): Promise<FrameWaitForSelectorResult>;
extendInjectedScript(params: FrameExtendInjectedScriptParams): Promise<FrameExtendInjectedScriptResult>;
}
export type FrameLoadstateEvent = {
add?: 'load' | 'domcontentloaded' | 'networkidle',
@ -1510,6 +1511,16 @@ export type FrameWaitForSelectorOptions = {
export type FrameWaitForSelectorResult = {
element?: ElementHandleChannel,
};
export type FrameExtendInjectedScriptParams = {
source: string,
arg: SerializedArgument,
};
export type FrameExtendInjectedScriptOptions = {
};
export type FrameExtendInjectedScriptResult = {
handle: JSHandleChannel,
};
// ----------- Worker -----------
export type WorkerInitializer = {

View file

@ -1242,6 +1242,14 @@ Frame:
returns:
element: ElementHandle?
extendInjectedScript:
experimental: True
parameters:
source: string
arg: SerializedArgument
returns:
handle: JSHandle
events:
loadstate:

View file

@ -604,6 +604,10 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
timeout: tOptional(tNumber),
state: tOptional(tEnum(['attached', 'detached', 'visible', 'hidden'])),
});
scheme.FrameExtendInjectedScriptParams = tObject({
source: tString,
arg: tType('SerializedArgument'),
});
scheme.WorkerEvaluateExpressionParams = tObject({
expression: tString,
isFunction: tBoolean,

View file

@ -90,13 +90,6 @@ export class FrameExecutionContext extends js.ExecutionContext {
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() {
return this.frame._page._doSlowMo();
}

View file

@ -975,6 +975,14 @@ export class Frame extends EventEmitter {
clearTimeout(this._networkIdleTimer);
this._networkIdleTimer = undefined;
}
async extendInjectedScript(source: string, arg?: any): Promise<js.JSHandle> {
const mainContext = await this._mainContext();
const injectedScriptHandle = await mainContext.injectedScript();
return injectedScriptHandle.evaluateHandle((injectedScript, {source, arg}) => {
return injectedScript.extend(source, arg);
}, { source, arg });
}
}
class RerunnableTask {