add hw2
This commit is contained in:
26
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionDispatcher.d.ts
generated
vendored
Normal file
26
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionDispatcher.d.ts
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import type { BrowsingContextImpl } from '../context/BrowsingContextImpl.js';
|
||||
import type { ActionOption } from './ActionOption.js';
|
||||
import type { InputState } from './InputState.js';
|
||||
export declare class ActionDispatcher {
|
||||
#private;
|
||||
static isMacOS: (context: BrowsingContextImpl) => Promise<boolean>;
|
||||
constructor(inputState: InputState, context: BrowsingContextImpl, isMacOS: boolean);
|
||||
dispatchActions(optionsByTick: readonly (readonly Readonly<ActionOption>[])[]): Promise<void>;
|
||||
dispatchTickActions(options: readonly Readonly<ActionOption>[]): Promise<void>;
|
||||
}
|
||||
731
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionDispatcher.js
generated
vendored
Normal file
731
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionDispatcher.js
generated
vendored
Normal file
@@ -0,0 +1,731 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { InvalidArgumentException, MoveTargetOutOfBoundsException, NoSuchElementException, } from '../../../protocol/protocol.js';
|
||||
import { assert } from '../../../utils/assert.js';
|
||||
import { isSingleComplexGrapheme, isSingleGrapheme, } from '../../../utils/GraphemeTools.js';
|
||||
import { PointerSource, } from './InputSource.js';
|
||||
import { getKeyCode, getKeyLocation, getNormalizedKey } from './keyUtils.js';
|
||||
import { KeyToKeyCode } from './USKeyboardLayout.js';
|
||||
/** https://w3c.github.io/webdriver/#dfn-center-point */
|
||||
const CALCULATE_IN_VIEW_CENTER_PT_DECL = ((i) => {
|
||||
const t = i.getClientRects()[0], e = Math.max(0, Math.min(t.x, t.x + t.width)), n = Math.min(window.innerWidth, Math.max(t.x, t.x + t.width)), h = Math.max(0, Math.min(t.y, t.y + t.height)), m = Math.min(window.innerHeight, Math.max(t.y, t.y + t.height));
|
||||
return [e + ((n - e) >> 1), h + ((m - h) >> 1)];
|
||||
}).toString();
|
||||
const IS_MAC_DECL = (() => {
|
||||
return navigator.platform.toLowerCase().includes('mac');
|
||||
}).toString();
|
||||
async function getElementCenter(context, element) {
|
||||
const sandbox = await context.getOrCreateSandbox(undefined);
|
||||
const result = await sandbox.callFunction(CALCULATE_IN_VIEW_CENTER_PT_DECL, false, { type: 'undefined' }, [element]);
|
||||
if (result.type === 'exception') {
|
||||
throw new NoSuchElementException(`Origin element ${element.sharedId} was not found`);
|
||||
}
|
||||
assert(result.result.type === 'array');
|
||||
assert(result.result.value?.[0]?.type === 'number');
|
||||
assert(result.result.value?.[1]?.type === 'number');
|
||||
const { result: { value: [{ value: x }, { value: y }], }, } = result;
|
||||
return { x: x, y: y };
|
||||
}
|
||||
export class ActionDispatcher {
|
||||
static isMacOS = async (context) => {
|
||||
const result = await (await context.getOrCreateSandbox(undefined)).callFunction(IS_MAC_DECL, false);
|
||||
assert(result.type !== 'exception');
|
||||
assert(result.result.type === 'boolean');
|
||||
return result.result.value;
|
||||
};
|
||||
#tickStart = 0;
|
||||
#tickDuration = 0;
|
||||
#inputState;
|
||||
#context;
|
||||
#isMacOS;
|
||||
constructor(inputState, context, isMacOS) {
|
||||
this.#inputState = inputState;
|
||||
this.#context = context;
|
||||
this.#isMacOS = isMacOS;
|
||||
}
|
||||
async dispatchActions(optionsByTick) {
|
||||
await this.#inputState.queue.run(async () => {
|
||||
for (const options of optionsByTick) {
|
||||
await this.dispatchTickActions(options);
|
||||
}
|
||||
});
|
||||
}
|
||||
async dispatchTickActions(options) {
|
||||
this.#tickStart = performance.now();
|
||||
this.#tickDuration = 0;
|
||||
for (const { action } of options) {
|
||||
if ('duration' in action && action.duration !== undefined) {
|
||||
this.#tickDuration = Math.max(this.#tickDuration, action.duration);
|
||||
}
|
||||
}
|
||||
const promises = [
|
||||
new Promise((resolve) => setTimeout(resolve, this.#tickDuration)),
|
||||
];
|
||||
for (const option of options) {
|
||||
// In theory we have to wait for each action to happen, but CDP is serial,
|
||||
// so as an optimization, we queue all CDP commands at once and await all
|
||||
// of them.
|
||||
promises.push(this.#dispatchAction(option));
|
||||
}
|
||||
await Promise.all(promises);
|
||||
}
|
||||
async #dispatchAction({ id, action }) {
|
||||
const source = this.#inputState.get(id);
|
||||
const keyState = this.#inputState.getGlobalKeyState();
|
||||
switch (action.type) {
|
||||
case 'keyDown': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchKeyDownAction(source, action);
|
||||
this.#inputState.cancelList.push({
|
||||
id,
|
||||
action: {
|
||||
...action,
|
||||
type: 'keyUp',
|
||||
},
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'keyUp': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchKeyUpAction(source, action);
|
||||
break;
|
||||
}
|
||||
case 'pause': {
|
||||
// TODO: Implement waiting on the input source.
|
||||
break;
|
||||
}
|
||||
case 'pointerDown': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchPointerDownAction(source, keyState, action);
|
||||
this.#inputState.cancelList.push({
|
||||
id,
|
||||
action: {
|
||||
...action,
|
||||
type: 'pointerUp',
|
||||
},
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'pointerMove': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchPointerMoveAction(source, keyState, action);
|
||||
break;
|
||||
}
|
||||
case 'pointerUp': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchPointerUpAction(source, keyState, action);
|
||||
break;
|
||||
}
|
||||
case 'scroll': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchScrollAction(source, keyState, action);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
async #dispatchPointerDownAction(source, keyState, action) {
|
||||
const { button } = action;
|
||||
if (source.pressed.has(button)) {
|
||||
return;
|
||||
}
|
||||
source.pressed.add(button);
|
||||
const { x, y, subtype: pointerType } = source;
|
||||
const { width, height, pressure, twist, tangentialPressure } = action;
|
||||
const { tiltX, tiltY } = getTilt(action);
|
||||
// --- Platform-specific code begins here ---
|
||||
const { modifiers } = keyState;
|
||||
const { radiusX, radiusY } = getRadii(width ?? 1, height ?? 1);
|
||||
switch (pointerType) {
|
||||
case "mouse" /* Input.PointerType.Mouse */:
|
||||
case "pen" /* Input.PointerType.Pen */:
|
||||
// TODO: Implement width and height when available.
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mousePressed',
|
||||
x,
|
||||
y,
|
||||
modifiers,
|
||||
button: getCdpButton(button),
|
||||
buttons: source.buttons,
|
||||
clickCount: source.setClickCount(button, new PointerSource.ClickContext(x, y, performance.now())),
|
||||
pointerType,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure,
|
||||
});
|
||||
break;
|
||||
case "touch" /* Input.PointerType.Touch */:
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchTouchEvent', {
|
||||
type: 'touchStart',
|
||||
touchPoints: [
|
||||
{
|
||||
x,
|
||||
y,
|
||||
radiusX,
|
||||
radiusY,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure,
|
||||
id: source.pointerId,
|
||||
},
|
||||
],
|
||||
modifiers,
|
||||
});
|
||||
break;
|
||||
}
|
||||
source.radiusX = radiusX;
|
||||
source.radiusY = radiusY;
|
||||
source.force = pressure;
|
||||
// --- Platform-specific code ends here ---
|
||||
}
|
||||
#dispatchPointerUpAction(source, keyState, action) {
|
||||
const { button } = action;
|
||||
if (!source.pressed.has(button)) {
|
||||
return;
|
||||
}
|
||||
source.pressed.delete(button);
|
||||
const { x, y, force, radiusX, radiusY, subtype: pointerType } = source;
|
||||
// --- Platform-specific code begins here ---
|
||||
const { modifiers } = keyState;
|
||||
switch (pointerType) {
|
||||
case "mouse" /* Input.PointerType.Mouse */:
|
||||
case "pen" /* Input.PointerType.Pen */:
|
||||
// TODO: Implement width and height when available.
|
||||
return this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mouseReleased',
|
||||
x,
|
||||
y,
|
||||
modifiers,
|
||||
button: getCdpButton(button),
|
||||
buttons: source.buttons,
|
||||
clickCount: source.getClickCount(button),
|
||||
pointerType,
|
||||
});
|
||||
case "touch" /* Input.PointerType.Touch */:
|
||||
return this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchTouchEvent', {
|
||||
type: 'touchEnd',
|
||||
touchPoints: [
|
||||
{
|
||||
x,
|
||||
y,
|
||||
id: source.pointerId,
|
||||
force,
|
||||
radiusX,
|
||||
radiusY,
|
||||
},
|
||||
],
|
||||
modifiers,
|
||||
});
|
||||
}
|
||||
// --- Platform-specific code ends here ---
|
||||
}
|
||||
async #dispatchPointerMoveAction(source, keyState, action) {
|
||||
const { x: startX, y: startY, subtype: pointerType } = source;
|
||||
const { width, height, pressure, twist, tangentialPressure, x: offsetX, y: offsetY, origin = 'viewport', duration = this.#tickDuration, } = action;
|
||||
const { tiltX, tiltY } = getTilt(action);
|
||||
const { radiusX, radiusY } = getRadii(width ?? 1, height ?? 1);
|
||||
const { targetX, targetY } = await this.#getCoordinateFromOrigin(origin, offsetX, offsetY, startX, startY);
|
||||
if (targetX < 0 || targetY < 0) {
|
||||
throw new MoveTargetOutOfBoundsException(`Cannot move beyond viewport (x: ${targetX}, y: ${targetY})`);
|
||||
}
|
||||
let last;
|
||||
do {
|
||||
const ratio = duration > 0 ? (performance.now() - this.#tickStart) / duration : 1;
|
||||
last = ratio >= 1;
|
||||
let x;
|
||||
let y;
|
||||
if (last) {
|
||||
x = targetX;
|
||||
y = targetY;
|
||||
}
|
||||
else {
|
||||
x = Math.round(ratio * (targetX - startX) + startX);
|
||||
y = Math.round(ratio * (targetY - startY) + startY);
|
||||
}
|
||||
if (source.x !== x || source.y !== y) {
|
||||
// --- Platform-specific code begins here ---
|
||||
const { modifiers } = keyState;
|
||||
switch (pointerType) {
|
||||
case "mouse" /* Input.PointerType.Mouse */:
|
||||
// TODO: Implement width and height when available.
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mouseMoved',
|
||||
x,
|
||||
y,
|
||||
modifiers,
|
||||
clickCount: 0,
|
||||
button: getCdpButton(source.pressed.values().next().value ?? 5),
|
||||
buttons: source.buttons,
|
||||
pointerType,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure,
|
||||
});
|
||||
break;
|
||||
case "pen" /* Input.PointerType.Pen */:
|
||||
if (source.pressed.size !== 0) {
|
||||
// Empty `source.pressed.size` means the pen is not detected by digitizer.
|
||||
// Dispatch a mouse event for the pen only if either:
|
||||
// 1. the pen is hovering over the digitizer (0);
|
||||
// 2. the pen is in contact with the digitizer (1);
|
||||
// 3. the pen has at least one button pressed (2, 4, etc).
|
||||
// https://www.w3.org/TR/pointerevents/#the-buttons-property
|
||||
// TODO: Implement width and height when available.
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mouseMoved',
|
||||
x,
|
||||
y,
|
||||
modifiers,
|
||||
clickCount: 0,
|
||||
button: getCdpButton(source.pressed.values().next().value ?? 5),
|
||||
buttons: source.buttons,
|
||||
pointerType,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure ?? 0.5,
|
||||
});
|
||||
}
|
||||
break;
|
||||
case "touch" /* Input.PointerType.Touch */:
|
||||
if (source.pressed.size !== 0) {
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchTouchEvent', {
|
||||
type: 'touchMove',
|
||||
touchPoints: [
|
||||
{
|
||||
x,
|
||||
y,
|
||||
radiusX,
|
||||
radiusY,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure,
|
||||
id: source.pointerId,
|
||||
},
|
||||
],
|
||||
modifiers,
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
// --- Platform-specific code ends here ---
|
||||
source.x = x;
|
||||
source.y = y;
|
||||
source.radiusX = radiusX;
|
||||
source.radiusY = radiusY;
|
||||
source.force = pressure;
|
||||
}
|
||||
} while (!last);
|
||||
}
|
||||
async #getFrameOffset() {
|
||||
if (this.#context.id === this.#context.cdpTarget.id) {
|
||||
return { x: 0, y: 0 };
|
||||
}
|
||||
// https://github.com/w3c/webdriver/pull/1847 proposes dispatching events from
|
||||
// the top-level browsing context. This implementation dispatches it on the top-most
|
||||
// same-target frame, which is not top-level one in case of OOPiF.
|
||||
// TODO: switch to the top-level browsing context.
|
||||
const { backendNodeId } = await this.#context.cdpTarget.cdpClient.sendCommand('DOM.getFrameOwner', { frameId: this.#context.id });
|
||||
const { model: frameBoxModel } = await this.#context.cdpTarget.cdpClient.sendCommand('DOM.getBoxModel', {
|
||||
backendNodeId,
|
||||
});
|
||||
return { x: frameBoxModel.content[0], y: frameBoxModel.content[1] };
|
||||
}
|
||||
async #getCoordinateFromOrigin(origin, offsetX, offsetY, startX, startY) {
|
||||
let targetX;
|
||||
let targetY;
|
||||
const frameOffset = await this.#getFrameOffset();
|
||||
switch (origin) {
|
||||
case 'viewport':
|
||||
targetX = offsetX + frameOffset.x;
|
||||
targetY = offsetY + frameOffset.y;
|
||||
break;
|
||||
case 'pointer':
|
||||
targetX = startX + offsetX + frameOffset.x;
|
||||
targetY = startY + offsetY + frameOffset.y;
|
||||
break;
|
||||
default: {
|
||||
const { x: posX, y: posY } = await getElementCenter(this.#context, origin.element);
|
||||
// SAFETY: These can never be special numbers.
|
||||
targetX = posX + offsetX + frameOffset.x;
|
||||
targetY = posY + offsetY + frameOffset.y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { targetX, targetY };
|
||||
}
|
||||
async #dispatchScrollAction(_source, keyState, action) {
|
||||
const { deltaX: targetDeltaX, deltaY: targetDeltaY, x: offsetX, y: offsetY, origin = 'viewport', duration = this.#tickDuration, } = action;
|
||||
if (origin === 'pointer') {
|
||||
throw new InvalidArgumentException('"pointer" origin is invalid for scrolling.');
|
||||
}
|
||||
const { targetX, targetY } = await this.#getCoordinateFromOrigin(origin, offsetX, offsetY, 0, 0);
|
||||
if (targetX < 0 || targetY < 0) {
|
||||
throw new MoveTargetOutOfBoundsException(`Cannot move beyond viewport (x: ${targetX}, y: ${targetY})`);
|
||||
}
|
||||
let currentDeltaX = 0;
|
||||
let currentDeltaY = 0;
|
||||
let last;
|
||||
do {
|
||||
const ratio = duration > 0 ? (performance.now() - this.#tickStart) / duration : 1;
|
||||
last = ratio >= 1;
|
||||
let deltaX;
|
||||
let deltaY;
|
||||
if (last) {
|
||||
deltaX = targetDeltaX - currentDeltaX;
|
||||
deltaY = targetDeltaY - currentDeltaY;
|
||||
}
|
||||
else {
|
||||
deltaX = Math.round(ratio * targetDeltaX - currentDeltaX);
|
||||
deltaY = Math.round(ratio * targetDeltaY - currentDeltaY);
|
||||
}
|
||||
if (deltaX !== 0 || deltaY !== 0) {
|
||||
// --- Platform-specific code begins here ---
|
||||
const { modifiers } = keyState;
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mouseWheel',
|
||||
deltaX,
|
||||
deltaY,
|
||||
x: targetX,
|
||||
y: targetY,
|
||||
modifiers,
|
||||
});
|
||||
// --- Platform-specific code ends here ---
|
||||
currentDeltaX += deltaX;
|
||||
currentDeltaY += deltaY;
|
||||
}
|
||||
} while (!last);
|
||||
}
|
||||
async #dispatchKeyDownAction(source, action) {
|
||||
const rawKey = action.value;
|
||||
if (!isSingleGrapheme(rawKey)) {
|
||||
// https://w3c.github.io/webdriver/#dfn-process-a-key-action
|
||||
// WebDriver spec allows a grapheme to be used.
|
||||
throw new InvalidArgumentException(`Invalid key value: ${rawKey}`);
|
||||
}
|
||||
const isGrapheme = isSingleComplexGrapheme(rawKey);
|
||||
const key = getNormalizedKey(rawKey);
|
||||
const repeat = source.pressed.has(key);
|
||||
const code = getKeyCode(rawKey);
|
||||
const location = getKeyLocation(rawKey);
|
||||
switch (key) {
|
||||
case 'Alt':
|
||||
source.alt = true;
|
||||
break;
|
||||
case 'Shift':
|
||||
source.shift = true;
|
||||
break;
|
||||
case 'Control':
|
||||
source.ctrl = true;
|
||||
break;
|
||||
case 'Meta':
|
||||
source.meta = true;
|
||||
break;
|
||||
}
|
||||
source.pressed.add(key);
|
||||
const { modifiers } = source;
|
||||
// --- Platform-specific code begins here ---
|
||||
// The spread is a little hack so JS gives us an array of unicode characters
|
||||
// to measure.
|
||||
const unmodifiedText = getKeyEventUnmodifiedText(key, source, isGrapheme);
|
||||
const text = getKeyEventText(code ?? '', source) ?? unmodifiedText;
|
||||
let command;
|
||||
// The following commands need to be declared because Chromium doesn't
|
||||
// handle them. See
|
||||
// https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:third_party/blink/renderer/core/editing/editing_behavior.cc;l=169;drc=b8143cf1dfd24842890fcd831c4f5d909bef4fc4;bpv=0;bpt=1.
|
||||
if (this.#isMacOS && source.meta) {
|
||||
switch (code) {
|
||||
case 'KeyA':
|
||||
command = 'SelectAll';
|
||||
break;
|
||||
case 'KeyC':
|
||||
command = 'Copy';
|
||||
break;
|
||||
case 'KeyV':
|
||||
command = source.shift ? 'PasteAndMatchStyle' : 'Paste';
|
||||
break;
|
||||
case 'KeyX':
|
||||
command = 'Cut';
|
||||
break;
|
||||
case 'KeyZ':
|
||||
command = source.shift ? 'Redo' : 'Undo';
|
||||
break;
|
||||
default:
|
||||
// Intentionally empty.
|
||||
}
|
||||
}
|
||||
const promises = [
|
||||
this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchKeyEvent', {
|
||||
type: text ? 'keyDown' : 'rawKeyDown',
|
||||
windowsVirtualKeyCode: KeyToKeyCode[key],
|
||||
key,
|
||||
code,
|
||||
text,
|
||||
unmodifiedText,
|
||||
autoRepeat: repeat,
|
||||
isSystemKey: source.alt || undefined,
|
||||
location: location < 3 ? location : undefined,
|
||||
isKeypad: location === 3,
|
||||
modifiers,
|
||||
commands: command ? [command] : undefined,
|
||||
}),
|
||||
];
|
||||
// Drag cancelling happens on escape.
|
||||
if (key === 'Escape') {
|
||||
if (!source.alt &&
|
||||
((this.#isMacOS && !source.ctrl && !source.meta) || !this.#isMacOS)) {
|
||||
promises.push(this.#context.cdpTarget.cdpClient.sendCommand('Input.cancelDragging'));
|
||||
}
|
||||
}
|
||||
await Promise.all(promises);
|
||||
// --- Platform-specific code ends here ---
|
||||
}
|
||||
#dispatchKeyUpAction(source, action) {
|
||||
const rawKey = action.value;
|
||||
if (!isSingleGrapheme(rawKey)) {
|
||||
// https://w3c.github.io/webdriver/#dfn-process-a-key-action
|
||||
// WebDriver spec allows a grapheme to be used.
|
||||
throw new InvalidArgumentException(`Invalid key value: ${rawKey}`);
|
||||
}
|
||||
const isGrapheme = isSingleComplexGrapheme(rawKey);
|
||||
const key = getNormalizedKey(rawKey);
|
||||
if (!source.pressed.has(key)) {
|
||||
return;
|
||||
}
|
||||
const code = getKeyCode(rawKey);
|
||||
const location = getKeyLocation(rawKey);
|
||||
switch (key) {
|
||||
case 'Alt':
|
||||
source.alt = false;
|
||||
break;
|
||||
case 'Shift':
|
||||
source.shift = false;
|
||||
break;
|
||||
case 'Control':
|
||||
source.ctrl = false;
|
||||
break;
|
||||
case 'Meta':
|
||||
source.meta = false;
|
||||
break;
|
||||
}
|
||||
source.pressed.delete(key);
|
||||
const { modifiers } = source;
|
||||
// --- Platform-specific code begins here ---
|
||||
// The spread is a little hack so JS gives us an array of unicode characters
|
||||
// to measure.
|
||||
const unmodifiedText = getKeyEventUnmodifiedText(key, source, isGrapheme);
|
||||
const text = getKeyEventText(code ?? '', source) ?? unmodifiedText;
|
||||
return this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchKeyEvent', {
|
||||
type: 'keyUp',
|
||||
windowsVirtualKeyCode: KeyToKeyCode[key],
|
||||
key,
|
||||
code,
|
||||
text,
|
||||
unmodifiedText,
|
||||
location: location < 3 ? location : undefined,
|
||||
isSystemKey: source.alt || undefined,
|
||||
isKeypad: location === 3,
|
||||
modifiers,
|
||||
});
|
||||
// --- Platform-specific code ends here ---
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Translates a non-grapheme key to either an `undefined` for a special keys, or a single
|
||||
* character modified by shift if needed.
|
||||
*/
|
||||
const getKeyEventUnmodifiedText = (key, source, isGrapheme) => {
|
||||
if (isGrapheme) {
|
||||
// Graphemes should be presented as text in the CDP command.
|
||||
return key;
|
||||
}
|
||||
if (key === 'Enter') {
|
||||
return '\r';
|
||||
}
|
||||
// If key is not a single character, it is a normalized key value, and should be
|
||||
// presented as key, not text in the CDP command.
|
||||
return [...key].length === 1
|
||||
? source.shift
|
||||
? key.toLocaleUpperCase('en-US')
|
||||
: key
|
||||
: undefined;
|
||||
};
|
||||
const getKeyEventText = (code, source) => {
|
||||
if (source.ctrl) {
|
||||
switch (code) {
|
||||
case 'Digit2':
|
||||
if (source.shift) {
|
||||
return '\x00';
|
||||
}
|
||||
break;
|
||||
case 'KeyA':
|
||||
return '\x01';
|
||||
case 'KeyB':
|
||||
return '\x02';
|
||||
case 'KeyC':
|
||||
return '\x03';
|
||||
case 'KeyD':
|
||||
return '\x04';
|
||||
case 'KeyE':
|
||||
return '\x05';
|
||||
case 'KeyF':
|
||||
return '\x06';
|
||||
case 'KeyG':
|
||||
return '\x07';
|
||||
case 'KeyH':
|
||||
return '\x08';
|
||||
case 'KeyI':
|
||||
return '\x09';
|
||||
case 'KeyJ':
|
||||
return '\x0A';
|
||||
case 'KeyK':
|
||||
return '\x0B';
|
||||
case 'KeyL':
|
||||
return '\x0C';
|
||||
case 'KeyM':
|
||||
return '\x0D';
|
||||
case 'KeyN':
|
||||
return '\x0E';
|
||||
case 'KeyO':
|
||||
return '\x0F';
|
||||
case 'KeyP':
|
||||
return '\x10';
|
||||
case 'KeyQ':
|
||||
return '\x11';
|
||||
case 'KeyR':
|
||||
return '\x12';
|
||||
case 'KeyS':
|
||||
return '\x13';
|
||||
case 'KeyT':
|
||||
return '\x14';
|
||||
case 'KeyU':
|
||||
return '\x15';
|
||||
case 'KeyV':
|
||||
return '\x16';
|
||||
case 'KeyW':
|
||||
return '\x17';
|
||||
case 'KeyX':
|
||||
return '\x18';
|
||||
case 'KeyY':
|
||||
return '\x19';
|
||||
case 'KeyZ':
|
||||
return '\x1A';
|
||||
case 'BracketLeft':
|
||||
return '\x1B';
|
||||
case 'Backslash':
|
||||
return '\x1C';
|
||||
case 'BracketRight':
|
||||
return '\x1D';
|
||||
case 'Digit6':
|
||||
if (source.shift) {
|
||||
return '\x1E';
|
||||
}
|
||||
break;
|
||||
case 'Minus':
|
||||
return '\x1F';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
if (source.alt) {
|
||||
return '';
|
||||
}
|
||||
return;
|
||||
};
|
||||
function getCdpButton(button) {
|
||||
// https://www.w3.org/TR/pointerevents/#the-button-property
|
||||
switch (button) {
|
||||
case 0:
|
||||
return 'left';
|
||||
case 1:
|
||||
return 'middle';
|
||||
case 2:
|
||||
return 'right';
|
||||
case 3:
|
||||
return 'back';
|
||||
case 4:
|
||||
return 'forward';
|
||||
default:
|
||||
return 'none';
|
||||
}
|
||||
}
|
||||
function getTilt(action) {
|
||||
// https://w3c.github.io/pointerevents/#converting-between-tiltx-tilty-and-altitudeangle-azimuthangle
|
||||
const altitudeAngle = action.altitudeAngle ?? Math.PI / 2;
|
||||
const azimuthAngle = action.azimuthAngle ?? 0;
|
||||
let tiltXRadians = 0;
|
||||
let tiltYRadians = 0;
|
||||
if (altitudeAngle === 0) {
|
||||
// the pen is in the X-Y plane
|
||||
if (azimuthAngle === 0 || azimuthAngle === 2 * Math.PI) {
|
||||
// pen is on positive X axis
|
||||
tiltXRadians = Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle === Math.PI / 2) {
|
||||
// pen is on positive Y axis
|
||||
tiltYRadians = Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle === Math.PI) {
|
||||
// pen is on negative X axis
|
||||
tiltXRadians = -Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle === (3 * Math.PI) / 2) {
|
||||
// pen is on negative Y axis
|
||||
tiltYRadians = -Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle > 0 && azimuthAngle < Math.PI / 2) {
|
||||
tiltXRadians = Math.PI / 2;
|
||||
tiltYRadians = Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle > Math.PI / 2 && azimuthAngle < Math.PI) {
|
||||
tiltXRadians = -Math.PI / 2;
|
||||
tiltYRadians = Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle > Math.PI && azimuthAngle < (3 * Math.PI) / 2) {
|
||||
tiltXRadians = -Math.PI / 2;
|
||||
tiltYRadians = -Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle > (3 * Math.PI) / 2 && azimuthAngle < 2 * Math.PI) {
|
||||
tiltXRadians = Math.PI / 2;
|
||||
tiltYRadians = -Math.PI / 2;
|
||||
}
|
||||
}
|
||||
if (altitudeAngle !== 0) {
|
||||
const tanAlt = Math.tan(altitudeAngle);
|
||||
tiltXRadians = Math.atan(Math.cos(azimuthAngle) / tanAlt);
|
||||
tiltYRadians = Math.atan(Math.sin(azimuthAngle) / tanAlt);
|
||||
}
|
||||
const factor = 180 / Math.PI;
|
||||
return {
|
||||
tiltX: Math.round(tiltXRadians * factor),
|
||||
tiltY: Math.round(tiltYRadians * factor),
|
||||
};
|
||||
}
|
||||
function getRadii(width, height) {
|
||||
return {
|
||||
radiusX: width ? width / 2 : 0.5,
|
||||
radiusY: height ? height / 2 : 0.5,
|
||||
};
|
||||
}
|
||||
//# sourceMappingURL=ActionDispatcher.js.map
|
||||
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionDispatcher.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionDispatcher.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
22
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionOption.d.ts
generated
vendored
Normal file
22
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionOption.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import type { Input } from '../../../protocol/protocol.js';
|
||||
export type ActionOption = ActionOptionFor<Input.NoneSourceAction | Input.KeySourceAction | Input.PointerSourceAction | Input.WheelSourceAction>;
|
||||
export interface ActionOptionFor<A> {
|
||||
id: string;
|
||||
action: A;
|
||||
}
|
||||
18
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionOption.js
generated
vendored
Normal file
18
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionOption.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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 {};
|
||||
//# sourceMappingURL=ActionOption.js.map
|
||||
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionOption.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/ActionOption.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ActionOption.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/input/ActionOption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
||||
9
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputProcessor.d.ts
generated
vendored
Normal file
9
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import { Input, type EmptyResult } from '../../../protocol/protocol.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
export declare class InputProcessor {
|
||||
#private;
|
||||
constructor(browsingContextStorage: BrowsingContextStorage);
|
||||
performActions(params: Input.PerformActionsParameters): Promise<EmptyResult>;
|
||||
releaseActions(params: Input.ReleaseActionsParameters): Promise<EmptyResult>;
|
||||
setFiles(params: Input.SetFilesParameters): Promise<EmptyResult>;
|
||||
}
|
||||
188
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputProcessor.js
generated
vendored
Normal file
188
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { InvalidArgumentException, NoSuchElementException, UnableToSetFileInputException, NoSuchNodeException, } from '../../../protocol/protocol.js';
|
||||
import { assert } from '../../../utils/assert.js';
|
||||
import { ActionDispatcher } from '../input/ActionDispatcher.js';
|
||||
import { InputStateManager } from '../input/InputStateManager.js';
|
||||
export class InputProcessor {
|
||||
#browsingContextStorage;
|
||||
#inputStateManager = new InputStateManager();
|
||||
constructor(browsingContextStorage) {
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
}
|
||||
async performActions(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
const inputState = this.#inputStateManager.get(context.top);
|
||||
const actionsByTick = this.#getActionsByTick(params, inputState);
|
||||
const dispatcher = new ActionDispatcher(inputState, context, await ActionDispatcher.isMacOS(context).catch(() => false));
|
||||
await dispatcher.dispatchActions(actionsByTick);
|
||||
return {};
|
||||
}
|
||||
async releaseActions(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
const topContext = context.top;
|
||||
const inputState = this.#inputStateManager.get(topContext);
|
||||
const dispatcher = new ActionDispatcher(inputState, context, await ActionDispatcher.isMacOS(context).catch(() => false));
|
||||
await dispatcher.dispatchTickActions(inputState.cancelList.reverse());
|
||||
this.#inputStateManager.delete(topContext);
|
||||
return {};
|
||||
}
|
||||
async setFiles(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
const realm = await context.getOrCreateSandbox(undefined);
|
||||
let result;
|
||||
try {
|
||||
result = await realm.callFunction(String(function getFiles(fileListLength) {
|
||||
if (!(this instanceof HTMLInputElement)) {
|
||||
if (this instanceof Element) {
|
||||
return 1 /* ErrorCode.Element */;
|
||||
}
|
||||
return 0 /* ErrorCode.Node */;
|
||||
}
|
||||
if (this.type !== 'file') {
|
||||
return 2 /* ErrorCode.Type */;
|
||||
}
|
||||
if (this.disabled) {
|
||||
return 3 /* ErrorCode.Disabled */;
|
||||
}
|
||||
if (fileListLength > 1 && !this.multiple) {
|
||||
return 4 /* ErrorCode.Multiple */;
|
||||
}
|
||||
return;
|
||||
}), false, params.element, [{ type: 'number', value: params.files.length }]);
|
||||
}
|
||||
catch {
|
||||
throw new NoSuchNodeException(`Could not find element ${params.element.sharedId}`);
|
||||
}
|
||||
assert(result.type === 'success');
|
||||
if (result.result.type === 'number') {
|
||||
switch (result.result.value) {
|
||||
case 0 /* ErrorCode.Node */: {
|
||||
throw new NoSuchElementException(`Could not find element ${params.element.sharedId}`);
|
||||
}
|
||||
case 1 /* ErrorCode.Element */: {
|
||||
throw new UnableToSetFileInputException(`Element ${params.element.sharedId} is not a input`);
|
||||
}
|
||||
case 2 /* ErrorCode.Type */: {
|
||||
throw new UnableToSetFileInputException(`Input element ${params.element.sharedId} is not a file type`);
|
||||
}
|
||||
case 3 /* ErrorCode.Disabled */: {
|
||||
throw new UnableToSetFileInputException(`Input element ${params.element.sharedId} is disabled`);
|
||||
}
|
||||
case 4 /* ErrorCode.Multiple */: {
|
||||
throw new UnableToSetFileInputException(`Cannot set multiple files on a non-multiple input element`);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* The zero-length array is a special case, it seems that
|
||||
* DOM.setFileInputFiles does not actually update the files in that case, so
|
||||
* the solution is to eval the element value to a new FileList directly.
|
||||
*/
|
||||
if (params.files.length === 0) {
|
||||
// XXX: These events should converted to trusted events. Perhaps do this
|
||||
// in `DOM.setFileInputFiles`?
|
||||
await realm.callFunction(String(function dispatchEvent() {
|
||||
if (this.files?.length === 0) {
|
||||
this.dispatchEvent(new Event('cancel', {
|
||||
bubbles: true,
|
||||
}));
|
||||
return;
|
||||
}
|
||||
this.files = new DataTransfer().files;
|
||||
// Dispatch events for this case because it should behave akin to a user action.
|
||||
this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
|
||||
this.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
}), false, params.element);
|
||||
return {};
|
||||
}
|
||||
// Our goal here is to iterate over the input element files and get their
|
||||
// file paths.
|
||||
const paths = [];
|
||||
for (let i = 0; i < params.files.length; ++i) {
|
||||
const result = await realm.callFunction(String(function getFiles(index) {
|
||||
return this.files?.item(index);
|
||||
}), false, params.element, [{ type: 'number', value: 0 }], "root" /* Script.ResultOwnership.Root */);
|
||||
assert(result.type === 'success');
|
||||
if (result.result.type !== 'object') {
|
||||
break;
|
||||
}
|
||||
const { handle } = result.result;
|
||||
assert(handle !== undefined);
|
||||
const { path } = await realm.cdpClient.sendCommand('DOM.getFileInfo', {
|
||||
objectId: handle,
|
||||
});
|
||||
paths.push(path);
|
||||
// Cleanup the handle.
|
||||
void realm.disown(handle).catch(undefined);
|
||||
}
|
||||
paths.sort();
|
||||
// We create a new array so we preserve the order of the original files.
|
||||
const sortedFiles = [...params.files].sort();
|
||||
if (paths.length !== params.files.length ||
|
||||
sortedFiles.some((path, index) => {
|
||||
return paths[index] !== path;
|
||||
})) {
|
||||
const { objectId } = await realm.deserializeForCdp(params.element);
|
||||
// This cannot throw since this was just used in `callFunction` above.
|
||||
assert(objectId !== undefined);
|
||||
await realm.cdpClient.sendCommand('DOM.setFileInputFiles', {
|
||||
files: params.files,
|
||||
objectId,
|
||||
});
|
||||
}
|
||||
else {
|
||||
// XXX: We should dispatch a trusted event.
|
||||
await realm.callFunction(String(function dispatchEvent() {
|
||||
this.dispatchEvent(new Event('cancel', {
|
||||
bubbles: true,
|
||||
}));
|
||||
}), false, params.element);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
#getActionsByTick(params, inputState) {
|
||||
const actionsByTick = [];
|
||||
for (const action of params.actions) {
|
||||
switch (action.type) {
|
||||
case "pointer" /* SourceType.Pointer */: {
|
||||
action.parameters ??= { pointerType: "mouse" /* Input.PointerType.Mouse */ };
|
||||
action.parameters.pointerType ??= "mouse" /* Input.PointerType.Mouse */;
|
||||
const source = inputState.getOrCreate(action.id, "pointer" /* SourceType.Pointer */, action.parameters.pointerType);
|
||||
if (source.subtype !== action.parameters.pointerType) {
|
||||
throw new InvalidArgumentException(`Expected input source ${action.id} to be ${source.subtype}; got ${action.parameters.pointerType}.`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
inputState.getOrCreate(action.id, action.type);
|
||||
}
|
||||
const actions = action.actions.map((item) => ({
|
||||
id: action.id,
|
||||
action: item,
|
||||
}));
|
||||
for (let i = 0; i < actions.length; i++) {
|
||||
if (actionsByTick.length === i) {
|
||||
actionsByTick.push([]);
|
||||
}
|
||||
actionsByTick[i].push(actions[i]);
|
||||
}
|
||||
}
|
||||
return actionsByTick;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=InputProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputProcessor.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
72
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputSource.d.ts
generated
vendored
Normal file
72
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputSource.d.ts
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import type { Input } from '../../../protocol/protocol.js';
|
||||
export declare const enum SourceType {
|
||||
Key = "key",
|
||||
Pointer = "pointer",
|
||||
Wheel = "wheel",
|
||||
None = "none"
|
||||
}
|
||||
export declare class NoneSource {
|
||||
type: SourceType.None;
|
||||
}
|
||||
export declare class KeySource {
|
||||
#private;
|
||||
type: SourceType.Key;
|
||||
pressed: Set<string>;
|
||||
get modifiers(): number;
|
||||
get alt(): boolean;
|
||||
set alt(value: boolean);
|
||||
get ctrl(): boolean;
|
||||
set ctrl(value: boolean);
|
||||
get meta(): boolean;
|
||||
set meta(value: boolean);
|
||||
get shift(): boolean;
|
||||
set shift(value: boolean);
|
||||
}
|
||||
export declare class PointerSource {
|
||||
#private;
|
||||
type: SourceType.Pointer;
|
||||
subtype: Input.PointerType;
|
||||
pointerId: number;
|
||||
pressed: Set<number>;
|
||||
x: number;
|
||||
y: number;
|
||||
radiusX?: number;
|
||||
radiusY?: number;
|
||||
force?: number;
|
||||
constructor(id: number, subtype: Input.PointerType);
|
||||
get buttons(): number;
|
||||
static ClickContext: {
|
||||
new (x: number, y: number, time: number): {
|
||||
count: number;
|
||||
"__#94148@#x": number;
|
||||
"__#94148@#y": number;
|
||||
"__#94148@#time": number;
|
||||
compare(context: /*elided*/ any): boolean;
|
||||
};
|
||||
"__#94148@#DOUBLE_CLICK_TIME_MS": number;
|
||||
"__#94148@#MAX_DOUBLE_CLICK_RADIUS": number;
|
||||
};
|
||||
setClickCount(button: number, context: InstanceType<typeof PointerSource.ClickContext>): number;
|
||||
getClickCount(button: number): number;
|
||||
}
|
||||
export declare class WheelSource {
|
||||
type: SourceType.Wheel;
|
||||
}
|
||||
export type InputSource = NoneSource | KeySource | PointerSource | WheelSource;
|
||||
export type InputSourceFor<Type extends SourceType> = Type extends SourceType.Key ? KeySource : Type extends SourceType.Pointer ? PointerSource : Type extends SourceType.Wheel ? WheelSource : NoneSource;
|
||||
146
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputSource.js
generated
vendored
Normal file
146
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputSource.js
generated
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
var _a;
|
||||
export class NoneSource {
|
||||
type = "none" /* SourceType.None */;
|
||||
}
|
||||
export class KeySource {
|
||||
type = "key" /* SourceType.Key */;
|
||||
pressed = new Set();
|
||||
// This is a bitfield that matches the modifiers parameter of
|
||||
// https://chromedevtools.github.io/devtools-protocol/tot/Input/#method-dispatchKeyEvent
|
||||
#modifiers = 0;
|
||||
get modifiers() {
|
||||
return this.#modifiers;
|
||||
}
|
||||
get alt() {
|
||||
return (this.#modifiers & 1) === 1;
|
||||
}
|
||||
set alt(value) {
|
||||
this.#setModifier(value, 1);
|
||||
}
|
||||
get ctrl() {
|
||||
return (this.#modifiers & 2) === 2;
|
||||
}
|
||||
set ctrl(value) {
|
||||
this.#setModifier(value, 2);
|
||||
}
|
||||
get meta() {
|
||||
return (this.#modifiers & 4) === 4;
|
||||
}
|
||||
set meta(value) {
|
||||
this.#setModifier(value, 4);
|
||||
}
|
||||
get shift() {
|
||||
return (this.#modifiers & 8) === 8;
|
||||
}
|
||||
set shift(value) {
|
||||
this.#setModifier(value, 8);
|
||||
}
|
||||
#setModifier(value, bit) {
|
||||
if (value) {
|
||||
this.#modifiers |= bit;
|
||||
}
|
||||
else {
|
||||
this.#modifiers &= ~bit;
|
||||
}
|
||||
}
|
||||
}
|
||||
export class PointerSource {
|
||||
type = "pointer" /* SourceType.Pointer */;
|
||||
subtype;
|
||||
pointerId;
|
||||
pressed = new Set();
|
||||
x = 0;
|
||||
y = 0;
|
||||
radiusX;
|
||||
radiusY;
|
||||
force;
|
||||
constructor(id, subtype) {
|
||||
this.pointerId = id;
|
||||
this.subtype = subtype;
|
||||
}
|
||||
// This is a bitfield that matches the buttons parameter of
|
||||
// https://chromedevtools.github.io/devtools-protocol/tot/Input/#method-dispatchMouseEvent
|
||||
get buttons() {
|
||||
let buttons = 0;
|
||||
for (const button of this.pressed) {
|
||||
switch (button) {
|
||||
case 0:
|
||||
buttons |= 1;
|
||||
break;
|
||||
case 1:
|
||||
buttons |= 4;
|
||||
break;
|
||||
case 2:
|
||||
buttons |= 2;
|
||||
break;
|
||||
case 3:
|
||||
buttons |= 8;
|
||||
break;
|
||||
case 4:
|
||||
buttons |= 16;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return buttons;
|
||||
}
|
||||
// --- Platform-specific code starts here ---
|
||||
// Input.dispatchMouseEvent doesn't know the concept of double click, so we
|
||||
// need to create the logic, similar to how it's done for OSes:
|
||||
// https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:ui/events/event.cc;l=479
|
||||
static ClickContext = class ClickContext {
|
||||
static #DOUBLE_CLICK_TIME_MS = 500;
|
||||
static #MAX_DOUBLE_CLICK_RADIUS = 2;
|
||||
count = 0;
|
||||
#x;
|
||||
#y;
|
||||
#time;
|
||||
constructor(x, y, time) {
|
||||
this.#x = x;
|
||||
this.#y = y;
|
||||
this.#time = time;
|
||||
}
|
||||
compare(context) {
|
||||
return (
|
||||
// The click needs to be within a certain amount of ms.
|
||||
context.#time - this.#time > ClickContext.#DOUBLE_CLICK_TIME_MS ||
|
||||
// The click needs to be within a certain square radius.
|
||||
Math.abs(context.#x - this.#x) >
|
||||
ClickContext.#MAX_DOUBLE_CLICK_RADIUS ||
|
||||
Math.abs(context.#y - this.#y) > ClickContext.#MAX_DOUBLE_CLICK_RADIUS);
|
||||
}
|
||||
};
|
||||
#clickContexts = new Map();
|
||||
setClickCount(button, context) {
|
||||
let storedContext = this.#clickContexts.get(button);
|
||||
if (!storedContext || storedContext.compare(context)) {
|
||||
storedContext = context;
|
||||
}
|
||||
++storedContext.count;
|
||||
this.#clickContexts.set(button, storedContext);
|
||||
return storedContext.count;
|
||||
}
|
||||
getClickCount(button) {
|
||||
return this.#clickContexts.get(button)?.count ?? 0;
|
||||
}
|
||||
}
|
||||
_a = PointerSource;
|
||||
export class WheelSource {
|
||||
type = "wheel" /* SourceType.Wheel */;
|
||||
}
|
||||
//# sourceMappingURL=InputSource.js.map
|
||||
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputSource.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputSource.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InputSource.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/input/InputSource.ts"],"names":[],"mappings":"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"}
|
||||
29
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputState.d.ts
generated
vendored
Normal file
29
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputState.d.ts
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { Input } from '../../../protocol/protocol.js';
|
||||
import { Mutex } from '../../../utils/Mutex.js';
|
||||
import type { ActionOption } from './ActionOption.js';
|
||||
import { KeySource, PointerSource, SourceType, type InputSource, type InputSourceFor } from './InputSource.js';
|
||||
export declare class InputState {
|
||||
#private;
|
||||
cancelList: ActionOption[];
|
||||
getOrCreate(id: string, type: SourceType.Pointer, subtype: Input.PointerType): PointerSource;
|
||||
getOrCreate<Type extends SourceType>(id: string, type: Type): InputSourceFor<Type>;
|
||||
get(id: string): InputSource;
|
||||
getGlobalKeyState(): KeySource;
|
||||
get queue(): Mutex;
|
||||
}
|
||||
89
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputState.js
generated
vendored
Normal file
89
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputState.js
generated
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { InvalidArgumentException, UnknownErrorException, } from '../../../protocol/protocol.js';
|
||||
import { Mutex } from '../../../utils/Mutex.js';
|
||||
import { KeySource, NoneSource, PointerSource, WheelSource, } from './InputSource.js';
|
||||
export class InputState {
|
||||
cancelList = [];
|
||||
#sources = new Map();
|
||||
#mutex = new Mutex();
|
||||
getOrCreate(id, type, subtype) {
|
||||
let source = this.#sources.get(id);
|
||||
if (!source) {
|
||||
switch (type) {
|
||||
case "none" /* SourceType.None */:
|
||||
source = new NoneSource();
|
||||
break;
|
||||
case "key" /* SourceType.Key */:
|
||||
source = new KeySource();
|
||||
break;
|
||||
case "pointer" /* SourceType.Pointer */: {
|
||||
let pointerId = subtype === "mouse" /* Input.PointerType.Mouse */ ? 0 : 2;
|
||||
const pointerIds = new Set();
|
||||
for (const [, source] of this.#sources) {
|
||||
if (source.type === "pointer" /* SourceType.Pointer */) {
|
||||
pointerIds.add(source.pointerId);
|
||||
}
|
||||
}
|
||||
while (pointerIds.has(pointerId)) {
|
||||
++pointerId;
|
||||
}
|
||||
source = new PointerSource(pointerId, subtype);
|
||||
break;
|
||||
}
|
||||
case "wheel" /* SourceType.Wheel */:
|
||||
source = new WheelSource();
|
||||
break;
|
||||
default:
|
||||
throw new InvalidArgumentException(`Expected "${"none" /* SourceType.None */}", "${"key" /* SourceType.Key */}", "${"pointer" /* SourceType.Pointer */}", or "${"wheel" /* SourceType.Wheel */}". Found unknown source type ${type}.`);
|
||||
}
|
||||
this.#sources.set(id, source);
|
||||
return source;
|
||||
}
|
||||
if (source.type !== type) {
|
||||
throw new InvalidArgumentException(`Input source type of ${id} is ${source.type}, but received ${type}.`);
|
||||
}
|
||||
return source;
|
||||
}
|
||||
get(id) {
|
||||
const source = this.#sources.get(id);
|
||||
if (!source) {
|
||||
throw new UnknownErrorException(`Internal error.`);
|
||||
}
|
||||
return source;
|
||||
}
|
||||
getGlobalKeyState() {
|
||||
const state = new KeySource();
|
||||
for (const [, source] of this.#sources) {
|
||||
if (source.type !== "key" /* SourceType.Key */) {
|
||||
continue;
|
||||
}
|
||||
for (const pressed of source.pressed) {
|
||||
state.pressed.add(pressed);
|
||||
}
|
||||
state.alt ||= source.alt;
|
||||
state.ctrl ||= source.ctrl;
|
||||
state.meta ||= source.meta;
|
||||
state.shift ||= source.shift;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
get queue() {
|
||||
return this.#mutex;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=InputState.js.map
|
||||
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputState.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputState.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InputState.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/input/InputState.ts"],"names":[],"mappings":"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"}
|
||||
21
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputStateManager.d.ts
generated
vendored
Normal file
21
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputStateManager.d.ts
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import type { BrowsingContextImpl } from '../context/BrowsingContextImpl.js';
|
||||
import { InputState } from './InputState.js';
|
||||
export declare class InputStateManager extends WeakMap<BrowsingContextImpl, InputState> {
|
||||
get(context: BrowsingContextImpl): InputState;
|
||||
}
|
||||
30
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputStateManager.js
generated
vendored
Normal file
30
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputStateManager.js
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { assert } from '../../../utils/assert.js';
|
||||
import { InputState } from './InputState.js';
|
||||
// We use a weak map here as specified here:
|
||||
// https://www.w3.org/TR/webdriver/#dfn-browsing-context-input-state-map
|
||||
export class InputStateManager extends WeakMap {
|
||||
get(context) {
|
||||
assert(context.isTopLevelContext());
|
||||
if (!this.has(context)) {
|
||||
this.set(context, new InputState());
|
||||
}
|
||||
return super.get(context);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=InputStateManager.js.map
|
||||
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputStateManager.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/InputStateManager.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InputStateManager.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/input/InputStateManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAC;AAGhD,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAE3C,4CAA4C;AAC5C,wEAAwE;AACxE,MAAM,OAAO,iBAAkB,SAAQ,OAGtC;IACU,GAAG,CAAC,OAA4B;QACvC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,UAAU,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;IAC7B,CAAC;CACF"}
|
||||
17
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/USKeyboardLayout.d.ts
generated
vendored
Normal file
17
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/USKeyboardLayout.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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 declare const KeyToKeyCode: Record<string, number | undefined>;
|
||||
271
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/USKeyboardLayout.js
generated
vendored
Normal file
271
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/USKeyboardLayout.js
generated
vendored
Normal file
@@ -0,0 +1,271 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
// TODO: Remove this once https://crrev.com/c/4548290 is stably in Chromium.
|
||||
// `Input.dispatchKeyboardEvent` will automatically handle these conversions.
|
||||
export const KeyToKeyCode = {
|
||||
'0': 48,
|
||||
'1': 49,
|
||||
'2': 50,
|
||||
'3': 51,
|
||||
'4': 52,
|
||||
'5': 53,
|
||||
'6': 54,
|
||||
'7': 55,
|
||||
'8': 56,
|
||||
'9': 57,
|
||||
Abort: 3,
|
||||
Help: 6,
|
||||
Backspace: 8,
|
||||
Tab: 9,
|
||||
Numpad5: 12,
|
||||
NumpadEnter: 13,
|
||||
Enter: 13,
|
||||
'\\r': 13,
|
||||
'\\n': 13,
|
||||
ShiftLeft: 16,
|
||||
ShiftRight: 16,
|
||||
ControlLeft: 17,
|
||||
ControlRight: 17,
|
||||
AltLeft: 18,
|
||||
AltRight: 18,
|
||||
Pause: 19,
|
||||
CapsLock: 20,
|
||||
Escape: 27,
|
||||
Convert: 28,
|
||||
NonConvert: 29,
|
||||
Space: 32,
|
||||
Numpad9: 33,
|
||||
PageUp: 33,
|
||||
Numpad3: 34,
|
||||
PageDown: 34,
|
||||
End: 35,
|
||||
Numpad1: 35,
|
||||
Home: 36,
|
||||
Numpad7: 36,
|
||||
ArrowLeft: 37,
|
||||
Numpad4: 37,
|
||||
Numpad8: 38,
|
||||
ArrowUp: 38,
|
||||
ArrowRight: 39,
|
||||
Numpad6: 39,
|
||||
Numpad2: 40,
|
||||
ArrowDown: 40,
|
||||
Select: 41,
|
||||
Open: 43,
|
||||
PrintScreen: 44,
|
||||
Insert: 45,
|
||||
Numpad0: 45,
|
||||
Delete: 46,
|
||||
NumpadDecimal: 46,
|
||||
Digit0: 48,
|
||||
Digit1: 49,
|
||||
Digit2: 50,
|
||||
Digit3: 51,
|
||||
Digit4: 52,
|
||||
Digit5: 53,
|
||||
Digit6: 54,
|
||||
Digit7: 55,
|
||||
Digit8: 56,
|
||||
Digit9: 57,
|
||||
KeyA: 65,
|
||||
KeyB: 66,
|
||||
KeyC: 67,
|
||||
KeyD: 68,
|
||||
KeyE: 69,
|
||||
KeyF: 70,
|
||||
KeyG: 71,
|
||||
KeyH: 72,
|
||||
KeyI: 73,
|
||||
KeyJ: 74,
|
||||
KeyK: 75,
|
||||
KeyL: 76,
|
||||
KeyM: 77,
|
||||
KeyN: 78,
|
||||
KeyO: 79,
|
||||
KeyP: 80,
|
||||
KeyQ: 81,
|
||||
KeyR: 82,
|
||||
KeyS: 83,
|
||||
KeyT: 84,
|
||||
KeyU: 85,
|
||||
KeyV: 86,
|
||||
KeyW: 87,
|
||||
KeyX: 88,
|
||||
KeyY: 89,
|
||||
KeyZ: 90,
|
||||
MetaLeft: 91,
|
||||
MetaRight: 92,
|
||||
ContextMenu: 93,
|
||||
NumpadMultiply: 106,
|
||||
NumpadAdd: 107,
|
||||
NumpadSubtract: 109,
|
||||
NumpadDivide: 111,
|
||||
F1: 112,
|
||||
F2: 113,
|
||||
F3: 114,
|
||||
F4: 115,
|
||||
F5: 116,
|
||||
F6: 117,
|
||||
F7: 118,
|
||||
F8: 119,
|
||||
F9: 120,
|
||||
F10: 121,
|
||||
F11: 122,
|
||||
F12: 123,
|
||||
F13: 124,
|
||||
F14: 125,
|
||||
F15: 126,
|
||||
F16: 127,
|
||||
F17: 128,
|
||||
F18: 129,
|
||||
F19: 130,
|
||||
F20: 131,
|
||||
F21: 132,
|
||||
F22: 133,
|
||||
F23: 134,
|
||||
F24: 135,
|
||||
NumLock: 144,
|
||||
ScrollLock: 145,
|
||||
AudioVolumeMute: 173,
|
||||
AudioVolumeDown: 174,
|
||||
AudioVolumeUp: 175,
|
||||
MediaTrackNext: 176,
|
||||
MediaTrackPrevious: 177,
|
||||
MediaStop: 178,
|
||||
MediaPlayPause: 179,
|
||||
Semicolon: 186,
|
||||
Equal: 187,
|
||||
NumpadEqual: 187,
|
||||
Comma: 188,
|
||||
Minus: 189,
|
||||
Period: 190,
|
||||
Slash: 191,
|
||||
Backquote: 192,
|
||||
BracketLeft: 219,
|
||||
Backslash: 220,
|
||||
BracketRight: 221,
|
||||
Quote: 222,
|
||||
AltGraph: 225,
|
||||
Props: 247,
|
||||
Cancel: 3,
|
||||
Clear: 12,
|
||||
Shift: 16,
|
||||
Control: 17,
|
||||
Alt: 18,
|
||||
Accept: 30,
|
||||
ModeChange: 31,
|
||||
' ': 32,
|
||||
Print: 42,
|
||||
Execute: 43,
|
||||
'\\u0000': 46,
|
||||
a: 65,
|
||||
b: 66,
|
||||
c: 67,
|
||||
d: 68,
|
||||
e: 69,
|
||||
f: 70,
|
||||
g: 71,
|
||||
h: 72,
|
||||
i: 73,
|
||||
j: 74,
|
||||
k: 75,
|
||||
l: 76,
|
||||
m: 77,
|
||||
n: 78,
|
||||
o: 79,
|
||||
p: 80,
|
||||
q: 81,
|
||||
r: 82,
|
||||
s: 83,
|
||||
t: 84,
|
||||
u: 85,
|
||||
v: 86,
|
||||
w: 87,
|
||||
x: 88,
|
||||
y: 89,
|
||||
z: 90,
|
||||
Meta: 91,
|
||||
'*': 106,
|
||||
'+': 107,
|
||||
'-': 109,
|
||||
'/': 111,
|
||||
';': 186,
|
||||
'=': 187,
|
||||
',': 188,
|
||||
'.': 190,
|
||||
'`': 192,
|
||||
'[': 219,
|
||||
'\\\\': 220,
|
||||
']': 221,
|
||||
"'": 222,
|
||||
Attn: 246,
|
||||
CrSel: 247,
|
||||
ExSel: 248,
|
||||
EraseEof: 249,
|
||||
Play: 250,
|
||||
ZoomOut: 251,
|
||||
')': 48,
|
||||
'!': 49,
|
||||
'@': 50,
|
||||
'#': 51,
|
||||
$: 52,
|
||||
'%': 53,
|
||||
'^': 54,
|
||||
'&': 55,
|
||||
'(': 57,
|
||||
A: 65,
|
||||
B: 66,
|
||||
C: 67,
|
||||
D: 68,
|
||||
E: 69,
|
||||
F: 70,
|
||||
G: 71,
|
||||
H: 72,
|
||||
I: 73,
|
||||
J: 74,
|
||||
K: 75,
|
||||
L: 76,
|
||||
M: 77,
|
||||
N: 78,
|
||||
O: 79,
|
||||
P: 80,
|
||||
Q: 81,
|
||||
R: 82,
|
||||
S: 83,
|
||||
T: 84,
|
||||
U: 85,
|
||||
V: 86,
|
||||
W: 87,
|
||||
X: 88,
|
||||
Y: 89,
|
||||
Z: 90,
|
||||
':': 186,
|
||||
'<': 188,
|
||||
_: 189,
|
||||
'>': 190,
|
||||
'?': 191,
|
||||
'~': 192,
|
||||
'{': 219,
|
||||
'|': 220,
|
||||
'}': 221,
|
||||
'"': 222,
|
||||
Camera: 44,
|
||||
EndCall: 95,
|
||||
VolumeDown: 182,
|
||||
VolumeUp: 183,
|
||||
};
|
||||
//# sourceMappingURL=USKeyboardLayout.js.map
|
||||
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/USKeyboardLayout.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/USKeyboardLayout.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
31
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/keyUtils.d.ts
generated
vendored
Normal file
31
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/keyUtils.d.ts
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
/**
|
||||
* Returns the normalized key value for a given key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-normalized-key-value
|
||||
*/
|
||||
export declare function getNormalizedKey(value: string): string;
|
||||
/**
|
||||
* Returns the key code for a given key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-shifted-character
|
||||
*/
|
||||
export declare function getKeyCode(key: string): string | undefined;
|
||||
/**
|
||||
* Returns the location of the key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-key-location
|
||||
*/
|
||||
export declare function getKeyLocation(key: string): 0 | 1 | 2 | 3;
|
||||
492
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/keyUtils.js
generated
vendored
Normal file
492
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/keyUtils.js
generated
vendored
Normal file
@@ -0,0 +1,492 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
/**
|
||||
* Returns the normalized key value for a given key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-normalized-key-value
|
||||
*/
|
||||
export function getNormalizedKey(value) {
|
||||
switch (value) {
|
||||
case '\uE000':
|
||||
return 'Unidentified';
|
||||
case '\uE001':
|
||||
return 'Cancel';
|
||||
case '\uE002':
|
||||
return 'Help';
|
||||
case '\uE003':
|
||||
return 'Backspace';
|
||||
case '\uE004':
|
||||
return 'Tab';
|
||||
case '\uE005':
|
||||
return 'Clear';
|
||||
// Specification declares the '\uE006' to be `Return`, but it is not supported by
|
||||
// Chrome, so fall back to `Enter`, which aligns with WPT.
|
||||
case '\uE006':
|
||||
case '\uE007':
|
||||
return 'Enter';
|
||||
case '\uE008':
|
||||
return 'Shift';
|
||||
case '\uE009':
|
||||
return 'Control';
|
||||
case '\uE00A':
|
||||
return 'Alt';
|
||||
case '\uE00B':
|
||||
return 'Pause';
|
||||
case '\uE00C':
|
||||
return 'Escape';
|
||||
case '\uE00D':
|
||||
return ' ';
|
||||
case '\uE00E':
|
||||
return 'PageUp';
|
||||
case '\uE00F':
|
||||
return 'PageDown';
|
||||
case '\uE010':
|
||||
return 'End';
|
||||
case '\uE011':
|
||||
return 'Home';
|
||||
case '\uE012':
|
||||
return 'ArrowLeft';
|
||||
case '\uE013':
|
||||
return 'ArrowUp';
|
||||
case '\uE014':
|
||||
return 'ArrowRight';
|
||||
case '\uE015':
|
||||
return 'ArrowDown';
|
||||
case '\uE016':
|
||||
return 'Insert';
|
||||
case '\uE017':
|
||||
return 'Delete';
|
||||
case '\uE018':
|
||||
return ';';
|
||||
case '\uE019':
|
||||
return '=';
|
||||
case '\uE01A':
|
||||
return '0';
|
||||
case '\uE01B':
|
||||
return '1';
|
||||
case '\uE01C':
|
||||
return '2';
|
||||
case '\uE01D':
|
||||
return '3';
|
||||
case '\uE01E':
|
||||
return '4';
|
||||
case '\uE01F':
|
||||
return '5';
|
||||
case '\uE020':
|
||||
return '6';
|
||||
case '\uE021':
|
||||
return '7';
|
||||
case '\uE022':
|
||||
return '8';
|
||||
case '\uE023':
|
||||
return '9';
|
||||
case '\uE024':
|
||||
return '*';
|
||||
case '\uE025':
|
||||
return '+';
|
||||
case '\uE026':
|
||||
return ',';
|
||||
case '\uE027':
|
||||
return '-';
|
||||
case '\uE028':
|
||||
return '.';
|
||||
case '\uE029':
|
||||
return '/';
|
||||
case '\uE031':
|
||||
return 'F1';
|
||||
case '\uE032':
|
||||
return 'F2';
|
||||
case '\uE033':
|
||||
return 'F3';
|
||||
case '\uE034':
|
||||
return 'F4';
|
||||
case '\uE035':
|
||||
return 'F5';
|
||||
case '\uE036':
|
||||
return 'F6';
|
||||
case '\uE037':
|
||||
return 'F7';
|
||||
case '\uE038':
|
||||
return 'F8';
|
||||
case '\uE039':
|
||||
return 'F9';
|
||||
case '\uE03A':
|
||||
return 'F10';
|
||||
case '\uE03B':
|
||||
return 'F11';
|
||||
case '\uE03C':
|
||||
return 'F12';
|
||||
case '\uE03D':
|
||||
return 'Meta';
|
||||
case '\uE040':
|
||||
return 'ZenkakuHankaku';
|
||||
case '\uE050':
|
||||
return 'Shift';
|
||||
case '\uE051':
|
||||
return 'Control';
|
||||
case '\uE052':
|
||||
return 'Alt';
|
||||
case '\uE053':
|
||||
return 'Meta';
|
||||
case '\uE054':
|
||||
return 'PageUp';
|
||||
case '\uE055':
|
||||
return 'PageDown';
|
||||
case '\uE056':
|
||||
return 'End';
|
||||
case '\uE057':
|
||||
return 'Home';
|
||||
case '\uE058':
|
||||
return 'ArrowLeft';
|
||||
case '\uE059':
|
||||
return 'ArrowUp';
|
||||
case '\uE05A':
|
||||
return 'ArrowRight';
|
||||
case '\uE05B':
|
||||
return 'ArrowDown';
|
||||
case '\uE05C':
|
||||
return 'Insert';
|
||||
case '\uE05D':
|
||||
return 'Delete';
|
||||
default:
|
||||
return value;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the key code for a given key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-shifted-character
|
||||
*/
|
||||
export function getKeyCode(key) {
|
||||
switch (key) {
|
||||
case '`':
|
||||
case '~':
|
||||
return 'Backquote';
|
||||
case '\\':
|
||||
case '|':
|
||||
return 'Backslash';
|
||||
case '\uE003':
|
||||
return 'Backspace';
|
||||
case '[':
|
||||
case '{':
|
||||
return 'BracketLeft';
|
||||
case ']':
|
||||
case '}':
|
||||
return 'BracketRight';
|
||||
case ',':
|
||||
case '<':
|
||||
return 'Comma';
|
||||
case '0':
|
||||
case ')':
|
||||
return 'Digit0';
|
||||
case '1':
|
||||
case '!':
|
||||
return 'Digit1';
|
||||
case '2':
|
||||
case '@':
|
||||
return 'Digit2';
|
||||
case '3':
|
||||
case '#':
|
||||
return 'Digit3';
|
||||
case '4':
|
||||
case '$':
|
||||
return 'Digit4';
|
||||
case '5':
|
||||
case '%':
|
||||
return 'Digit5';
|
||||
case '6':
|
||||
case '^':
|
||||
return 'Digit6';
|
||||
case '7':
|
||||
case '&':
|
||||
return 'Digit7';
|
||||
case '8':
|
||||
case '*':
|
||||
return 'Digit8';
|
||||
case '9':
|
||||
case '(':
|
||||
return 'Digit9';
|
||||
case '=':
|
||||
case '+':
|
||||
return 'Equal';
|
||||
// The spec declares the '<' to be `IntlBackslash` as well, but it is already covered
|
||||
// in the `Comma` above.
|
||||
case '>':
|
||||
return 'IntlBackslash';
|
||||
case 'a':
|
||||
case 'A':
|
||||
return 'KeyA';
|
||||
case 'b':
|
||||
case 'B':
|
||||
return 'KeyB';
|
||||
case 'c':
|
||||
case 'C':
|
||||
return 'KeyC';
|
||||
case 'd':
|
||||
case 'D':
|
||||
return 'KeyD';
|
||||
case 'e':
|
||||
case 'E':
|
||||
return 'KeyE';
|
||||
case 'f':
|
||||
case 'F':
|
||||
return 'KeyF';
|
||||
case 'g':
|
||||
case 'G':
|
||||
return 'KeyG';
|
||||
case 'h':
|
||||
case 'H':
|
||||
return 'KeyH';
|
||||
case 'i':
|
||||
case 'I':
|
||||
return 'KeyI';
|
||||
case 'j':
|
||||
case 'J':
|
||||
return 'KeyJ';
|
||||
case 'k':
|
||||
case 'K':
|
||||
return 'KeyK';
|
||||
case 'l':
|
||||
case 'L':
|
||||
return 'KeyL';
|
||||
case 'm':
|
||||
case 'M':
|
||||
return 'KeyM';
|
||||
case 'n':
|
||||
case 'N':
|
||||
return 'KeyN';
|
||||
case 'o':
|
||||
case 'O':
|
||||
return 'KeyO';
|
||||
case 'p':
|
||||
case 'P':
|
||||
return 'KeyP';
|
||||
case 'q':
|
||||
case 'Q':
|
||||
return 'KeyQ';
|
||||
case 'r':
|
||||
case 'R':
|
||||
return 'KeyR';
|
||||
case 's':
|
||||
case 'S':
|
||||
return 'KeyS';
|
||||
case 't':
|
||||
case 'T':
|
||||
return 'KeyT';
|
||||
case 'u':
|
||||
case 'U':
|
||||
return 'KeyU';
|
||||
case 'v':
|
||||
case 'V':
|
||||
return 'KeyV';
|
||||
case 'w':
|
||||
case 'W':
|
||||
return 'KeyW';
|
||||
case 'x':
|
||||
case 'X':
|
||||
return 'KeyX';
|
||||
case 'y':
|
||||
case 'Y':
|
||||
return 'KeyY';
|
||||
case 'z':
|
||||
case 'Z':
|
||||
return 'KeyZ';
|
||||
case '-':
|
||||
case '_':
|
||||
return 'Minus';
|
||||
case '.':
|
||||
return 'Period';
|
||||
case "'":
|
||||
case '"':
|
||||
return 'Quote';
|
||||
case ';':
|
||||
case ':':
|
||||
return 'Semicolon';
|
||||
case '/':
|
||||
case '?':
|
||||
return 'Slash';
|
||||
case '\uE00A':
|
||||
return 'AltLeft';
|
||||
case '\uE052':
|
||||
return 'AltRight';
|
||||
case '\uE009':
|
||||
return 'ControlLeft';
|
||||
case '\uE051':
|
||||
return 'ControlRight';
|
||||
case '\uE006':
|
||||
return 'Enter';
|
||||
case '\uE00B':
|
||||
return 'Pause';
|
||||
case '\uE03D':
|
||||
return 'MetaLeft';
|
||||
case '\uE053':
|
||||
return 'MetaRight';
|
||||
case '\uE008':
|
||||
return 'ShiftLeft';
|
||||
case '\uE050':
|
||||
return 'ShiftRight';
|
||||
case ' ':
|
||||
case '\uE00D':
|
||||
return 'Space';
|
||||
case '\uE004':
|
||||
return 'Tab';
|
||||
case '\uE017':
|
||||
return 'Delete';
|
||||
case '\uE010':
|
||||
return 'End';
|
||||
case '\uE002':
|
||||
return 'Help';
|
||||
case '\uE011':
|
||||
return 'Home';
|
||||
case '\uE016':
|
||||
return 'Insert';
|
||||
case '\uE00F':
|
||||
return 'PageDown';
|
||||
case '\uE00E':
|
||||
return 'PageUp';
|
||||
case '\uE015':
|
||||
return 'ArrowDown';
|
||||
case '\uE012':
|
||||
return 'ArrowLeft';
|
||||
case '\uE014':
|
||||
return 'ArrowRight';
|
||||
case '\uE013':
|
||||
return 'ArrowUp';
|
||||
case '\uE00C':
|
||||
return 'Escape';
|
||||
case '\uE031':
|
||||
return 'F1';
|
||||
case '\uE032':
|
||||
return 'F2';
|
||||
case '\uE033':
|
||||
return 'F3';
|
||||
case '\uE034':
|
||||
return 'F4';
|
||||
case '\uE035':
|
||||
return 'F5';
|
||||
case '\uE036':
|
||||
return 'F6';
|
||||
case '\uE037':
|
||||
return 'F7';
|
||||
case '\uE038':
|
||||
return 'F8';
|
||||
case '\uE039':
|
||||
return 'F9';
|
||||
case '\uE03A':
|
||||
return 'F10';
|
||||
case '\uE03B':
|
||||
return 'F11';
|
||||
case '\uE03C':
|
||||
return 'F12';
|
||||
case '\uE019':
|
||||
return 'NumpadEqual';
|
||||
case '\uE01A':
|
||||
case '\uE05C':
|
||||
return 'Numpad0';
|
||||
case '\uE01B':
|
||||
case '\uE056':
|
||||
return 'Numpad1';
|
||||
case '\uE01C':
|
||||
case '\uE05B':
|
||||
return 'Numpad2';
|
||||
case '\uE01D':
|
||||
case '\uE055':
|
||||
return 'Numpad3';
|
||||
case '\uE01E':
|
||||
case '\uE058':
|
||||
return 'Numpad4';
|
||||
case '\uE01F':
|
||||
return 'Numpad5';
|
||||
case '\uE020':
|
||||
case '\uE05A':
|
||||
return 'Numpad6';
|
||||
case '\uE021':
|
||||
case '\uE057':
|
||||
return 'Numpad7';
|
||||
case '\uE022':
|
||||
case '\uE059':
|
||||
return 'Numpad8';
|
||||
case '\uE023':
|
||||
case '\uE054':
|
||||
return 'Numpad9';
|
||||
case '\uE025':
|
||||
return 'NumpadAdd';
|
||||
case '\uE026':
|
||||
return 'NumpadComma';
|
||||
case '\uE028':
|
||||
case '\uE05D':
|
||||
return 'NumpadDecimal';
|
||||
case '\uE029':
|
||||
return 'NumpadDivide';
|
||||
case '\uE007':
|
||||
return 'NumpadEnter';
|
||||
case '\uE024':
|
||||
return 'NumpadMultiply';
|
||||
case '\uE027':
|
||||
return 'NumpadSubtract';
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the location of the key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-key-location
|
||||
*/
|
||||
export function getKeyLocation(key) {
|
||||
switch (key) {
|
||||
case '\uE007':
|
||||
case '\uE008':
|
||||
case '\uE009':
|
||||
case '\uE00A':
|
||||
case '\uE03D':
|
||||
return 1;
|
||||
case '\uE019':
|
||||
case '\uE01A':
|
||||
case '\uE01B':
|
||||
case '\uE01C':
|
||||
case '\uE01D':
|
||||
case '\uE01E':
|
||||
case '\uE01F':
|
||||
case '\uE020':
|
||||
case '\uE021':
|
||||
case '\uE022':
|
||||
case '\uE023':
|
||||
case '\uE024':
|
||||
case '\uE025':
|
||||
case '\uE026':
|
||||
case '\uE027':
|
||||
case '\uE028':
|
||||
case '\uE029':
|
||||
case '\uE054':
|
||||
case '\uE055':
|
||||
case '\uE056':
|
||||
case '\uE057':
|
||||
case '\uE058':
|
||||
case '\uE059':
|
||||
case '\uE05A':
|
||||
case '\uE05B':
|
||||
case '\uE05C':
|
||||
case '\uE05D':
|
||||
return 3;
|
||||
case '\uE050':
|
||||
case '\uE051':
|
||||
case '\uE052':
|
||||
case '\uE053':
|
||||
return 2;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=keyUtils.js.map
|
||||
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/keyUtils.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/esm/bidiMapper/modules/input/keyUtils.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user