فهرست منبع

LibWeb: Skip page scrolling for wheel events consumed by scrollable box

Leftover from 90879a07ba6ab3cf61c52b3d601f1ed5052b807c
Aliaksandr Kalenik 1 سال پیش
والد
کامیت
0afbd827e0

+ 2 - 0
Tests/LibWeb/Text/expected/wheel-events-consumed-by-scrollable-should-not-be-propagated-to-body-2.txt

@@ -0,0 +1,2 @@
+     scrollable.scrollTop: 200
+window.scrollY: 0

+ 33 - 0
Tests/LibWeb/Text/input/wheel-events-consumed-by-scrollable-should-not-be-propagated-to-body-2.html

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<style>
+    body {
+        height: 2000px;
+        margin: 0;
+    }
+
+    #box {
+        margin-top: 500px;
+        width: 100px;
+        height: 100px;
+        background-color: red;
+    }
+
+    #scrollable {
+        width: 400px;
+        height: 400px;
+        overflow: scroll;
+        border: 10px solid black;
+    }
+</style>
+<div id="scrollable">
+    <div id="box"></div>
+</div>
+<script src="include.js"></script>
+<script>
+    test(() => {
+        internals.wheel(10, 10, 0, 1000);
+        const scrollable = document.getElementById("scrollable");
+        println("scrollable.scrollTop: " + scrollable.scrollTop);
+        println("window.scrollY: " + window.scrollY);
+    });
+</script>

+ 2 - 1
Userland/Libraries/LibWeb/Page/EventHandler.cpp

@@ -180,7 +180,8 @@ bool EventHandler::handle_mousewheel(CSSPixelPoint position, CSSPixelPoint scree
             containing_block = containing_block->containing_block();
             containing_block = containing_block->containing_block();
         }
         }
 
 
-        paintable->handle_mousewheel({}, position, buttons, modifiers, wheel_delta_x, wheel_delta_y);
+        if (paintable->handle_mousewheel({}, position, buttons, modifiers, wheel_delta_x, wheel_delta_y))
+            return true;
 
 
         auto node = dom_node_for_event_dispatch(*paintable);
         auto node = dom_node_for_event_dispatch(*paintable);