Skip to content

Commit c5da92f

Browse files
kalenikaliaksandrgmta
authored andcommitted
LibWeb: Try to dispatch wheel event on hit-testing target first
...before falling back to containing block. Fixes a bug when we can't scroll innermost scrollable element, because wheel event dispatching immediately falls back to containing block.
1 parent b1a7782 commit c5da92f

File tree

3 files changed

+72
-1
lines changed

3 files changed

+72
-1
lines changed

Libraries/LibWeb/Page/EventHandler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ EventResult EventHandler::handle_mousewheel(CSSPixelPoint viewport_position, CSS
408408
paintable = result->paintable;
409409

410410
if (paintable) {
411-
auto* containing_block = paintable->containing_block();
411+
Painting::Paintable* containing_block = paintable;
412412
while (containing_block) {
413413
auto handled_scroll_event = containing_block->handle_mousewheel({}, viewport_position, buttons, modifiers, wheel_delta_x, wheel_delta_y);
414414
if (handled_scroll_event)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
inner.scrollTop: 100, inner.scrollLeft: 0
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<!DOCTYPE html>
2+
<script src="include.js"></script>
3+
<style>
4+
body {
5+
margin: 0;
6+
}
7+
8+
#outer {
9+
transform-origin: top left;
10+
transform: scale(2);
11+
width: 200px;
12+
height: 200px;
13+
}
14+
15+
#inner {
16+
width: 100px;
17+
height: 100px;
18+
border: 1px solid black;
19+
overflow: scroll;
20+
}
21+
22+
.box {
23+
width: 50px;
24+
height: 50px;
25+
background: darkorange;
26+
box-sizing: border-box;
27+
border: 10px solid darkorchid;
28+
}
29+
30+
#top-level {
31+
width: 300px;
32+
height: 300px;
33+
overflow: scroll;
34+
outline: 2px solid blue;
35+
}
36+
37+
#something-big {
38+
height: 1000px;
39+
background-color: blue;
40+
}
41+
</style>
42+
<div id="top-level">
43+
<div id="outer">
44+
<div id="inner">
45+
<div class="box">1</div>
46+
<div class="box">2</div>
47+
<div class="box">3</div>
48+
<div class="box">4</div>
49+
<div class="box">5</div>
50+
<div class="box">6</div>
51+
<div class="box">7</div>
52+
<div class="box">8</div>
53+
<div class="box">9</div>
54+
<div class="box">10</div>
55+
<div class="box">11</div>
56+
<div class="box">12</div>
57+
</div>
58+
</div>
59+
<div id="something-big"></div>
60+
</div>
61+
<script>
62+
asyncTest(async done => {
63+
inner.onscroll = () => {
64+
println(`inner.scrollTop: ${inner.scrollTop}, inner.scrollLeft: ${inner.scrollLeft}`);
65+
done();
66+
};
67+
68+
internals.wheel(200, 100, 0, 100);
69+
});
70+
</script>

0 commit comments

Comments
 (0)