chore: move non-trivial types out of types.ts (#2680)
This commit is contained in:
parent
d0a6e1a64e
commit
fca514d74e
|
|
@ -22,7 +22,7 @@ export { Dialog } from './dialog';
|
||||||
export { Download } from './download';
|
export { Download } from './download';
|
||||||
export { ElementHandle } from './dom';
|
export { ElementHandle } from './dom';
|
||||||
export { FileChooser } from './fileChooser';
|
export { FileChooser } from './fileChooser';
|
||||||
export { Logger } from './types';
|
export { Logger } from './loggerSink';
|
||||||
export { TimeoutError } from './errors';
|
export { TimeoutError } from './errors';
|
||||||
export { Frame } from './frames';
|
export { Frame } from './frames';
|
||||||
export { Keyboard, Mouse } from './input';
|
export { Keyboard, Mouse } from './input';
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import { Loggers, Logger } from './logger';
|
||||||
import { EventEmitter } from 'events';
|
import { EventEmitter } from 'events';
|
||||||
import { ProgressController } from './progress';
|
import { ProgressController } from './progress';
|
||||||
import { DebugController } from './debug/debugController';
|
import { DebugController } from './debug/debugController';
|
||||||
|
import { LoggerSink } from './loggerSink';
|
||||||
|
|
||||||
type CommonContextOptions = {
|
type CommonContextOptions = {
|
||||||
viewport?: types.Size | null,
|
viewport?: types.Size | null,
|
||||||
|
|
@ -52,7 +53,7 @@ type CommonContextOptions = {
|
||||||
|
|
||||||
export type PersistentContextOptions = CommonContextOptions;
|
export type PersistentContextOptions = CommonContextOptions;
|
||||||
export type BrowserContextOptions = CommonContextOptions & {
|
export type BrowserContextOptions = CommonContextOptions & {
|
||||||
logger?: types.Logger,
|
logger?: LoggerSink,
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface BrowserContext {
|
export interface BrowserContext {
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import * as input from '../input';
|
import * as input from '../input';
|
||||||
|
import * as types from '../types';
|
||||||
import { CRSession } from './crConnection';
|
import { CRSession } from './crConnection';
|
||||||
|
|
||||||
function toModifiersMask(modifiers: Set<input.Modifier>): number {
|
function toModifiersMask(modifiers: Set<types.KeyboardModifier>): number {
|
||||||
let mask = 0;
|
let mask = 0;
|
||||||
if (modifiers.has('Alt'))
|
if (modifiers.has('Alt'))
|
||||||
mask |= 1;
|
mask |= 1;
|
||||||
|
|
@ -38,7 +39,7 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
||||||
this._client = client;
|
this._client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
async keydown(modifiers: Set<input.Modifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number, autoRepeat: boolean, text: string | undefined): Promise<void> {
|
async keydown(modifiers: Set<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number, autoRepeat: boolean, text: string | undefined): Promise<void> {
|
||||||
await this._client.send('Input.dispatchKeyEvent', {
|
await this._client.send('Input.dispatchKeyEvent', {
|
||||||
type: text ? 'keyDown' : 'rawKeyDown',
|
type: text ? 'keyDown' : 'rawKeyDown',
|
||||||
modifiers: toModifiersMask(modifiers),
|
modifiers: toModifiersMask(modifiers),
|
||||||
|
|
@ -53,7 +54,7 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async keyup(modifiers: Set<input.Modifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void> {
|
async keyup(modifiers: Set<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void> {
|
||||||
await this._client.send('Input.dispatchKeyEvent', {
|
await this._client.send('Input.dispatchKeyEvent', {
|
||||||
type: 'keyUp',
|
type: 'keyUp',
|
||||||
modifiers: toModifiersMask(modifiers),
|
modifiers: toModifiersMask(modifiers),
|
||||||
|
|
@ -76,7 +77,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
this._client = client;
|
this._client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
async move(x: number, y: number, button: input.Button | 'none', buttons: Set<input.Button>, modifiers: Set<input.Modifier>): Promise<void> {
|
async move(x: number, y: number, button: types.MouseButton | 'none', buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>): Promise<void> {
|
||||||
await this._client.send('Input.dispatchMouseEvent', {
|
await this._client.send('Input.dispatchMouseEvent', {
|
||||||
type: 'mouseMoved',
|
type: 'mouseMoved',
|
||||||
button,
|
button,
|
||||||
|
|
@ -86,7 +87,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async down(x: number, y: number, button: input.Button, buttons: Set<input.Button>, modifiers: Set<input.Modifier>, clickCount: number): Promise<void> {
|
async down(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void> {
|
||||||
await this._client.send('Input.dispatchMouseEvent', {
|
await this._client.send('Input.dispatchMouseEvent', {
|
||||||
type: 'mousePressed',
|
type: 'mousePressed',
|
||||||
button,
|
button,
|
||||||
|
|
@ -97,7 +98,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async up(x: number, y: number, button: input.Button, buttons: Set<input.Button>, modifiers: Set<input.Modifier>, clickCount: number): Promise<void> {
|
async up(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void> {
|
||||||
await this._client.send('Input.dispatchMouseEvent', {
|
await this._client.send('Input.dispatchMouseEvent', {
|
||||||
type: 'mouseReleased',
|
type: 'mouseReleased',
|
||||||
button,
|
button,
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
import { Writable } from 'stream';
|
import { Writable } from 'stream';
|
||||||
import { BrowserContextBase } from '../browserContext';
|
import { BrowserContextBase } from '../browserContext';
|
||||||
import * as dom from '../dom';
|
import * as types from '../types';
|
||||||
import { Events } from '../events';
|
import { Events } from '../events';
|
||||||
import * as frames from '../frames';
|
import * as frames from '../frames';
|
||||||
import { Page } from '../page';
|
import { Page } from '../page';
|
||||||
|
|
@ -109,12 +109,12 @@ export class RecorderController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function toClickOptions(action: actions.ClickAction): { method: 'click' | 'dblclick', options: dom.ClickOptions } {
|
export function toClickOptions(action: actions.ClickAction): { method: 'click' | 'dblclick', options: types.MouseClickOptions } {
|
||||||
let method: 'click' | 'dblclick' = 'click';
|
let method: 'click' | 'dblclick' = 'click';
|
||||||
if (action.clickCount === 2)
|
if (action.clickCount === 2)
|
||||||
method = 'dblclick';
|
method = 'dblclick';
|
||||||
const modifiers = toModifiers(action.modifiers);
|
const modifiers = toModifiers(action.modifiers);
|
||||||
const options: dom.ClickOptions = {};
|
const options: types.MouseClickOptions = {};
|
||||||
if (action.button !== 'left')
|
if (action.button !== 'left')
|
||||||
options.button = action.button;
|
options.button = action.button;
|
||||||
if (modifiers.length)
|
if (modifiers.length)
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Writable } from 'stream';
|
import { Writable } from 'stream';
|
||||||
import * as dom from '../dom';
|
import * as types from '../types';
|
||||||
import { Frame } from '../frames';
|
import { Frame } from '../frames';
|
||||||
import { formatColors, Formatter } from '../utils/formatter';
|
import { formatColors, Formatter } from '../utils/formatter';
|
||||||
import { Action, actionTitle, NavigationSignal, PopupSignal, Signal } from './recorderActions';
|
import { Action, actionTitle, NavigationSignal, PopupSignal, Signal } from './recorderActions';
|
||||||
|
|
@ -145,7 +145,7 @@ export class TerminalOutput {
|
||||||
if (action.clickCount === 2)
|
if (action.clickCount === 2)
|
||||||
method = 'dblclick';
|
method = 'dblclick';
|
||||||
const modifiers = toModifiers(action.modifiers);
|
const modifiers = toModifiers(action.modifiers);
|
||||||
const options: dom.ClickOptions = {};
|
const options: types.MouseClickOptions = {};
|
||||||
if (action.button !== 'left')
|
if (action.button !== 'left')
|
||||||
options.button = action.button;
|
options.button = action.button;
|
||||||
if (modifiers.length)
|
if (modifiers.length)
|
||||||
|
|
|
||||||
56
src/dom.ts
56
src/dom.ts
|
|
@ -23,7 +23,6 @@ import { assert, helper } from './helper';
|
||||||
import InjectedScript from './injected/injectedScript';
|
import InjectedScript from './injected/injectedScript';
|
||||||
import * as injectedScriptSource from './generated/injectedScriptSource';
|
import * as injectedScriptSource from './generated/injectedScriptSource';
|
||||||
import * as debugScriptSource from './generated/debugScriptSource';
|
import * as debugScriptSource from './generated/debugScriptSource';
|
||||||
import * as input from './input';
|
|
||||||
import * as js from './javascript';
|
import * as js from './javascript';
|
||||||
import { Page } from './page';
|
import { Page } from './page';
|
||||||
import { selectors } from './selectors';
|
import { selectors } from './selectors';
|
||||||
|
|
@ -31,15 +30,6 @@ import * as types from './types';
|
||||||
import { Progress, ProgressController } from './progress';
|
import { Progress, ProgressController } from './progress';
|
||||||
import DebugScript from './debug/injected/debugScript';
|
import DebugScript from './debug/injected/debugScript';
|
||||||
|
|
||||||
export type PointerActionOptions = {
|
|
||||||
modifiers?: input.Modifier[];
|
|
||||||
position?: types.Point;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type ClickOptions = PointerActionOptions & input.MouseClickOptions;
|
|
||||||
|
|
||||||
export type MultiClickOptions = PointerActionOptions & input.MouseMultiClickOptions;
|
|
||||||
|
|
||||||
export class FrameExecutionContext extends js.ExecutionContext {
|
export class FrameExecutionContext extends js.ExecutionContext {
|
||||||
readonly frame: frames.Frame;
|
readonly frame: frames.Frame;
|
||||||
private _injectedScriptPromise?: Promise<js.JSHandle>;
|
private _injectedScriptPromise?: Promise<js.JSHandle>;
|
||||||
|
|
@ -56,16 +46,16 @@ export class FrameExecutionContext extends js.ExecutionContext {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateInternal<R>(pageFunction: types.Func0<R>): Promise<R>;
|
async evaluateInternal<R>(pageFunction: js.Func0<R>): Promise<R>;
|
||||||
async evaluateInternal<Arg, R>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R>;
|
async evaluateInternal<Arg, R>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||||
async evaluateInternal(pageFunction: never, ...args: never[]): Promise<any> {
|
async evaluateInternal(pageFunction: never, ...args: never[]): Promise<any> {
|
||||||
return await this.frame._page._frameManager.waitForSignalsCreatedBy(null, false /* noWaitFor */, async () => {
|
return await this.frame._page._frameManager.waitForSignalsCreatedBy(null, false /* noWaitFor */, async () => {
|
||||||
return js.evaluate(this, true /* returnByValue */, pageFunction, ...args);
|
return js.evaluate(this, true /* returnByValue */, pageFunction, ...args);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateHandleInternal<R>(pageFunction: types.Func0<R>): Promise<types.SmartHandle<R>>;
|
async evaluateHandleInternal<R>(pageFunction: js.Func0<R>): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandleInternal<Arg, R>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
async evaluateHandleInternal<Arg, R>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandleInternal(pageFunction: never, ...args: never[]): Promise<any> {
|
async evaluateHandleInternal(pageFunction: never, ...args: never[]): Promise<any> {
|
||||||
return await this.frame._page._frameManager.waitForSignalsCreatedBy(null, false /* noWaitFor */, async () => {
|
return await this.frame._page._frameManager.waitForSignalsCreatedBy(null, false /* noWaitFor */, async () => {
|
||||||
return js.evaluate(this, false /* returnByValue */, pageFunction, ...args);
|
return js.evaluate(this, false /* returnByValue */, pageFunction, ...args);
|
||||||
|
|
@ -133,17 +123,17 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
async _evaluateInMain<R, Arg>(pageFunction: types.Func1<[js.JSHandle<InjectedScript>, ElementHandle<T>, Arg], R>, arg: Arg): Promise<R> {
|
async _evaluateInMain<R, Arg>(pageFunction: js.Func1<[js.JSHandle<InjectedScript>, ElementHandle<T>, Arg], R>, arg: Arg): Promise<R> {
|
||||||
const main = await this._context.frame._mainContext();
|
const main = await this._context.frame._mainContext();
|
||||||
return main.evaluateInternal(pageFunction, [await main.injectedScript(), this, arg]);
|
return main.evaluateInternal(pageFunction, [await main.injectedScript(), this, arg]);
|
||||||
}
|
}
|
||||||
|
|
||||||
async _evaluateInUtility<R, Arg>(pageFunction: types.Func1<[js.JSHandle<InjectedScript>, ElementHandle<T>, Arg], R>, arg: Arg): Promise<R> {
|
async _evaluateInUtility<R, Arg>(pageFunction: js.Func1<[js.JSHandle<InjectedScript>, ElementHandle<T>, Arg], R>, arg: Arg): Promise<R> {
|
||||||
const utility = await this._context.frame._utilityContext();
|
const utility = await this._context.frame._utilityContext();
|
||||||
return utility.evaluateInternal(pageFunction, [await utility.injectedScript(), this, arg]);
|
return utility.evaluateInternal(pageFunction, [await utility.injectedScript(), this, arg]);
|
||||||
}
|
}
|
||||||
|
|
||||||
async _evaluateHandleInUtility<R, Arg>(pageFunction: types.Func1<[js.JSHandle<InjectedScript>, ElementHandle<T>, Arg], R>, arg: Arg): Promise<js.JSHandle<R>> {
|
async _evaluateHandleInUtility<R, Arg>(pageFunction: js.Func1<[js.JSHandle<InjectedScript>, ElementHandle<T>, Arg], R>, arg: Arg): Promise<js.JSHandle<R>> {
|
||||||
const utility = await this._context.frame._utilityContext();
|
const utility = await this._context.frame._utilityContext();
|
||||||
return utility.evaluateHandleInternal(pageFunction, [await utility.injectedScript(), this, arg]);
|
return utility.evaluateHandleInternal(pageFunction, [await utility.injectedScript(), this, arg]);
|
||||||
}
|
}
|
||||||
|
|
@ -290,7 +280,7 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async _retryPointerAction(progress: Progress, action: (point: types.Point) => Promise<void>, options: PointerActionOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions): Promise<'notconnected' | 'done'> {
|
async _retryPointerAction(progress: Progress, action: (point: types.Point) => Promise<void>, options: types.PointerActionOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions): Promise<'notconnected' | 'done'> {
|
||||||
let first = true;
|
let first = true;
|
||||||
while (progress.isRunning()) {
|
while (progress.isRunning()) {
|
||||||
progress.logger.info(`${first ? 'attempting' : 'retrying'} ${progress.apiName} action`);
|
progress.logger.info(`${first ? 'attempting' : 'retrying'} ${progress.apiName} action`);
|
||||||
|
|
@ -321,7 +311,7 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
||||||
return 'done';
|
return 'done';
|
||||||
}
|
}
|
||||||
|
|
||||||
async _performPointerAction(progress: Progress, action: (point: types.Point) => Promise<void>, options: PointerActionOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions): Promise<'notvisible' | 'notconnected' | 'notinviewport' | 'nothittarget' | 'done'> {
|
async _performPointerAction(progress: Progress, action: (point: types.Point) => Promise<void>, options: types.PointerActionOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions): Promise<'notvisible' | 'notconnected' | 'notinviewport' | 'nothittarget' | 'done'> {
|
||||||
const { force = false, position } = options;
|
const { force = false, position } = options;
|
||||||
if (!force) {
|
if (!force) {
|
||||||
const result = await this._waitForDisplayedAtStablePositionAndEnabled(progress);
|
const result = await this._waitForDisplayedAtStablePositionAndEnabled(progress);
|
||||||
|
|
@ -363,7 +353,7 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
||||||
if ((options as any).__testHookBeforePointerAction)
|
if ((options as any).__testHookBeforePointerAction)
|
||||||
await (options as any).__testHookBeforePointerAction();
|
await (options as any).__testHookBeforePointerAction();
|
||||||
progress.throwIfAborted(); // Avoid action that has side-effects.
|
progress.throwIfAborted(); // Avoid action that has side-effects.
|
||||||
let restoreModifiers: input.Modifier[] | undefined;
|
let restoreModifiers: types.KeyboardModifier[] | undefined;
|
||||||
if (options && options.modifiers)
|
if (options && options.modifiers)
|
||||||
restoreModifiers = await this._page.keyboard._ensureModifiers(options.modifiers);
|
restoreModifiers = await this._page.keyboard._ensureModifiers(options.modifiers);
|
||||||
progress.logger.info(` performing ${progress.apiName} action`);
|
progress.logger.info(` performing ${progress.apiName} action`);
|
||||||
|
|
@ -380,33 +370,33 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
||||||
return 'done';
|
return 'done';
|
||||||
}
|
}
|
||||||
|
|
||||||
hover(options: PointerActionOptions & types.PointerActionWaitOptions = {}): Promise<void> {
|
hover(options: types.PointerActionOptions & types.PointerActionWaitOptions = {}): Promise<void> {
|
||||||
return this._runAbortableTask(async progress => {
|
return this._runAbortableTask(async progress => {
|
||||||
throwIfNotConnected(await this._hover(progress, options));
|
throwIfNotConnected(await this._hover(progress, options));
|
||||||
}, this._page._timeoutSettings.timeout(options), 'hover');
|
}, this._page._timeoutSettings.timeout(options), 'hover');
|
||||||
}
|
}
|
||||||
|
|
||||||
_hover(progress: Progress, options: PointerActionOptions & types.PointerActionWaitOptions): Promise<'notconnected' | 'done'> {
|
_hover(progress: Progress, options: types.PointerActionOptions & types.PointerActionWaitOptions): Promise<'notconnected' | 'done'> {
|
||||||
return this._retryPointerAction(progress, point => this._page.mouse.move(point.x, point.y), options);
|
return this._retryPointerAction(progress, point => this._page.mouse.move(point.x, point.y), options);
|
||||||
}
|
}
|
||||||
|
|
||||||
click(options: ClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<void> {
|
click(options: types.MouseClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<void> {
|
||||||
return this._runAbortableTask(async progress => {
|
return this._runAbortableTask(async progress => {
|
||||||
throwIfNotConnected(await this._click(progress, options));
|
throwIfNotConnected(await this._click(progress, options));
|
||||||
}, this._page._timeoutSettings.timeout(options), 'click');
|
}, this._page._timeoutSettings.timeout(options), 'click');
|
||||||
}
|
}
|
||||||
|
|
||||||
_click(progress: Progress, options: ClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions): Promise<'notconnected' | 'done'> {
|
_click(progress: Progress, options: types.MouseClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions): Promise<'notconnected' | 'done'> {
|
||||||
return this._retryPointerAction(progress, point => this._page.mouse.click(point.x, point.y, options), options);
|
return this._retryPointerAction(progress, point => this._page.mouse.click(point.x, point.y, options), options);
|
||||||
}
|
}
|
||||||
|
|
||||||
dblclick(options: MultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<void> {
|
dblclick(options: types.MouseMultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<void> {
|
||||||
return this._runAbortableTask(async progress => {
|
return this._runAbortableTask(async progress => {
|
||||||
throwIfNotConnected(await this._dblclick(progress, options));
|
throwIfNotConnected(await this._dblclick(progress, options));
|
||||||
}, this._page._timeoutSettings.timeout(options), 'dblclick');
|
}, this._page._timeoutSettings.timeout(options), 'dblclick');
|
||||||
}
|
}
|
||||||
|
|
||||||
_dblclick(progress: Progress, options: MultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions): Promise<'notconnected' | 'done'> {
|
_dblclick(progress: Progress, options: types.MouseMultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions): Promise<'notconnected' | 'done'> {
|
||||||
return this._retryPointerAction(progress, point => this._page.mouse.dblclick(point.x, point.y, options), options);
|
return this._retryPointerAction(progress, point => this._page.mouse.dblclick(point.x, point.y, options), options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -607,9 +597,9 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
||||||
return selectors._queryAll(this._context.frame, selector, this);
|
return selectors._queryAll(this._context.frame, selector, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
async $eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element, Arg, R>, arg: Arg): Promise<R>;
|
async $eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element, Arg, R>, arg: Arg): Promise<R>;
|
||||||
async $eval<R>(selector: string, pageFunction: types.FuncOn<Element, void, R>, arg?: any): Promise<R>;
|
async $eval<R>(selector: string, pageFunction: js.FuncOn<Element, void, R>, arg?: any): Promise<R>;
|
||||||
async $eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element, Arg, R>, arg: Arg): Promise<R> {
|
async $eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element, Arg, R>, arg: Arg): Promise<R> {
|
||||||
const handle = await selectors._query(this._context.frame, selector, this);
|
const handle = await selectors._query(this._context.frame, selector, this);
|
||||||
if (!handle)
|
if (!handle)
|
||||||
throw new Error(`Error: failed to find element matching selector "${selector}"`);
|
throw new Error(`Error: failed to find element matching selector "${selector}"`);
|
||||||
|
|
@ -618,9 +608,9 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
async $$eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R>;
|
async $$eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R>;
|
||||||
async $$eval<R>(selector: string, pageFunction: types.FuncOn<Element[], void, R>, arg?: any): Promise<R>;
|
async $$eval<R>(selector: string, pageFunction: js.FuncOn<Element[], void, R>, arg?: any): Promise<R>;
|
||||||
async $$eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R> {
|
async $$eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R> {
|
||||||
const arrayHandle = await selectors._queryArray(this._context.frame, selector, this);
|
const arrayHandle = await selectors._queryArray(this._context.frame, selector, this);
|
||||||
const result = await arrayHandle.evaluate(pageFunction, arg);
|
const result = await arrayHandle.evaluate(pageFunction, arg);
|
||||||
arrayHandle.dispose();
|
arrayHandle.dispose();
|
||||||
|
|
@ -686,7 +676,7 @@ export class InjectedScriptPollHandler<T> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async finishHandle(): Promise<types.SmartHandle<T>> {
|
async finishHandle(): Promise<js.SmartHandle<T>> {
|
||||||
try {
|
try {
|
||||||
const result = await this._poll!.evaluateHandle(poll => poll.result);
|
const result = await this._poll!.evaluateHandle(poll => poll.result);
|
||||||
await this._finishInternal();
|
await this._finishInternal();
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,11 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { FFSession } from './ffConnection';
|
|
||||||
import * as input from '../input';
|
import * as input from '../input';
|
||||||
|
import * as types from '../types';
|
||||||
|
import { FFSession } from './ffConnection';
|
||||||
|
|
||||||
function toModifiersMask(modifiers: Set<input.Modifier>): number {
|
function toModifiersMask(modifiers: Set<types.KeyboardModifier>): number {
|
||||||
let mask = 0;
|
let mask = 0;
|
||||||
if (modifiers.has('Alt'))
|
if (modifiers.has('Alt'))
|
||||||
mask |= 1;
|
mask |= 1;
|
||||||
|
|
@ -31,7 +32,7 @@ function toModifiersMask(modifiers: Set<input.Modifier>): number {
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
function toButtonNumber(button: input.Button): number {
|
function toButtonNumber(button: types.MouseButton): number {
|
||||||
if (button === 'left')
|
if (button === 'left')
|
||||||
return 0;
|
return 0;
|
||||||
if (button === 'middle')
|
if (button === 'middle')
|
||||||
|
|
@ -41,7 +42,7 @@ function toButtonNumber(button: input.Button): number {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function toButtonsMask(buttons: Set<input.Button>): number {
|
function toButtonsMask(buttons: Set<types.MouseButton>): number {
|
||||||
let mask = 0;
|
let mask = 0;
|
||||||
if (buttons.has('left'))
|
if (buttons.has('left'))
|
||||||
mask |= 1;
|
mask |= 1;
|
||||||
|
|
@ -59,7 +60,7 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
||||||
this._client = client;
|
this._client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
async keydown(modifiers: Set<input.Modifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number, autoRepeat: boolean, text: string | undefined): Promise<void> {
|
async keydown(modifiers: Set<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number, autoRepeat: boolean, text: string | undefined): Promise<void> {
|
||||||
if (code === 'MetaLeft')
|
if (code === 'MetaLeft')
|
||||||
code = 'OSLeft';
|
code = 'OSLeft';
|
||||||
if (code === 'MetaRight')
|
if (code === 'MetaRight')
|
||||||
|
|
@ -78,7 +79,7 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async keyup(modifiers: Set<input.Modifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void> {
|
async keyup(modifiers: Set<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void> {
|
||||||
if (code === 'MetaLeft')
|
if (code === 'MetaLeft')
|
||||||
code = 'OSLeft';
|
code = 'OSLeft';
|
||||||
if (code === 'MetaRight')
|
if (code === 'MetaRight')
|
||||||
|
|
@ -105,7 +106,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
this._client = client;
|
this._client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
async move(x: number, y: number, button: input.Button | 'none', buttons: Set<input.Button>, modifiers: Set<input.Modifier>): Promise<void> {
|
async move(x: number, y: number, button: types.MouseButton | 'none', buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>): Promise<void> {
|
||||||
await this._client.send('Page.dispatchMouseEvent', {
|
await this._client.send('Page.dispatchMouseEvent', {
|
||||||
type: 'mousemove',
|
type: 'mousemove',
|
||||||
button: 0,
|
button: 0,
|
||||||
|
|
@ -116,7 +117,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async down(x: number, y: number, button: input.Button, buttons: Set<input.Button>, modifiers: Set<input.Modifier>, clickCount: number): Promise<void> {
|
async down(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void> {
|
||||||
await this._client.send('Page.dispatchMouseEvent', {
|
await this._client.send('Page.dispatchMouseEvent', {
|
||||||
type: 'mousedown',
|
type: 'mousedown',
|
||||||
button: toButtonNumber(button),
|
button: toButtonNumber(button),
|
||||||
|
|
@ -128,7 +129,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async up(x: number, y: number, button: input.Button, buttons: Set<input.Button>, modifiers: Set<input.Modifier>, clickCount: number): Promise<void> {
|
async up(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void> {
|
||||||
await this._client.send('Page.dispatchMouseEvent', {
|
await this._client.send('Page.dispatchMouseEvent', {
|
||||||
type: 'mouseup',
|
type: 'mouseup',
|
||||||
button: toButtonNumber(button),
|
button: toButtonNumber(button),
|
||||||
|
|
|
||||||
|
|
@ -432,17 +432,17 @@ export class Frame {
|
||||||
return this._context('utility');
|
return this._context('utility');
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandle<R>(pageFunction: types.Func1<void, R>, arg?: any): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>> {
|
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>> {
|
||||||
assertMaxArguments(arguments.length, 2);
|
assertMaxArguments(arguments.length, 2);
|
||||||
const context = await this._mainContext();
|
const context = await this._mainContext();
|
||||||
return context.evaluateHandleInternal(pageFunction, arg);
|
return context.evaluateHandleInternal(pageFunction, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R>;
|
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||||
async evaluate<R>(pageFunction: types.Func1<void, R>, arg?: any): Promise<R>;
|
async evaluate<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<R>;
|
||||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R> {
|
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R> {
|
||||||
assertMaxArguments(arguments.length, 2);
|
assertMaxArguments(arguments.length, 2);
|
||||||
const context = await this._mainContext();
|
const context = await this._mainContext();
|
||||||
return context.evaluateInternal(pageFunction, arg);
|
return context.evaluateInternal(pageFunction, arg);
|
||||||
|
|
@ -488,9 +488,9 @@ export class Frame {
|
||||||
}, this._page._timeoutSettings.timeout(options), 'dispatchEvent');
|
}, this._page._timeoutSettings.timeout(options), 'dispatchEvent');
|
||||||
}
|
}
|
||||||
|
|
||||||
async $eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element, Arg, R>, arg: Arg): Promise<R>;
|
async $eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element, Arg, R>, arg: Arg): Promise<R>;
|
||||||
async $eval<R>(selector: string, pageFunction: types.FuncOn<Element, void, R>, arg?: any): Promise<R>;
|
async $eval<R>(selector: string, pageFunction: js.FuncOn<Element, void, R>, arg?: any): Promise<R>;
|
||||||
async $eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element, Arg, R>, arg: Arg): Promise<R> {
|
async $eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element, Arg, R>, arg: Arg): Promise<R> {
|
||||||
assertMaxArguments(arguments.length, 3);
|
assertMaxArguments(arguments.length, 3);
|
||||||
const handle = await this.$(selector);
|
const handle = await this.$(selector);
|
||||||
if (!handle)
|
if (!handle)
|
||||||
|
|
@ -500,9 +500,9 @@ export class Frame {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
async $$eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R>;
|
async $$eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R>;
|
||||||
async $$eval<R>(selector: string, pageFunction: types.FuncOn<Element[], void, R>, arg?: any): Promise<R>;
|
async $$eval<R>(selector: string, pageFunction: js.FuncOn<Element[], void, R>, arg?: any): Promise<R>;
|
||||||
async $$eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R> {
|
async $$eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R> {
|
||||||
assertMaxArguments(arguments.length, 3);
|
assertMaxArguments(arguments.length, 3);
|
||||||
const arrayHandle = await selectors._queryArray(this, selector);
|
const arrayHandle = await selectors._queryArray(this, selector);
|
||||||
const result = await arrayHandle.evaluate(pageFunction, arg);
|
const result = await arrayHandle.evaluate(pageFunction, arg);
|
||||||
|
|
@ -735,11 +735,11 @@ export class Frame {
|
||||||
}, this._page._timeoutSettings.timeout(options), apiName);
|
}, this._page._timeoutSettings.timeout(options), apiName);
|
||||||
}
|
}
|
||||||
|
|
||||||
async click(selector: string, options: dom.ClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}) {
|
async click(selector: string, options: types.MouseClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}) {
|
||||||
await this._retryWithSelectorIfNotConnected(selector, options, (progress, handle) => handle._click(progress, options), 'click');
|
await this._retryWithSelectorIfNotConnected(selector, options, (progress, handle) => handle._click(progress, options), 'click');
|
||||||
}
|
}
|
||||||
|
|
||||||
async dblclick(selector: string, options: dom.MultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}) {
|
async dblclick(selector: string, options: types.MouseMultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}) {
|
||||||
await this._retryWithSelectorIfNotConnected(selector, options, (progress, handle) => handle._dblclick(progress, options), 'dblclick');
|
await this._retryWithSelectorIfNotConnected(selector, options, (progress, handle) => handle._dblclick(progress, options), 'dblclick');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -767,7 +767,7 @@ export class Frame {
|
||||||
return await this._retryWithSelectorIfNotConnected(selector, options, (progress, handle) => handle.getAttribute(name), 'getAttribute');
|
return await this._retryWithSelectorIfNotConnected(selector, options, (progress, handle) => handle.getAttribute(name), 'getAttribute');
|
||||||
}
|
}
|
||||||
|
|
||||||
async hover(selector: string, options: dom.PointerActionOptions & types.PointerActionWaitOptions = {}) {
|
async hover(selector: string, options: types.PointerActionOptions & types.PointerActionWaitOptions = {}) {
|
||||||
await this._retryWithSelectorIfNotConnected(selector, options, (progress, handle) => handle._hover(progress, options), 'hover');
|
await this._retryWithSelectorIfNotConnected(selector, options, (progress, handle) => handle._hover(progress, options), 'hover');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -799,9 +799,9 @@ export class Frame {
|
||||||
await new Promise(fulfill => setTimeout(fulfill, timeout));
|
await new Promise(fulfill => setTimeout(fulfill, timeout));
|
||||||
}
|
}
|
||||||
|
|
||||||
async waitForFunction<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg, options?: types.WaitForFunctionOptions): Promise<types.SmartHandle<R>>;
|
async waitForFunction<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg, options?: types.WaitForFunctionOptions): Promise<js.SmartHandle<R>>;
|
||||||
async waitForFunction<R>(pageFunction: types.Func1<void, R>, arg?: any, options?: types.WaitForFunctionOptions): Promise<types.SmartHandle<R>>;
|
async waitForFunction<R>(pageFunction: js.Func1<void, R>, arg?: any, options?: types.WaitForFunctionOptions): Promise<js.SmartHandle<R>>;
|
||||||
async waitForFunction<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg, options: types.WaitForFunctionOptions = {}): Promise<types.SmartHandle<R>> {
|
async waitForFunction<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg, options: types.WaitForFunctionOptions = {}): Promise<js.SmartHandle<R>> {
|
||||||
const { polling = 'raf' } = options;
|
const { polling = 'raf' } = options;
|
||||||
if (helper.isString(polling))
|
if (helper.isString(polling))
|
||||||
assert(polling === 'raf', 'Unknown polling option: ' + polling);
|
assert(polling === 'raf', 'Unknown polling option: ' + polling);
|
||||||
|
|
@ -839,7 +839,7 @@ export class Frame {
|
||||||
this._parentFrame = null;
|
this._parentFrame = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _scheduleRerunnableTask<T>(progress: Progress, contextType: ContextType, task: SchedulableTask<T>): Promise<types.SmartHandle<T>> {
|
private _scheduleRerunnableTask<T>(progress: Progress, contextType: ContextType, task: SchedulableTask<T>): Promise<js.SmartHandle<T>> {
|
||||||
const data = this._contextData.get(contextType)!;
|
const data = this._contextData.get(contextType)!;
|
||||||
const rerunnableTask = new RerunnableTask(data, progress, task);
|
const rerunnableTask = new RerunnableTask(data, progress, task);
|
||||||
if (data.context)
|
if (data.context)
|
||||||
|
|
@ -895,9 +895,9 @@ export class Frame {
|
||||||
export type SchedulableTask<T> = (context: dom.FrameExecutionContext) => Promise<js.JSHandle<types.InjectedScriptPoll<T>>>;
|
export type SchedulableTask<T> = (context: dom.FrameExecutionContext) => Promise<js.JSHandle<types.InjectedScriptPoll<T>>>;
|
||||||
|
|
||||||
class RerunnableTask<T> {
|
class RerunnableTask<T> {
|
||||||
readonly promise: Promise<types.SmartHandle<T>>;
|
readonly promise: Promise<js.SmartHandle<T>>;
|
||||||
private _task: SchedulableTask<T>;
|
private _task: SchedulableTask<T>;
|
||||||
private _resolve: (result: types.SmartHandle<T>) => void = () => {};
|
private _resolve: (result: js.SmartHandle<T>) => void = () => {};
|
||||||
private _reject: (reason: Error) => void = () => {};
|
private _reject: (reason: Error) => void = () => {};
|
||||||
private _progress: Progress;
|
private _progress: Progress;
|
||||||
|
|
||||||
|
|
@ -905,7 +905,7 @@ class RerunnableTask<T> {
|
||||||
this._task = task;
|
this._task = task;
|
||||||
this._progress = progress;
|
this._progress = progress;
|
||||||
data.rerunnableTasks.add(this);
|
data.rerunnableTasks.add(this);
|
||||||
this.promise = new Promise<types.SmartHandle<T>>((resolve, reject) => {
|
this.promise = new Promise<js.SmartHandle<T>>((resolve, reject) => {
|
||||||
// The task is either resolved with a value, or rejected with a meaningful evaluation error.
|
// The task is either resolved with a value, or rejected with a meaningful evaluation error.
|
||||||
this._resolve = resolve;
|
this._resolve = resolve;
|
||||||
this._reject = reject;
|
this._reject = reject;
|
||||||
|
|
|
||||||
55
src/input.ts
55
src/input.ts
|
|
@ -16,20 +16,7 @@
|
||||||
|
|
||||||
import { assert } from './helper';
|
import { assert } from './helper';
|
||||||
import * as keyboardLayout from './usKeyboardLayout';
|
import * as keyboardLayout from './usKeyboardLayout';
|
||||||
|
import * as types from './types';
|
||||||
export type Modifier = 'Alt' | 'Control' | 'Meta' | 'Shift';
|
|
||||||
export type Button = 'left' | 'right' | 'middle';
|
|
||||||
|
|
||||||
export type MouseClickOptions = {
|
|
||||||
delay?: number;
|
|
||||||
button?: Button;
|
|
||||||
clickCount?: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type MouseMultiClickOptions = {
|
|
||||||
delay?: number;
|
|
||||||
button?: Button;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const keypadLocation = keyboardLayout.keypadLocation;
|
export const keypadLocation = keyboardLayout.keypadLocation;
|
||||||
|
|
||||||
|
|
@ -43,17 +30,17 @@ type KeyDescription = {
|
||||||
shifted?: KeyDescription;
|
shifted?: KeyDescription;
|
||||||
};
|
};
|
||||||
|
|
||||||
const kModifiers: Modifier[] = ['Alt', 'Control', 'Meta', 'Shift'];
|
const kModifiers: types.KeyboardModifier[] = ['Alt', 'Control', 'Meta', 'Shift'];
|
||||||
|
|
||||||
export interface RawKeyboard {
|
export interface RawKeyboard {
|
||||||
keydown(modifiers: Set<Modifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number, autoRepeat: boolean, text: string | undefined): Promise<void>;
|
keydown(modifiers: Set<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number, autoRepeat: boolean, text: string | undefined): Promise<void>;
|
||||||
keyup(modifiers: Set<Modifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void>;
|
keyup(modifiers: Set<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void>;
|
||||||
sendText(text: string): Promise<void>;
|
sendText(text: string): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Keyboard {
|
export class Keyboard {
|
||||||
private _raw: RawKeyboard;
|
private _raw: RawKeyboard;
|
||||||
private _pressedModifiers = new Set<Modifier>();
|
private _pressedModifiers = new Set<types.KeyboardModifier>();
|
||||||
private _pressedKeys = new Set<string>();
|
private _pressedKeys = new Set<string>();
|
||||||
|
|
||||||
constructor(raw: RawKeyboard) {
|
constructor(raw: RawKeyboard) {
|
||||||
|
|
@ -64,8 +51,8 @@ export class Keyboard {
|
||||||
const description = this._keyDescriptionForString(key);
|
const description = this._keyDescriptionForString(key);
|
||||||
const autoRepeat = this._pressedKeys.has(description.code);
|
const autoRepeat = this._pressedKeys.has(description.code);
|
||||||
this._pressedKeys.add(description.code);
|
this._pressedKeys.add(description.code);
|
||||||
if (kModifiers.includes(description.key as Modifier))
|
if (kModifiers.includes(description.key as types.KeyboardModifier))
|
||||||
this._pressedModifiers.add(description.key as Modifier);
|
this._pressedModifiers.add(description.key as types.KeyboardModifier);
|
||||||
const text = description.text;
|
const text = description.text;
|
||||||
await this._raw.keydown(this._pressedModifiers, description.code, description.keyCode, description.keyCodeWithoutLocation, description.key, description.location, autoRepeat, text);
|
await this._raw.keydown(this._pressedModifiers, description.code, description.keyCode, description.keyCodeWithoutLocation, description.key, description.location, autoRepeat, text);
|
||||||
}
|
}
|
||||||
|
|
@ -84,8 +71,8 @@ export class Keyboard {
|
||||||
|
|
||||||
async up(key: string) {
|
async up(key: string) {
|
||||||
const description = this._keyDescriptionForString(key);
|
const description = this._keyDescriptionForString(key);
|
||||||
if (kModifiers.includes(description.key as Modifier))
|
if (kModifiers.includes(description.key as types.KeyboardModifier))
|
||||||
this._pressedModifiers.delete(description.key as Modifier);
|
this._pressedModifiers.delete(description.key as types.KeyboardModifier);
|
||||||
this._pressedKeys.delete(description.code);
|
this._pressedKeys.delete(description.code);
|
||||||
await this._raw.keyup(this._pressedModifiers, description.code, description.keyCode, description.keyCodeWithoutLocation, description.key, description.location);
|
await this._raw.keyup(this._pressedModifiers, description.code, description.keyCode, description.keyCodeWithoutLocation, description.key, description.location);
|
||||||
}
|
}
|
||||||
|
|
@ -135,12 +122,12 @@ export class Keyboard {
|
||||||
await this.up(tokens[i]);
|
await this.up(tokens[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
async _ensureModifiers(modifiers: Modifier[]): Promise<Modifier[]> {
|
async _ensureModifiers(modifiers: types.KeyboardModifier[]): Promise<types.KeyboardModifier[]> {
|
||||||
for (const modifier of modifiers) {
|
for (const modifier of modifiers) {
|
||||||
if (!kModifiers.includes(modifier))
|
if (!kModifiers.includes(modifier))
|
||||||
throw new Error('Unknown modifier ' + modifier);
|
throw new Error('Unknown modifier ' + modifier);
|
||||||
}
|
}
|
||||||
const restore: Modifier[] = Array.from(this._pressedModifiers);
|
const restore: types.KeyboardModifier[] = Array.from(this._pressedModifiers);
|
||||||
const promises: Promise<void>[] = [];
|
const promises: Promise<void>[] = [];
|
||||||
for (const key of kModifiers) {
|
for (const key of kModifiers) {
|
||||||
const needDown = modifiers.includes(key);
|
const needDown = modifiers.includes(key);
|
||||||
|
|
@ -154,15 +141,15 @@ export class Keyboard {
|
||||||
return restore;
|
return restore;
|
||||||
}
|
}
|
||||||
|
|
||||||
_modifiers(): Set<Modifier> {
|
_modifiers(): Set<types.KeyboardModifier> {
|
||||||
return this._pressedModifiers;
|
return this._pressedModifiers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface RawMouse {
|
export interface RawMouse {
|
||||||
move(x: number, y: number, button: Button | 'none', buttons: Set<Button>, modifiers: Set<Modifier>): Promise<void>;
|
move(x: number, y: number, button: types.MouseButton | 'none', buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>): Promise<void>;
|
||||||
down(x: number, y: number, button: Button, buttons: Set<Button>, modifiers: Set<Modifier>, clickCount: number): Promise<void>;
|
down(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void>;
|
||||||
up(x: number, y: number, button: Button, buttons: Set<Button>, modifiers: Set<Modifier>, clickCount: number): Promise<void>;
|
up(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Mouse {
|
export class Mouse {
|
||||||
|
|
@ -170,8 +157,8 @@ export class Mouse {
|
||||||
private _keyboard: Keyboard;
|
private _keyboard: Keyboard;
|
||||||
private _x = 0;
|
private _x = 0;
|
||||||
private _y = 0;
|
private _y = 0;
|
||||||
private _lastButton: 'none' | Button = 'none';
|
private _lastButton: 'none' | types.MouseButton = 'none';
|
||||||
private _buttons = new Set<Button>();
|
private _buttons = new Set<types.MouseButton>();
|
||||||
|
|
||||||
constructor(raw: RawMouse, keyboard: Keyboard) {
|
constructor(raw: RawMouse, keyboard: Keyboard) {
|
||||||
this._raw = raw;
|
this._raw = raw;
|
||||||
|
|
@ -191,21 +178,21 @@ export class Mouse {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async down(options: { button?: Button, clickCount?: number } = {}) {
|
async down(options: { button?: types.MouseButton, clickCount?: number } = {}) {
|
||||||
const { button = 'left', clickCount = 1 } = options;
|
const { button = 'left', clickCount = 1 } = options;
|
||||||
this._lastButton = button;
|
this._lastButton = button;
|
||||||
this._buttons.add(button);
|
this._buttons.add(button);
|
||||||
await this._raw.down(this._x, this._y, this._lastButton, this._buttons, this._keyboard._modifiers(), clickCount);
|
await this._raw.down(this._x, this._y, this._lastButton, this._buttons, this._keyboard._modifiers(), clickCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
async up(options: { button?: Button, clickCount?: number } = {}) {
|
async up(options: { button?: types.MouseButton, clickCount?: number } = {}) {
|
||||||
const { button = 'left', clickCount = 1 } = options;
|
const { button = 'left', clickCount = 1 } = options;
|
||||||
this._lastButton = 'none';
|
this._lastButton = 'none';
|
||||||
this._buttons.delete(button);
|
this._buttons.delete(button);
|
||||||
await this._raw.up(this._x, this._y, button, this._buttons, this._keyboard._modifiers(), clickCount);
|
await this._raw.up(this._x, this._y, button, this._buttons, this._keyboard._modifiers(), clickCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
async click(x: number, y: number, options: MouseClickOptions = {}) {
|
async click(x: number, y: number, options: { delay?: number, button?: types.MouseButton, clickCount?: number } = {}) {
|
||||||
const { delay = null, clickCount = 1 } = options;
|
const { delay = null, clickCount = 1 } = options;
|
||||||
if (delay) {
|
if (delay) {
|
||||||
this.move(x, y);
|
this.move(x, y);
|
||||||
|
|
@ -227,7 +214,7 @@ export class Mouse {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async dblclick(x: number, y: number, options: MouseMultiClickOptions = {}) {
|
async dblclick(x: number, y: number, options: { delay?: number, button?: types.MouseButton } = {}) {
|
||||||
await this.click(x, y, { ...options, clickCount: 2 });
|
await this.click(x, y, { ...options, clickCount: 2 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import * as types from './types';
|
|
||||||
import * as dom from './dom';
|
import * as dom from './dom';
|
||||||
import * as utilityScriptSource from './generated/utilityScriptSource';
|
import * as utilityScriptSource from './generated/utilityScriptSource';
|
||||||
import * as sourceMap from './utils/sourceMap';
|
import * as sourceMap from './utils/sourceMap';
|
||||||
|
|
@ -28,6 +27,22 @@ export type RemoteObject = {
|
||||||
value?: any
|
value?: any
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type NoHandles<Arg> = Arg extends JSHandle ? never : (Arg extends object ? { [Key in keyof Arg]: NoHandles<Arg[Key]> } : Arg);
|
||||||
|
type Unboxed<Arg> =
|
||||||
|
Arg extends dom.ElementHandle<infer T> ? T :
|
||||||
|
Arg extends JSHandle<infer T> ? T :
|
||||||
|
Arg extends NoHandles<Arg> ? Arg :
|
||||||
|
Arg extends [infer A0] ? [Unboxed<A0>] :
|
||||||
|
Arg extends [infer A0, infer A1] ? [Unboxed<A0>, Unboxed<A1>] :
|
||||||
|
Arg extends [infer A0, infer A1, infer A2] ? [Unboxed<A0>, Unboxed<A1>, Unboxed<A2>] :
|
||||||
|
Arg extends Array<infer T> ? Array<Unboxed<T>> :
|
||||||
|
Arg extends object ? { [Key in keyof Arg]: Unboxed<Arg[Key]> } :
|
||||||
|
Arg;
|
||||||
|
export type Func0<R> = string | (() => R | Promise<R>);
|
||||||
|
export type Func1<Arg, R> = string | ((arg: Unboxed<Arg>) => R | Promise<R>);
|
||||||
|
export type FuncOn<On, Arg2, R> = string | ((on: On, arg2: Unboxed<Arg2>) => R | Promise<R>);
|
||||||
|
export type SmartHandle<T> = T extends Node ? dom.ElementHandle<T> : JSHandle<T>;
|
||||||
|
|
||||||
export interface ExecutionContextDelegate {
|
export interface ExecutionContextDelegate {
|
||||||
rawEvaluate(expression: string): Promise<ObjectId>;
|
rawEvaluate(expression: string): Promise<ObjectId>;
|
||||||
evaluateWithArguments(expression: string, returnByValue: boolean, utilityScript: JSHandle<any>, values: any[], objectIds: ObjectId[]): Promise<any>;
|
evaluateWithArguments(expression: string, returnByValue: boolean, utilityScript: JSHandle<any>, values: any[], objectIds: ObjectId[]): Promise<any>;
|
||||||
|
|
@ -79,15 +94,15 @@ export class JSHandle<T = any> {
|
||||||
this._preview = 'JSHandle@' + String(this._objectId ? this._objectType : this._value);
|
this._preview = 'JSHandle@' + String(this._objectId ? this._objectType : this._value);
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluate<R, Arg>(pageFunction: types.FuncOn<T, Arg, R>, arg: Arg): Promise<R>;
|
async evaluate<R, Arg>(pageFunction: FuncOn<T, Arg, R>, arg: Arg): Promise<R>;
|
||||||
async evaluate<R>(pageFunction: types.FuncOn<T, void, R>, arg?: any): Promise<R>;
|
async evaluate<R>(pageFunction: FuncOn<T, void, R>, arg?: any): Promise<R>;
|
||||||
async evaluate<R, Arg>(pageFunction: types.FuncOn<T, Arg, R>, arg: Arg): Promise<R> {
|
async evaluate<R, Arg>(pageFunction: FuncOn<T, Arg, R>, arg: Arg): Promise<R> {
|
||||||
return evaluate(this._context, true /* returnByValue */, pageFunction, this, arg);
|
return evaluate(this._context, true /* returnByValue */, pageFunction, this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.FuncOn<T, Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R, Arg>(pageFunction: FuncOn<T, Arg, R>, arg: Arg): Promise<SmartHandle<R>>;
|
||||||
async evaluateHandle<R>(pageFunction: types.FuncOn<T, void, R>, arg?: any): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R>(pageFunction: FuncOn<T, void, R>, arg?: any): Promise<SmartHandle<R>>;
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.FuncOn<T, Arg, R>, arg: Arg): Promise<types.SmartHandle<R>> {
|
async evaluateHandle<R, Arg>(pageFunction: FuncOn<T, Arg, R>, arg: Arg): Promise<SmartHandle<R>> {
|
||||||
return evaluate(this._context, false /* returnByValue */, pageFunction, this, arg);
|
return evaluate(this._context, false /* returnByValue */, pageFunction, this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
import * as debug from 'debug';
|
import * as debug from 'debug';
|
||||||
import { helper } from './helper';
|
import { helper } from './helper';
|
||||||
import { Logger as LoggerSink, LoggerSeverity } from './types';
|
import { LoggerSink, LoggerSeverity } from './loggerSink';
|
||||||
|
|
||||||
export function logError(logger: Logger): (error: Error) => void {
|
export function logError(logger: Logger): (error: Error) => void {
|
||||||
return error => logger.error(error);
|
return error => logger.error(error);
|
||||||
|
|
|
||||||
25
src/loggerSink.ts
Normal file
25
src/loggerSink.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
/**
|
||||||
|
* Copyright Microsoft Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type LoggerSeverity = 'verbose' | 'info' | 'warning' | 'error';
|
||||||
|
|
||||||
|
export interface LoggerSink {
|
||||||
|
isEnabled(name: string, severity: LoggerSeverity): boolean;
|
||||||
|
log(name: string, severity: LoggerSeverity, message: string | Error, args: any[], hints: { color?: string }): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is a workaround for the documentation generation.
|
||||||
|
export interface Logger extends LoggerSink {}
|
||||||
48
src/page.ts
48
src/page.ts
|
|
@ -218,23 +218,23 @@ export class Page extends EventEmitter {
|
||||||
return this._attributeToPage(() => this.mainFrame().dispatchEvent(selector, type, eventInit, options));
|
return this._attributeToPage(() => this.mainFrame().dispatchEvent(selector, type, eventInit, options));
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandle<R>(pageFunction: types.Func1<void, R>, arg?: any): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>> {
|
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>> {
|
||||||
assertMaxArguments(arguments.length, 2);
|
assertMaxArguments(arguments.length, 2);
|
||||||
return this._attributeToPage(() => this.mainFrame().evaluateHandle(pageFunction, arg));
|
return this._attributeToPage(() => this.mainFrame().evaluateHandle(pageFunction, arg));
|
||||||
}
|
}
|
||||||
|
|
||||||
async $eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element, Arg, R>, arg: Arg): Promise<R>;
|
async $eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element, Arg, R>, arg: Arg): Promise<R>;
|
||||||
async $eval<R>(selector: string, pageFunction: types.FuncOn<Element, void, R>, arg?: any): Promise<R>;
|
async $eval<R>(selector: string, pageFunction: js.FuncOn<Element, void, R>, arg?: any): Promise<R>;
|
||||||
async $eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element, Arg, R>, arg: Arg): Promise<R> {
|
async $eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element, Arg, R>, arg: Arg): Promise<R> {
|
||||||
assertMaxArguments(arguments.length, 3);
|
assertMaxArguments(arguments.length, 3);
|
||||||
return this._attributeToPage(() => this.mainFrame().$eval(selector, pageFunction, arg));
|
return this._attributeToPage(() => this.mainFrame().$eval(selector, pageFunction, arg));
|
||||||
}
|
}
|
||||||
|
|
||||||
async $$eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R>;
|
async $$eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R>;
|
||||||
async $$eval<R>(selector: string, pageFunction: types.FuncOn<Element[], void, R>, arg?: any): Promise<R>;
|
async $$eval<R>(selector: string, pageFunction: js.FuncOn<Element[], void, R>, arg?: any): Promise<R>;
|
||||||
async $$eval<R, Arg>(selector: string, pageFunction: types.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R> {
|
async $$eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R> {
|
||||||
assertMaxArguments(arguments.length, 3);
|
assertMaxArguments(arguments.length, 3);
|
||||||
return this._attributeToPage(() => this.mainFrame().$$eval(selector, pageFunction, arg));
|
return this._attributeToPage(() => this.mainFrame().$$eval(selector, pageFunction, arg));
|
||||||
}
|
}
|
||||||
|
|
@ -377,9 +377,9 @@ export class Page extends EventEmitter {
|
||||||
return this._state.viewportSize;
|
return this._state.viewportSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R>;
|
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||||
async evaluate<R>(pageFunction: types.Func1<void, R>, arg?: any): Promise<R>;
|
async evaluate<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<R>;
|
||||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R> {
|
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R> {
|
||||||
assertMaxArguments(arguments.length, 2);
|
assertMaxArguments(arguments.length, 2);
|
||||||
return this._attributeToPage(() => this.mainFrame().evaluate(pageFunction, arg));
|
return this._attributeToPage(() => this.mainFrame().evaluate(pageFunction, arg));
|
||||||
}
|
}
|
||||||
|
|
@ -469,11 +469,11 @@ export class Page extends EventEmitter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async click(selector: string, options?: dom.ClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions) {
|
async click(selector: string, options?: types.MouseClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions) {
|
||||||
return this._attributeToPage(() => this.mainFrame().click(selector, options));
|
return this._attributeToPage(() => this.mainFrame().click(selector, options));
|
||||||
}
|
}
|
||||||
|
|
||||||
async dblclick(selector: string, options?: dom.MultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions) {
|
async dblclick(selector: string, options?: types.MouseMultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions) {
|
||||||
return this._attributeToPage(() => this.mainFrame().dblclick(selector, options));
|
return this._attributeToPage(() => this.mainFrame().dblclick(selector, options));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -501,7 +501,7 @@ export class Page extends EventEmitter {
|
||||||
return this._attributeToPage(() => this.mainFrame().getAttribute(selector, name, options));
|
return this._attributeToPage(() => this.mainFrame().getAttribute(selector, name, options));
|
||||||
}
|
}
|
||||||
|
|
||||||
async hover(selector: string, options?: dom.PointerActionOptions & types.PointerActionWaitOptions) {
|
async hover(selector: string, options?: types.PointerActionOptions & types.PointerActionWaitOptions) {
|
||||||
return this._attributeToPage(() => this.mainFrame().hover(selector, options));
|
return this._attributeToPage(() => this.mainFrame().hover(selector, options));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -533,9 +533,9 @@ export class Page extends EventEmitter {
|
||||||
await this.mainFrame().waitForTimeout(timeout);
|
await this.mainFrame().waitForTimeout(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
async waitForFunction<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg, options?: types.WaitForFunctionOptions): Promise<types.SmartHandle<R>>;
|
async waitForFunction<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg, options?: types.WaitForFunctionOptions): Promise<js.SmartHandle<R>>;
|
||||||
async waitForFunction<R>(pageFunction: types.Func1<void, R>, arg?: any, options?: types.WaitForFunctionOptions): Promise<types.SmartHandle<R>>;
|
async waitForFunction<R>(pageFunction: js.Func1<void, R>, arg?: any, options?: types.WaitForFunctionOptions): Promise<js.SmartHandle<R>>;
|
||||||
async waitForFunction<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg, options?: types.WaitForFunctionOptions): Promise<types.SmartHandle<R>> {
|
async waitForFunction<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg, options?: types.WaitForFunctionOptions): Promise<js.SmartHandle<R>> {
|
||||||
return this._attributeToPage(() => this.mainFrame().waitForFunction(pageFunction, arg, options));
|
return this._attributeToPage(() => this.mainFrame().waitForFunction(pageFunction, arg, options));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -602,16 +602,16 @@ export class Worker extends EventEmitter {
|
||||||
return this._url;
|
return this._url;
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R>;
|
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||||
async evaluate<R>(pageFunction: types.Func1<void, R>, arg?: any): Promise<R>;
|
async evaluate<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<R>;
|
||||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R> {
|
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R> {
|
||||||
assertMaxArguments(arguments.length, 2);
|
assertMaxArguments(arguments.length, 2);
|
||||||
return js.evaluate(await this._executionContextPromise, true /* returnByValue */, pageFunction, arg);
|
return js.evaluate(await this._executionContextPromise, true /* returnByValue */, pageFunction, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandle<R>(pageFunction: types.Func1<void, R>, arg?: any): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>> {
|
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>> {
|
||||||
assertMaxArguments(arguments.length, 2);
|
assertMaxArguments(arguments.length, 2);
|
||||||
return js.evaluate(await this._executionContextPromise, false /* returnByValue */, pageFunction, arg);
|
return js.evaluate(await this._executionContextPromise, false /* returnByValue */, pageFunction, arg);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import { Progress, runAbortableTask } from '../progress';
|
||||||
import * as types from '../types';
|
import * as types from '../types';
|
||||||
import { TimeoutSettings } from '../timeoutSettings';
|
import { TimeoutSettings } from '../timeoutSettings';
|
||||||
import { WebSocketServer } from './webSocketServer';
|
import { WebSocketServer } from './webSocketServer';
|
||||||
|
import { LoggerSink } from '../loggerSink';
|
||||||
|
|
||||||
export type FirefoxUserPrefsOptions = {
|
export type FirefoxUserPrefsOptions = {
|
||||||
firefoxUserPrefs?: { [key: string]: string | number | boolean },
|
firefoxUserPrefs?: { [key: string]: string | number | boolean },
|
||||||
|
|
@ -45,7 +46,7 @@ export type LaunchOptionsBase = {
|
||||||
handleSIGTERM?: boolean,
|
handleSIGTERM?: boolean,
|
||||||
handleSIGHUP?: boolean,
|
handleSIGHUP?: boolean,
|
||||||
timeout?: number,
|
timeout?: number,
|
||||||
logger?: types.Logger,
|
logger?: LoggerSink,
|
||||||
env?: Env,
|
env?: Env,
|
||||||
headless?: boolean,
|
headless?: boolean,
|
||||||
devtools?: boolean,
|
devtools?: boolean,
|
||||||
|
|
@ -56,7 +57,7 @@ export type LaunchOptionsBase = {
|
||||||
type ConnectOptions = {
|
type ConnectOptions = {
|
||||||
wsEndpoint: string,
|
wsEndpoint: string,
|
||||||
slowMo?: number,
|
slowMo?: number,
|
||||||
logger?: types.Logger,
|
logger?: LoggerSink,
|
||||||
timeout?: number,
|
timeout?: number,
|
||||||
};
|
};
|
||||||
export type LaunchOptions = LaunchOptionsBase & { slowMo?: number };
|
export type LaunchOptions = LaunchOptionsBase & { slowMo?: number };
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import type {BrowserWindow} from 'electron';
|
||||||
import { runAbortableTask, ProgressController } from '../progress';
|
import { runAbortableTask, ProgressController } from '../progress';
|
||||||
import { EventEmitter } from 'events';
|
import { EventEmitter } from 'events';
|
||||||
import { helper } from '../helper';
|
import { helper } from '../helper';
|
||||||
|
import { LoggerSink } from '../loggerSink';
|
||||||
|
|
||||||
type ElectronLaunchOptions = {
|
type ElectronLaunchOptions = {
|
||||||
args?: string[],
|
args?: string[],
|
||||||
|
|
@ -41,7 +42,7 @@ type ElectronLaunchOptions = {
|
||||||
handleSIGTERM?: boolean,
|
handleSIGTERM?: boolean,
|
||||||
handleSIGHUP?: boolean,
|
handleSIGHUP?: boolean,
|
||||||
timeout?: number,
|
timeout?: number,
|
||||||
logger?: types.Logger,
|
logger?: LoggerSink,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ElectronEvents = {
|
export const ElectronEvents = {
|
||||||
|
|
@ -150,15 +151,15 @@ export class ElectronApplication extends EventEmitter {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluate<R, Arg>(pageFunction: types.FuncOn<any, Arg, R>, arg: Arg): Promise<R>;
|
async evaluate<R, Arg>(pageFunction: js.FuncOn<any, Arg, R>, arg: Arg): Promise<R>;
|
||||||
async evaluate<R>(pageFunction: types.FuncOn<any, void, R>, arg?: any): Promise<R>;
|
async evaluate<R>(pageFunction: js.FuncOn<any, void, R>, arg?: any): Promise<R>;
|
||||||
async evaluate<R, Arg>(pageFunction: types.FuncOn<any, Arg, R>, arg: Arg): Promise<R> {
|
async evaluate<R, Arg>(pageFunction: js.FuncOn<any, Arg, R>, arg: Arg): Promise<R> {
|
||||||
return this._nodeElectronHandle!.evaluate(pageFunction, arg);
|
return this._nodeElectronHandle!.evaluate(pageFunction, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.FuncOn<any, Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R, Arg>(pageFunction: js.FuncOn<any, Arg, R>, arg: Arg): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandle<R>(pageFunction: types.FuncOn<any, void, R>, arg?: any): Promise<types.SmartHandle<R>>;
|
async evaluateHandle<R>(pageFunction: js.FuncOn<any, void, R>, arg?: any): Promise<js.SmartHandle<R>>;
|
||||||
async evaluateHandle<R, Arg>(pageFunction: types.FuncOn<any, Arg, R>, arg: Arg): Promise<types.SmartHandle<R>> {
|
async evaluateHandle<R, Arg>(pageFunction: js.FuncOn<any, Arg, R>, arg: Arg): Promise<js.SmartHandle<R>> {
|
||||||
return this._nodeElectronHandle!.evaluateHandle(pageFunction, arg);
|
return this._nodeElectronHandle!.evaluateHandle(pageFunction, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
45
src/types.ts
45
src/types.ts
|
|
@ -14,24 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import * as js from './javascript';
|
// NOTE: No imports allowed - only primitive, self-contained types are allowed here.
|
||||||
import * as dom from './dom';
|
|
||||||
|
|
||||||
type NoHandles<Arg> = Arg extends js.JSHandle ? never : (Arg extends object ? { [Key in keyof Arg]: NoHandles<Arg[Key]> } : Arg);
|
|
||||||
type Unboxed<Arg> =
|
|
||||||
Arg extends dom.ElementHandle<infer T> ? T :
|
|
||||||
Arg extends js.JSHandle<infer T> ? T :
|
|
||||||
Arg extends NoHandles<Arg> ? Arg :
|
|
||||||
Arg extends [infer A0] ? [Unboxed<A0>] :
|
|
||||||
Arg extends [infer A0, infer A1] ? [Unboxed<A0>, Unboxed<A1>] :
|
|
||||||
Arg extends [infer A0, infer A1, infer A2] ? [Unboxed<A0>, Unboxed<A1>, Unboxed<A2>] :
|
|
||||||
Arg extends Array<infer T> ? Array<Unboxed<T>> :
|
|
||||||
Arg extends object ? { [Key in keyof Arg]: Unboxed<Arg[Key]> } :
|
|
||||||
Arg;
|
|
||||||
export type Func0<R> = string | (() => R | Promise<R>);
|
|
||||||
export type Func1<Arg, R> = string | ((arg: Unboxed<Arg>) => R | Promise<R>);
|
|
||||||
export type FuncOn<On, Arg2, R> = string | ((on: On, arg2: Unboxed<Arg2>) => R | Promise<R>);
|
|
||||||
export type SmartHandle<T> = T extends Node ? dom.ElementHandle<T> : js.JSHandle<T>;
|
|
||||||
|
|
||||||
export type Size = { width: number, height: number };
|
export type Size = { width: number, height: number };
|
||||||
export type Point = { x: number, y: number };
|
export type Point = { x: number, y: number };
|
||||||
|
|
@ -177,11 +160,23 @@ export type ProxySettings = {
|
||||||
password?: string
|
password?: string
|
||||||
};
|
};
|
||||||
|
|
||||||
export type LoggerSeverity = 'verbose' | 'info' | 'warning' | 'error';
|
|
||||||
|
|
||||||
export interface Logger {
|
|
||||||
isEnabled(name: string, severity: LoggerSeverity): boolean;
|
|
||||||
log(name: string, severity: LoggerSeverity, message: string | Error, args: any[], hints: { color?: string }): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type WaitForEventOptions = Function | { predicate?: Function, timeout?: number };
|
export type WaitForEventOptions = Function | { predicate?: Function, timeout?: number };
|
||||||
|
|
||||||
|
export type KeyboardModifier = 'Alt' | 'Control' | 'Meta' | 'Shift';
|
||||||
|
export type MouseButton = 'left' | 'right' | 'middle';
|
||||||
|
|
||||||
|
export type PointerActionOptions = {
|
||||||
|
modifiers?: KeyboardModifier[];
|
||||||
|
position?: Point;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type MouseClickOptions = PointerActionOptions & {
|
||||||
|
delay?: number;
|
||||||
|
button?: MouseButton;
|
||||||
|
clickCount?: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type MouseMultiClickOptions = PointerActionOptions & {
|
||||||
|
delay?: number;
|
||||||
|
button?: MouseButton;
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -16,11 +16,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import * as input from '../input';
|
import * as input from '../input';
|
||||||
|
import * as types from '../types';
|
||||||
import { helper } from '../helper';
|
import { helper } from '../helper';
|
||||||
import { macEditingCommands } from '../macEditingCommands';
|
import { macEditingCommands } from '../macEditingCommands';
|
||||||
import { WKSession } from './wkConnection';
|
import { WKSession } from './wkConnection';
|
||||||
|
|
||||||
function toModifiersMask(modifiers: Set<input.Modifier>): number {
|
function toModifiersMask(modifiers: Set<types.KeyboardModifier>): number {
|
||||||
// From Source/WebKit/Shared/WebEvent.h
|
// From Source/WebKit/Shared/WebEvent.h
|
||||||
let mask = 0;
|
let mask = 0;
|
||||||
if (modifiers.has('Shift'))
|
if (modifiers.has('Shift'))
|
||||||
|
|
@ -46,9 +47,9 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
||||||
this._session = session;
|
this._session = session;
|
||||||
}
|
}
|
||||||
|
|
||||||
async keydown(modifiers: Set<input.Modifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number, autoRepeat: boolean, text: string | undefined): Promise<void> {
|
async keydown(modifiers: Set<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number, autoRepeat: boolean, text: string | undefined): Promise<void> {
|
||||||
const parts = [];
|
const parts = [];
|
||||||
for (const modifier of (['Shift', 'Control', 'Alt', 'Meta']) as input.Modifier[]) {
|
for (const modifier of (['Shift', 'Control', 'Alt', 'Meta']) as types.KeyboardModifier[]) {
|
||||||
if (modifiers.has(modifier))
|
if (modifiers.has(modifier))
|
||||||
parts.push(modifier);
|
parts.push(modifier);
|
||||||
}
|
}
|
||||||
|
|
@ -71,7 +72,7 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async keyup(modifiers: Set<input.Modifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void> {
|
async keyup(modifiers: Set<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void> {
|
||||||
await this._pageProxySession.send('Input.dispatchKeyEvent', {
|
await this._pageProxySession.send('Input.dispatchKeyEvent', {
|
||||||
type: 'keyUp',
|
type: 'keyUp',
|
||||||
modifiers: toModifiersMask(modifiers),
|
modifiers: toModifiersMask(modifiers),
|
||||||
|
|
@ -94,7 +95,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
this._pageProxySession = session;
|
this._pageProxySession = session;
|
||||||
}
|
}
|
||||||
|
|
||||||
async move(x: number, y: number, button: input.Button | 'none', buttons: Set<input.Button>, modifiers: Set<input.Modifier>): Promise<void> {
|
async move(x: number, y: number, button: types.MouseButton | 'none', buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>): Promise<void> {
|
||||||
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
||||||
type: 'move',
|
type: 'move',
|
||||||
button,
|
button,
|
||||||
|
|
@ -104,7 +105,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async down(x: number, y: number, button: input.Button, buttons: Set<input.Button>, modifiers: Set<input.Modifier>, clickCount: number): Promise<void> {
|
async down(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void> {
|
||||||
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
||||||
type: 'down',
|
type: 'down',
|
||||||
button,
|
button,
|
||||||
|
|
@ -115,7 +116,7 @@ export class RawMouseImpl implements input.RawMouse {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async up(x: number, y: number, button: input.Button, buttons: Set<input.Button>, modifiers: Set<input.Modifier>, clickCount: number): Promise<void> {
|
async up(x: number, y: number, button: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, clickCount: number): Promise<void> {
|
||||||
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
||||||
type: 'up',
|
type: 'up',
|
||||||
button,
|
button,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue