Skip to content

Commit

Permalink
chore: expose internal api for extending injected script
Browse files Browse the repository at this point in the history
  • Loading branch information
pavelfeldman committed Sep 7, 2020
1 parent c83b2da commit 2225f12
Show file tree
Hide file tree
Showing 8 changed files with 41 additions and 14 deletions.
5 changes: 5 additions & 0 deletions src/client/frame.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
8 changes: 1 addition & 7 deletions src/debug/debugController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/dispatchers/frameDispatcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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))) };
}
}
11 changes: 11 additions & 0 deletions src/protocol/channels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -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 = {
Expand Down
8 changes: 8 additions & 0 deletions src/protocol/protocol.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1242,6 +1242,14 @@ Frame:
returns:
element: ElementHandle?

extendInjectedScript:
experimental: True
parameters:
source: string
arg: SerializedArgument
returns:
handle: JSHandle

events:

loadstate:
Expand Down
4 changes: 4 additions & 0 deletions src/protocol/validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
7 changes: 0 additions & 7 deletions src/server/dom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
8 changes: 8 additions & 0 deletions src/server/frames.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.evaluate((injectedScript, {source, arg}) => {
return injectedScript.extend(source, arg);
}, { source, arg });
}
}

class RerunnableTask {
Expand Down

0 comments on commit 2225f12

Please sign in to comment.