mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(webkit): proper value for event.buttons (#7680)
This commit is contained in:
parent
865aff8c9d
commit
2f07846c9a
@ -35,6 +35,17 @@ function toModifiersMask(modifiers: Set<types.KeyboardModifier>): number {
|
|||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toButtonsMask(buttons: Set<types.MouseButton>): number {
|
||||||
|
let mask = 0;
|
||||||
|
if (buttons.has('left'))
|
||||||
|
mask |= 1;
|
||||||
|
if (buttons.has('middle'))
|
||||||
|
mask |= 2;
|
||||||
|
if (buttons.has('right'))
|
||||||
|
mask |= 4;
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
export class RawKeyboardImpl implements input.RawKeyboard {
|
export class RawKeyboardImpl implements input.RawKeyboard {
|
||||||
private readonly _pageProxySession: WKSession;
|
private readonly _pageProxySession: WKSession;
|
||||||
private _session?: WKSession;
|
private _session?: WKSession;
|
||||||
@ -99,6 +110,7 @@ export class RawMouseImpl implements input.RawMouse {
|
|||||||
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
||||||
type: 'move',
|
type: 'move',
|
||||||
button,
|
button,
|
||||||
|
buttons: toButtonsMask(buttons),
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
modifiers: toModifiersMask(modifiers)
|
modifiers: toModifiersMask(modifiers)
|
||||||
@ -109,6 +121,7 @@ export class RawMouseImpl implements input.RawMouse {
|
|||||||
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
||||||
type: 'down',
|
type: 'down',
|
||||||
button,
|
button,
|
||||||
|
buttons: toButtonsMask(buttons),
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
modifiers: toModifiersMask(modifiers),
|
modifiers: toModifiersMask(modifiers),
|
||||||
@ -120,6 +133,7 @@ export class RawMouseImpl implements input.RawMouse {
|
|||||||
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
await this._pageProxySession.send('Input.dispatchMouseEvent', {
|
||||||
type: 'up',
|
type: 'up',
|
||||||
button,
|
button,
|
||||||
|
buttons: toButtonsMask(buttons),
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
modifiers: toModifiersMask(modifiers),
|
modifiers: toModifiersMask(modifiers),
|
||||||
|
|||||||
@ -252,6 +252,36 @@ it('should work if not doing a drag', async ({page}) => {
|
|||||||
expect(await eventsHandle.jsonValue()).toEqual(['mousemove', 'mousedown', 'mousemove', 'mouseup']);
|
expect(await eventsHandle.jsonValue()).toEqual(['mousemove', 'mousedown', 'mousemove', 'mouseup']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should report event.buttons', async ({page, browserName}) => {
|
||||||
|
const logsHandle = await page.evaluateHandle(async () => {
|
||||||
|
const div = document.createElement('div');
|
||||||
|
document.body.appendChild(div);
|
||||||
|
div.style.width = '200px';
|
||||||
|
div.style.height = '200px';
|
||||||
|
div.style.backgroundColor = 'blue';
|
||||||
|
div.addEventListener('mousedown', onEvent);
|
||||||
|
div.addEventListener('mousemove', onEvent, { passive: false });
|
||||||
|
div.addEventListener('mouseup', onEvent);
|
||||||
|
const logs = [];
|
||||||
|
function onEvent(event) {
|
||||||
|
logs.push({ type: event.type, buttons: event.buttons });
|
||||||
|
}
|
||||||
|
await new Promise(requestAnimationFrame);
|
||||||
|
return logs;
|
||||||
|
});
|
||||||
|
await page.mouse.move(20, 20);
|
||||||
|
await page.mouse.down();
|
||||||
|
await page.mouse.move(40, 40);
|
||||||
|
await page.mouse.up();
|
||||||
|
const logs = await logsHandle.jsonValue();
|
||||||
|
expect(logs).toEqual([
|
||||||
|
{ type: 'mousemove', buttons: 0 },
|
||||||
|
{ type: 'mousedown', buttons: 1 },
|
||||||
|
{ type: 'mousemove', buttons: 1 },
|
||||||
|
{ type: 'mouseup', buttons: 0 },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
async function trackEvents(target: ElementHandle) {
|
async function trackEvents(target: ElementHandle) {
|
||||||
const eventsHandle = await target.evaluateHandle(target => {
|
const eventsHandle = await target.evaluateHandle(target => {
|
||||||
const events: string[] = [];
|
const events: string[] = [];
|
||||||
|
|||||||
@ -164,25 +164,3 @@ it('should tween mouse movement', async ({page, browserName, isAndroid}) => {
|
|||||||
[200, 300]
|
[200, 300]
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should keep button state on move', async ({page, browserName, isAndroid}) => {
|
|
||||||
it.skip(isAndroid, 'Bad rounding');
|
|
||||||
it.fixme(browserName === 'webkit', 'https://github.com/microsoft/playwright/issues/7576');
|
|
||||||
|
|
||||||
// The test becomes flaky on WebKit without next line.
|
|
||||||
if (browserName === 'webkit')
|
|
||||||
await page.evaluate(() => new Promise(requestAnimationFrame));
|
|
||||||
await page.mouse.move(100, 100);
|
|
||||||
await page.evaluate(() => {
|
|
||||||
window['result'] = [];
|
|
||||||
document.addEventListener('mousemove', event => {
|
|
||||||
window['result'].push(event.buttons);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
await page.mouse.move(110, 110);
|
|
||||||
await page.mouse.down();
|
|
||||||
await page.mouse.move(130, 130, {steps: 2});
|
|
||||||
await page.mouse.up();
|
|
||||||
await page.mouse.move(110, 110);
|
|
||||||
expect(await page.evaluate('result')).toEqual([0, 1, 1, 0]);
|
|
||||||
});
|
|
||||||
Loading…
x
Reference in New Issue
Block a user