Skip to content

Commit 32a57a6

Browse files
authored
Improve Mouse Wheel (#1785)
* Improve Mouse Wheel * Code factor
1 parent ad28b6f commit 32a57a6

File tree

5 files changed

+134
-5
lines changed

5 files changed

+134
-5
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<style>
6+
body {
7+
min-height: 100vh;
8+
margin: 0;
9+
display: flex;
10+
align-items: center;
11+
justify-content: center;
12+
}
13+
14+
div {
15+
width: 105px;
16+
height: 105px;
17+
background: #cdf;
18+
padding: 5px;
19+
}
20+
</style>
21+
<title>Element: wheel event - Scaling_an_element_via_the_wheel - code sample</title>
22+
</head>
23+
<body>
24+
<div>Scale me with your mouse wheel.</div>
25+
<script>
26+
function zoom(event) {
27+
event.preventDefault();
28+
29+
scale += event.deltaY * -0.01;
30+
31+
// Restrict scale
32+
scale = Math.min(Math.max(.125, scale), 4);
33+
34+
// Apply scale transform
35+
el.style.transform = `scale(${scale})`;
36+
}
37+
38+
let scale = 1;
39+
const el = document.querySelector('div');
40+
el.onwheel = zoom;
41+
</script>
42+
</body>
43+
</html>

lib/PuppeteerSharp.Tests/MouseTests/MouseTests.cs

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,35 @@ public MouseTests(ITestOutputHelper output) : base(output)
2626
{
2727
}
2828

29+
[PuppeteerTest("mouse.spec.ts", "Mouse", "should click the document")]
30+
[Fact(Timeout = TestConstants.DefaultTestTimeout)]
31+
public async Task ShouldClickTheDocument()
32+
{
33+
await Page.EvaluateFunctionAsync(@"() => {
34+
globalThis.clickPromise = new Promise((resolve) => {
35+
document.addEventListener('click', (event) => {
36+
resolve({
37+
type: event.type,
38+
detail: event.detail,
39+
clientX: event.clientX,
40+
clientY: event.clientY,
41+
isTrusted: event.isTrusted,
42+
button: event.button,
43+
});
44+
});
45+
});
46+
}");
47+
await Page.Mouse.ClickAsync(50, 60);
48+
var e = await Page.EvaluateFunctionAsync<MouseEvent>("() => globalThis.clickPromise");
49+
50+
Assert.Equal("click", e.Type);
51+
Assert.Equal(1, e.Detail);
52+
Assert.Equal(50, e.ClientX);
53+
Assert.Equal(60, e.ClientY);
54+
Assert.True(e.IsTrusted);
55+
Assert.Equal(0, e.Button);
56+
}
57+
2958
[PuppeteerTest("mouse.spec.ts", "Mouse", "should resize the textarea")]
3059
[SkipBrowserFact(skipFirefox: true)]
3160
public async Task ShouldResizeTheTextarea()
@@ -115,16 +144,37 @@ public async Task ShouldSetModifierKeysOnClick()
115144
}
116145
}
117146

147+
[PuppeteerTest("mouse.spec.ts", "Mouse", "should send mouse wheel events")]
148+
[SkipBrowserFact(skipFirefox: true)]
149+
public async Task ShouldSendMouseWheelEvents()
150+
{
151+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/wheel.html");
152+
var elem = await Page.QuerySelectorAsync("div");
153+
var boundingBoxBefore = await elem.BoundingBoxAsync();
154+
Assert.Equal(115, boundingBoxBefore.Width);
155+
Assert.Equal(115, boundingBoxBefore.Height);
156+
157+
await Page.Mouse.MoveAsync(
158+
boundingBoxBefore.X + (boundingBoxBefore.Width / 2),
159+
boundingBoxBefore.Y + (boundingBoxBefore.Height / 2)
160+
);
161+
162+
await Page.Mouse.WheelAsync(0, -100);
163+
var boundingBoxAfter = await elem.BoundingBoxAsync();
164+
Assert.Equal(230, boundingBoxAfter.Width);
165+
Assert.Equal(230, boundingBoxAfter.Height);
166+
}
167+
118168
[PuppeteerTest("mouse.spec.ts", "Mouse", "should tween mouse movement")]
119169
[SkipBrowserFact(skipFirefox: true)]
120170
public async Task ShouldTweenMouseMovement()
121171
{
122172
await Page.Mouse.MoveAsync(100, 100);
123173
await Page.EvaluateExpressionAsync(@"{
124-
window.result = [];
125-
document.addEventListener('mousemove', event => {
126-
window.result.push([event.clientX, event.clientY]);
127-
});
174+
window.result = [];
175+
document.addEventListener('mousemove', event => {
176+
window.result.push([event.clientX, event.clientY]);
177+
});
128178
}");
129179
await Page.Mouse.MoveAsync(200, 300, new MoveOptions { Steps = 5 });
130180
Assert.Equal(new[] {
@@ -192,5 +242,20 @@ public void Scroll(decimal deltaX, decimal deltaY)
192242
Y = Math.Max(0, Y + deltaY);
193243
}
194244
}
245+
246+
internal struct MouseEvent
247+
{
248+
public string Type { get; set; }
249+
250+
public int Detail { get; set; }
251+
252+
public int ClientX { get; set; }
253+
254+
public int ClientY { get; set; }
255+
256+
public bool IsTrusted { get; set; }
257+
258+
public int Button { get; set; }
259+
}
195260
}
196261
}

lib/PuppeteerSharp/Input/Mouse.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,11 @@ public Task WheelAsync(decimal deltaX, decimal deltaY)
143143
{
144144
Type = MouseEventType.MouseWheel,
145145
DeltaX = deltaX,
146-
DeltaY = deltaY
146+
DeltaY = deltaY,
147+
X = _x,
148+
Y = _y,
149+
Modifiers = _keyboard.Modifiers,
150+
PointerType = PointerType.Mouse
147151
});
148152
}
149153
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System.Runtime.Serialization;
2+
using Newtonsoft.Json;
3+
using Newtonsoft.Json.Converters;
4+
5+
namespace PuppeteerSharp.Input
6+
{
7+
[JsonConverter(typeof(StringEnumConverter))]
8+
internal enum PointerType
9+
{
10+
[EnumMember(Value = "mouse")]
11+
Mouse,
12+
[EnumMember(Value = "pen")]
13+
Pen,
14+
}
15+
}

lib/PuppeteerSharp/Messaging/InputDispatchMouseEventRequest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,7 @@ internal class InputDispatchMouseEventRequest
1919
public decimal DeltaX { get; set; }
2020

2121
public decimal DeltaY { get; set; }
22+
23+
public PointerType PointerType { get; set; }
2224
}
2325
}

0 commit comments

Comments
 (0)