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 { ElementHandle } from './dom';
|
||||
export { FileChooser } from './fileChooser';
|
||||
export { Logger } from './types';
|
||||
export { Logger } from './loggerSink';
|
||||
export { TimeoutError } from './errors';
|
||||
export { Frame } from './frames';
|
||||
export { Keyboard, Mouse } from './input';
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ import { Loggers, Logger } from './logger';
|
|||
import { EventEmitter } from 'events';
|
||||
import { ProgressController } from './progress';
|
||||
import { DebugController } from './debug/debugController';
|
||||
import { LoggerSink } from './loggerSink';
|
||||
|
||||
type CommonContextOptions = {
|
||||
viewport?: types.Size | null,
|
||||
|
|
@ -52,7 +53,7 @@ type CommonContextOptions = {
|
|||
|
||||
export type PersistentContextOptions = CommonContextOptions;
|
||||
export type BrowserContextOptions = CommonContextOptions & {
|
||||
logger?: types.Logger,
|
||||
logger?: LoggerSink,
|
||||
};
|
||||
|
||||
export interface BrowserContext {
|
||||
|
|
|
|||
|
|
@ -16,9 +16,10 @@
|
|||
*/
|
||||
|
||||
import * as input from '../input';
|
||||
import * as types from '../types';
|
||||
import { CRSession } from './crConnection';
|
||||
|
||||
function toModifiersMask(modifiers: Set<input.Modifier>): number {
|
||||
function toModifiersMask(modifiers: Set<types.KeyboardModifier>): number {
|
||||
let mask = 0;
|
||||
if (modifiers.has('Alt'))
|
||||
mask |= 1;
|
||||
|
|
@ -38,7 +39,7 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
|||
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', {
|
||||
type: text ? 'keyDown' : 'rawKeyDown',
|
||||
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', {
|
||||
type: 'keyUp',
|
||||
modifiers: toModifiersMask(modifiers),
|
||||
|
|
@ -76,7 +77,7 @@ export class RawMouseImpl implements input.RawMouse {
|
|||
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', {
|
||||
type: 'mouseMoved',
|
||||
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', {
|
||||
type: 'mousePressed',
|
||||
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', {
|
||||
type: 'mouseReleased',
|
||||
button,
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
import { Writable } from 'stream';
|
||||
import { BrowserContextBase } from '../browserContext';
|
||||
import * as dom from '../dom';
|
||||
import * as types from '../types';
|
||||
import { Events } from '../events';
|
||||
import * as frames from '../frames';
|
||||
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';
|
||||
if (action.clickCount === 2)
|
||||
method = 'dblclick';
|
||||
const modifiers = toModifiers(action.modifiers);
|
||||
const options: dom.ClickOptions = {};
|
||||
const options: types.MouseClickOptions = {};
|
||||
if (action.button !== 'left')
|
||||
options.button = action.button;
|
||||
if (modifiers.length)
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
*/
|
||||
|
||||
import { Writable } from 'stream';
|
||||
import * as dom from '../dom';
|
||||
import * as types from '../types';
|
||||
import { Frame } from '../frames';
|
||||
import { formatColors, Formatter } from '../utils/formatter';
|
||||
import { Action, actionTitle, NavigationSignal, PopupSignal, Signal } from './recorderActions';
|
||||
|
|
@ -145,7 +145,7 @@ export class TerminalOutput {
|
|||
if (action.clickCount === 2)
|
||||
method = 'dblclick';
|
||||
const modifiers = toModifiers(action.modifiers);
|
||||
const options: dom.ClickOptions = {};
|
||||
const options: types.MouseClickOptions = {};
|
||||
if (action.button !== 'left')
|
||||
options.button = action.button;
|
||||
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 * as injectedScriptSource from './generated/injectedScriptSource';
|
||||
import * as debugScriptSource from './generated/debugScriptSource';
|
||||
import * as input from './input';
|
||||
import * as js from './javascript';
|
||||
import { Page } from './page';
|
||||
import { selectors } from './selectors';
|
||||
|
|
@ -31,15 +30,6 @@ import * as types from './types';
|
|||
import { Progress, ProgressController } from './progress';
|
||||
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 {
|
||||
readonly frame: frames.Frame;
|
||||
private _injectedScriptPromise?: Promise<js.JSHandle>;
|
||||
|
|
@ -56,16 +46,16 @@ export class FrameExecutionContext extends js.ExecutionContext {
|
|||
return null;
|
||||
}
|
||||
|
||||
async evaluateInternal<R>(pageFunction: types.Func0<R>): Promise<R>;
|
||||
async evaluateInternal<Arg, R>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||
async evaluateInternal<R>(pageFunction: js.Func0<R>): Promise<R>;
|
||||
async evaluateInternal<Arg, R>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||
async evaluateInternal(pageFunction: never, ...args: never[]): Promise<any> {
|
||||
return await this.frame._page._frameManager.waitForSignalsCreatedBy(null, false /* noWaitFor */, async () => {
|
||||
return js.evaluate(this, true /* returnByValue */, pageFunction, ...args);
|
||||
});
|
||||
}
|
||||
|
||||
async evaluateHandleInternal<R>(pageFunction: types.Func0<R>): Promise<types.SmartHandle<R>>;
|
||||
async evaluateHandleInternal<Arg, R>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
||||
async evaluateHandleInternal<R>(pageFunction: js.Func0<R>): Promise<js.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> {
|
||||
return await this.frame._page._frameManager.waitForSignalsCreatedBy(null, false /* noWaitFor */, async () => {
|
||||
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;
|
||||
}
|
||||
|
||||
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();
|
||||
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();
|
||||
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();
|
||||
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;
|
||||
while (progress.isRunning()) {
|
||||
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';
|
||||
}
|
||||
|
||||
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;
|
||||
if (!force) {
|
||||
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)
|
||||
await (options as any).__testHookBeforePointerAction();
|
||||
progress.throwIfAborted(); // Avoid action that has side-effects.
|
||||
let restoreModifiers: input.Modifier[] | undefined;
|
||||
let restoreModifiers: types.KeyboardModifier[] | undefined;
|
||||
if (options && options.modifiers)
|
||||
restoreModifiers = await this._page.keyboard._ensureModifiers(options.modifiers);
|
||||
progress.logger.info(` performing ${progress.apiName} action`);
|
||||
|
|
@ -380,33 +370,33 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
|||
return 'done';
|
||||
}
|
||||
|
||||
hover(options: PointerActionOptions & types.PointerActionWaitOptions = {}): Promise<void> {
|
||||
hover(options: types.PointerActionOptions & types.PointerActionWaitOptions = {}): Promise<void> {
|
||||
return this._runAbortableTask(async progress => {
|
||||
throwIfNotConnected(await this._hover(progress, options));
|
||||
}, 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);
|
||||
}
|
||||
|
||||
click(options: ClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<void> {
|
||||
click(options: types.MouseClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<void> {
|
||||
return this._runAbortableTask(async progress => {
|
||||
throwIfNotConnected(await this._click(progress, options));
|
||||
}, 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);
|
||||
}
|
||||
|
||||
dblclick(options: MultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<void> {
|
||||
dblclick(options: types.MouseMultiClickOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<void> {
|
||||
return this._runAbortableTask(async progress => {
|
||||
throwIfNotConnected(await this._dblclick(progress, options));
|
||||
}, 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);
|
||||
}
|
||||
|
||||
|
|
@ -607,9 +597,9 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
|||
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>(selector: string, pageFunction: types.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>;
|
||||
async $eval<R>(selector: string, pageFunction: js.FuncOn<Element, void, R>, arg?: any): 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);
|
||||
if (!handle)
|
||||
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;
|
||||
}
|
||||
|
||||
async $$eval<R, Arg>(selector: string, pageFunction: types.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, 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: js.FuncOn<Element[], void, R>, arg?: any): 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 result = await arrayHandle.evaluate(pageFunction, arg);
|
||||
arrayHandle.dispose();
|
||||
|
|
@ -686,7 +676,7 @@ export class InjectedScriptPollHandler<T> {
|
|||
});
|
||||
}
|
||||
|
||||
async finishHandle(): Promise<types.SmartHandle<T>> {
|
||||
async finishHandle(): Promise<js.SmartHandle<T>> {
|
||||
try {
|
||||
const result = await this._poll!.evaluateHandle(poll => poll.result);
|
||||
await this._finishInternal();
|
||||
|
|
|
|||
|
|
@ -15,10 +15,11 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { FFSession } from './ffConnection';
|
||||
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;
|
||||
if (modifiers.has('Alt'))
|
||||
mask |= 1;
|
||||
|
|
@ -31,7 +32,7 @@ function toModifiersMask(modifiers: Set<input.Modifier>): number {
|
|||
return mask;
|
||||
}
|
||||
|
||||
function toButtonNumber(button: input.Button): number {
|
||||
function toButtonNumber(button: types.MouseButton): number {
|
||||
if (button === 'left')
|
||||
return 0;
|
||||
if (button === 'middle')
|
||||
|
|
@ -41,7 +42,7 @@ function toButtonNumber(button: input.Button): number {
|
|||
return 0;
|
||||
}
|
||||
|
||||
function toButtonsMask(buttons: Set<input.Button>): number {
|
||||
function toButtonsMask(buttons: Set<types.MouseButton>): number {
|
||||
let mask = 0;
|
||||
if (buttons.has('left'))
|
||||
mask |= 1;
|
||||
|
|
@ -59,7 +60,7 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
|||
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')
|
||||
code = 'OSLeft';
|
||||
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')
|
||||
code = 'OSLeft';
|
||||
if (code === 'MetaRight')
|
||||
|
|
@ -105,7 +106,7 @@ export class RawMouseImpl implements input.RawMouse {
|
|||
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', {
|
||||
type: 'mousemove',
|
||||
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', {
|
||||
type: 'mousedown',
|
||||
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', {
|
||||
type: 'mouseup',
|
||||
button: toButtonNumber(button),
|
||||
|
|
|
|||
|
|
@ -432,17 +432,17 @@ export class Frame {
|
|||
return this._context('utility');
|
||||
}
|
||||
|
||||
async evaluateHandle<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
||||
async evaluateHandle<R>(pageFunction: types.Func1<void, R>, arg?: any): Promise<types.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>>;
|
||||
async evaluateHandle<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<js.SmartHandle<R>>;
|
||||
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>> {
|
||||
assertMaxArguments(arguments.length, 2);
|
||||
const context = await this._mainContext();
|
||||
return context.evaluateHandleInternal(pageFunction, arg);
|
||||
}
|
||||
|
||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||
async evaluate<R>(pageFunction: types.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>;
|
||||
async evaluate<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<R>;
|
||||
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R> {
|
||||
assertMaxArguments(arguments.length, 2);
|
||||
const context = await this._mainContext();
|
||||
return context.evaluateInternal(pageFunction, arg);
|
||||
|
|
@ -488,9 +488,9 @@ export class Frame {
|
|||
}, 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>(selector: string, pageFunction: types.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>;
|
||||
async $eval<R>(selector: string, pageFunction: js.FuncOn<Element, void, R>, arg?: any): Promise<R>;
|
||||
async $eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element, Arg, R>, arg: Arg): Promise<R> {
|
||||
assertMaxArguments(arguments.length, 3);
|
||||
const handle = await this.$(selector);
|
||||
if (!handle)
|
||||
|
|
@ -500,9 +500,9 @@ export class Frame {
|
|||
return result;
|
||||
}
|
||||
|
||||
async $$eval<R, Arg>(selector: string, pageFunction: types.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, 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: js.FuncOn<Element[], void, R>, arg?: any): Promise<R>;
|
||||
async $$eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R> {
|
||||
assertMaxArguments(arguments.length, 3);
|
||||
const arrayHandle = await selectors._queryArray(this, selector);
|
||||
const result = await arrayHandle.evaluate(pageFunction, arg);
|
||||
|
|
@ -735,11 +735,11 @@ export class Frame {
|
|||
}, 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');
|
||||
}
|
||||
|
||||
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');
|
||||
}
|
||||
|
||||
|
|
@ -767,7 +767,7 @@ export class Frame {
|
|||
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');
|
||||
}
|
||||
|
||||
|
|
@ -799,9 +799,9 @@ export class Frame {
|
|||
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>(pageFunction: types.Func1<void, R>, arg?: any, options?: types.WaitForFunctionOptions): Promise<types.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>>;
|
||||
async waitForFunction<R>(pageFunction: js.Func1<void, R>, arg?: any, options?: types.WaitForFunctionOptions): Promise<js.SmartHandle<R>>;
|
||||
async waitForFunction<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg, options: types.WaitForFunctionOptions = {}): Promise<js.SmartHandle<R>> {
|
||||
const { polling = 'raf' } = options;
|
||||
if (helper.isString(polling))
|
||||
assert(polling === 'raf', 'Unknown polling option: ' + polling);
|
||||
|
|
@ -839,7 +839,7 @@ export class Frame {
|
|||
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 rerunnableTask = new RerunnableTask(data, progress, task);
|
||||
if (data.context)
|
||||
|
|
@ -895,9 +895,9 @@ export class Frame {
|
|||
export type SchedulableTask<T> = (context: dom.FrameExecutionContext) => Promise<js.JSHandle<types.InjectedScriptPoll<T>>>;
|
||||
|
||||
class RerunnableTask<T> {
|
||||
readonly promise: Promise<types.SmartHandle<T>>;
|
||||
readonly promise: Promise<js.SmartHandle<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 _progress: Progress;
|
||||
|
||||
|
|
@ -905,7 +905,7 @@ class RerunnableTask<T> {
|
|||
this._task = task;
|
||||
this._progress = progress;
|
||||
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.
|
||||
this._resolve = resolve;
|
||||
this._reject = reject;
|
||||
|
|
|
|||
55
src/input.ts
55
src/input.ts
|
|
@ -16,20 +16,7 @@
|
|||
|
||||
import { assert } from './helper';
|
||||
import * as keyboardLayout from './usKeyboardLayout';
|
||||
|
||||
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;
|
||||
};
|
||||
import * as types from './types';
|
||||
|
||||
export const keypadLocation = keyboardLayout.keypadLocation;
|
||||
|
||||
|
|
@ -43,17 +30,17 @@ type KeyDescription = {
|
|||
shifted?: KeyDescription;
|
||||
};
|
||||
|
||||
const kModifiers: Modifier[] = ['Alt', 'Control', 'Meta', 'Shift'];
|
||||
const kModifiers: types.KeyboardModifier[] = ['Alt', 'Control', 'Meta', 'Shift'];
|
||||
|
||||
export interface RawKeyboard {
|
||||
keydown(modifiers: Set<Modifier>, 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>;
|
||||
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<types.KeyboardModifier>, code: string, keyCode: number, keyCodeWithoutLocation: number, key: string, location: number): Promise<void>;
|
||||
sendText(text: string): Promise<void>;
|
||||
}
|
||||
|
||||
export class Keyboard {
|
||||
private _raw: RawKeyboard;
|
||||
private _pressedModifiers = new Set<Modifier>();
|
||||
private _pressedModifiers = new Set<types.KeyboardModifier>();
|
||||
private _pressedKeys = new Set<string>();
|
||||
|
||||
constructor(raw: RawKeyboard) {
|
||||
|
|
@ -64,8 +51,8 @@ export class Keyboard {
|
|||
const description = this._keyDescriptionForString(key);
|
||||
const autoRepeat = this._pressedKeys.has(description.code);
|
||||
this._pressedKeys.add(description.code);
|
||||
if (kModifiers.includes(description.key as Modifier))
|
||||
this._pressedModifiers.add(description.key as Modifier);
|
||||
if (kModifiers.includes(description.key as types.KeyboardModifier))
|
||||
this._pressedModifiers.add(description.key as types.KeyboardModifier);
|
||||
const text = description.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) {
|
||||
const description = this._keyDescriptionForString(key);
|
||||
if (kModifiers.includes(description.key as Modifier))
|
||||
this._pressedModifiers.delete(description.key as Modifier);
|
||||
if (kModifiers.includes(description.key as types.KeyboardModifier))
|
||||
this._pressedModifiers.delete(description.key as types.KeyboardModifier);
|
||||
this._pressedKeys.delete(description.code);
|
||||
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]);
|
||||
}
|
||||
|
||||
async _ensureModifiers(modifiers: Modifier[]): Promise<Modifier[]> {
|
||||
async _ensureModifiers(modifiers: types.KeyboardModifier[]): Promise<types.KeyboardModifier[]> {
|
||||
for (const modifier of modifiers) {
|
||||
if (!kModifiers.includes(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>[] = [];
|
||||
for (const key of kModifiers) {
|
||||
const needDown = modifiers.includes(key);
|
||||
|
|
@ -154,15 +141,15 @@ export class Keyboard {
|
|||
return restore;
|
||||
}
|
||||
|
||||
_modifiers(): Set<Modifier> {
|
||||
_modifiers(): Set<types.KeyboardModifier> {
|
||||
return this._pressedModifiers;
|
||||
}
|
||||
}
|
||||
|
||||
export interface RawMouse {
|
||||
move(x: number, y: number, button: Button | 'none', buttons: Set<Button>, modifiers: Set<Modifier>): Promise<void>;
|
||||
down(x: number, y: number, button: Button, buttons: Set<Button>, modifiers: Set<Modifier>, clickCount: number): Promise<void>;
|
||||
up(x: number, y: number, button: Button, buttons: Set<Button>, modifiers: Set<Modifier>, clickCount: number): 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: types.MouseButton, buttons: Set<types.MouseButton>, modifiers: Set<types.KeyboardModifier>, 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 {
|
||||
|
|
@ -170,8 +157,8 @@ export class Mouse {
|
|||
private _keyboard: Keyboard;
|
||||
private _x = 0;
|
||||
private _y = 0;
|
||||
private _lastButton: 'none' | Button = 'none';
|
||||
private _buttons = new Set<Button>();
|
||||
private _lastButton: 'none' | types.MouseButton = 'none';
|
||||
private _buttons = new Set<types.MouseButton>();
|
||||
|
||||
constructor(raw: RawMouse, keyboard: Keyboard) {
|
||||
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;
|
||||
this._lastButton = button;
|
||||
this._buttons.add(button);
|
||||
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;
|
||||
this._lastButton = 'none';
|
||||
this._buttons.delete(button);
|
||||
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;
|
||||
if (delay) {
|
||||
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 });
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import * as types from './types';
|
||||
import * as dom from './dom';
|
||||
import * as utilityScriptSource from './generated/utilityScriptSource';
|
||||
import * as sourceMap from './utils/sourceMap';
|
||||
|
|
@ -28,6 +27,22 @@ export type RemoteObject = {
|
|||
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 {
|
||||
rawEvaluate(expression: string): Promise<ObjectId>;
|
||||
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);
|
||||
}
|
||||
|
||||
async evaluate<R, Arg>(pageFunction: types.FuncOn<T, Arg, R>, arg: Arg): Promise<R>;
|
||||
async evaluate<R>(pageFunction: types.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>;
|
||||
async evaluate<R>(pageFunction: FuncOn<T, void, R>, arg?: any): Promise<R>;
|
||||
async evaluate<R, Arg>(pageFunction: FuncOn<T, Arg, R>, arg: Arg): Promise<R> {
|
||||
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>(pageFunction: types.FuncOn<T, void, R>, arg?: any): Promise<types.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>>;
|
||||
async evaluateHandle<R>(pageFunction: FuncOn<T, void, R>, arg?: any): Promise<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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
import * as debug from 'debug';
|
||||
import { helper } from './helper';
|
||||
import { Logger as LoggerSink, LoggerSeverity } from './types';
|
||||
import { LoggerSink, LoggerSeverity } from './loggerSink';
|
||||
|
||||
export function logError(logger: Logger): (error: Error) => void {
|
||||
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));
|
||||
}
|
||||
|
||||
async evaluateHandle<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<types.SmartHandle<R>>;
|
||||
async evaluateHandle<R>(pageFunction: types.Func1<void, R>, arg?: any): Promise<types.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>>;
|
||||
async evaluateHandle<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<js.SmartHandle<R>>;
|
||||
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>> {
|
||||
assertMaxArguments(arguments.length, 2);
|
||||
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>(selector: string, pageFunction: types.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>;
|
||||
async $eval<R>(selector: string, pageFunction: js.FuncOn<Element, void, R>, arg?: any): Promise<R>;
|
||||
async $eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element, Arg, R>, arg: Arg): Promise<R> {
|
||||
assertMaxArguments(arguments.length, 3);
|
||||
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>(selector: string, pageFunction: types.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>;
|
||||
async $$eval<R>(selector: string, pageFunction: js.FuncOn<Element[], void, R>, arg?: any): Promise<R>;
|
||||
async $$eval<R, Arg>(selector: string, pageFunction: js.FuncOn<Element[], Arg, R>, arg: Arg): Promise<R> {
|
||||
assertMaxArguments(arguments.length, 3);
|
||||
return this._attributeToPage(() => this.mainFrame().$$eval(selector, pageFunction, arg));
|
||||
}
|
||||
|
|
@ -377,9 +377,9 @@ export class Page extends EventEmitter {
|
|||
return this._state.viewportSize;
|
||||
}
|
||||
|
||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||
async evaluate<R>(pageFunction: types.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>;
|
||||
async evaluate<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<R>;
|
||||
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R> {
|
||||
assertMaxArguments(arguments.length, 2);
|
||||
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));
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
|
|
@ -501,7 +501,7 @@ export class Page extends EventEmitter {
|
|||
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));
|
||||
}
|
||||
|
||||
|
|
@ -533,9 +533,9 @@ export class Page extends EventEmitter {
|
|||
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>(pageFunction: types.Func1<void, R>, arg?: any, options?: types.WaitForFunctionOptions): Promise<types.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>>;
|
||||
async waitForFunction<R>(pageFunction: js.Func1<void, R>, arg?: any, options?: types.WaitForFunctionOptions): Promise<js.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));
|
||||
}
|
||||
|
||||
|
|
@ -602,16 +602,16 @@ export class Worker extends EventEmitter {
|
|||
return this._url;
|
||||
}
|
||||
|
||||
async evaluate<R, Arg>(pageFunction: types.Func1<Arg, R>, arg: Arg): Promise<R>;
|
||||
async evaluate<R>(pageFunction: types.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>;
|
||||
async evaluate<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<R>;
|
||||
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R> {
|
||||
assertMaxArguments(arguments.length, 2);
|
||||
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>(pageFunction: types.Func1<void, R>, arg?: any): Promise<types.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>>;
|
||||
async evaluateHandle<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<js.SmartHandle<R>>;
|
||||
async evaluateHandle<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<js.SmartHandle<R>> {
|
||||
assertMaxArguments(arguments.length, 2);
|
||||
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 { TimeoutSettings } from '../timeoutSettings';
|
||||
import { WebSocketServer } from './webSocketServer';
|
||||
import { LoggerSink } from '../loggerSink';
|
||||
|
||||
export type FirefoxUserPrefsOptions = {
|
||||
firefoxUserPrefs?: { [key: string]: string | number | boolean },
|
||||
|
|
@ -45,7 +46,7 @@ export type LaunchOptionsBase = {
|
|||
handleSIGTERM?: boolean,
|
||||
handleSIGHUP?: boolean,
|
||||
timeout?: number,
|
||||
logger?: types.Logger,
|
||||
logger?: LoggerSink,
|
||||
env?: Env,
|
||||
headless?: boolean,
|
||||
devtools?: boolean,
|
||||
|
|
@ -56,7 +57,7 @@ export type LaunchOptionsBase = {
|
|||
type ConnectOptions = {
|
||||
wsEndpoint: string,
|
||||
slowMo?: number,
|
||||
logger?: types.Logger,
|
||||
logger?: LoggerSink,
|
||||
timeout?: number,
|
||||
};
|
||||
export type LaunchOptions = LaunchOptionsBase & { slowMo?: number };
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ import type {BrowserWindow} from 'electron';
|
|||
import { runAbortableTask, ProgressController } from '../progress';
|
||||
import { EventEmitter } from 'events';
|
||||
import { helper } from '../helper';
|
||||
import { LoggerSink } from '../loggerSink';
|
||||
|
||||
type ElectronLaunchOptions = {
|
||||
args?: string[],
|
||||
|
|
@ -41,7 +42,7 @@ type ElectronLaunchOptions = {
|
|||
handleSIGTERM?: boolean,
|
||||
handleSIGHUP?: boolean,
|
||||
timeout?: number,
|
||||
logger?: types.Logger,
|
||||
logger?: LoggerSink,
|
||||
};
|
||||
|
||||
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>(pageFunction: types.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>;
|
||||
async evaluate<R>(pageFunction: js.FuncOn<any, void, R>, arg?: any): Promise<R>;
|
||||
async evaluate<R, Arg>(pageFunction: js.FuncOn<any, Arg, R>, arg: Arg): Promise<R> {
|
||||
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>(pageFunction: types.FuncOn<any, void, R>, arg?: any): Promise<types.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>>;
|
||||
async evaluateHandle<R>(pageFunction: js.FuncOn<any, void, R>, arg?: any): Promise<js.SmartHandle<R>>;
|
||||
async evaluateHandle<R, Arg>(pageFunction: js.FuncOn<any, Arg, R>, arg: Arg): Promise<js.SmartHandle<R>> {
|
||||
return this._nodeElectronHandle!.evaluateHandle(pageFunction, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
45
src/types.ts
45
src/types.ts
|
|
@ -14,24 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import * as js from './javascript';
|
||||
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>;
|
||||
// NOTE: No imports allowed - only primitive, self-contained types are allowed here.
|
||||
|
||||
export type Size = { width: number, height: number };
|
||||
export type Point = { x: number, y: number };
|
||||
|
|
@ -177,11 +160,23 @@ export type ProxySettings = {
|
|||
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 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 types from '../types';
|
||||
import { helper } from '../helper';
|
||||
import { macEditingCommands } from '../macEditingCommands';
|
||||
import { WKSession } from './wkConnection';
|
||||
|
||||
function toModifiersMask(modifiers: Set<input.Modifier>): number {
|
||||
function toModifiersMask(modifiers: Set<types.KeyboardModifier>): number {
|
||||
// From Source/WebKit/Shared/WebEvent.h
|
||||
let mask = 0;
|
||||
if (modifiers.has('Shift'))
|
||||
|
|
@ -46,9 +47,9 @@ export class RawKeyboardImpl implements input.RawKeyboard {
|
|||
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 = [];
|
||||
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))
|
||||
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', {
|
||||
type: 'keyUp',
|
||||
modifiers: toModifiersMask(modifiers),
|
||||
|
|
@ -94,7 +95,7 @@ export class RawMouseImpl implements input.RawMouse {
|
|||
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', {
|
||||
type: 'move',
|
||||
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', {
|
||||
type: 'down',
|
||||
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', {
|
||||
type: 'up',
|
||||
button,
|
||||
|
|
|
|||
Loading…
Reference in a new issue