Index: LayoutTests/rubberbanding/scroll-bounce-fix.html |
diff --git a/LayoutTests/rubberbanding/scroll-bounce-fix.html b/LayoutTests/rubberbanding/scroll-bounce-fix.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1c5e9a024d003ad8b134b05a08ef87ade394d99e |
--- /dev/null |
+++ b/LayoutTests/rubberbanding/scroll-bounce-fix.html |
@@ -0,0 +1,89 @@ |
+<!DOCTYPE html> |
+<html> |
+<head><title>Tests that a momentum scroll (i.e. a fling) doesn't jump vertically</title></head> |
+<body> |
+<div id="box" style="height:800px; background: red; border:2px solid black; width:100%"></div> |
+<div id="info">This test requires DRT.</div> |
+<script> |
+ if (window.internals) { |
+ document.getElementById('info').style.visibility = 'hidden'; |
+ internals.settings.setMockScrollbarsEnabled(false); |
+ |
+ // These trackpad scroll events first go up, then left, then down & left. All events except the last 2 were obtained by recording real gesture data. The goal is to get rubber-banding to occur while maintaining high velocity in the X and Y directions. |
+ var trackpadScrollEvents = [ |
+ ["scrollBegin"], |
+ ["scroll", -1, 4], |
+ ["scroll", -5, 14], |
+ ["scroll", -5, 23], |
+ ["scroll", -12, 57], |
+ ["scroll", -11, 68], |
+ ["scroll", -9, 85], |
+ ["scroll", -3, 77], |
+ ["scroll", -1, 109], |
+ ["scroll", 4, 105], |
+ ["scroll", 22, 106], |
+ ["scroll", 47, 60], |
+ ["scroll", 102, 32], |
+ ["scroll", 210, -1], |
+ ["scroll", 281, -23], |
+ ["scroll", 453, -103], |
+ ["scroll", 600, -223], |
+ ["scroll", 800, -303], |
+ ["scrollEnd"], |
+ ["momentumBegin", 555, -120], |
+ ["momentumEnd"] |
+ ]; |
+ |
+ function queueTimeout(index) |
+ { |
+ setTimeout(function() { runTimeout(index); }, 5); |
+ } |
+ |
+ // Replays the event at position |index|. |
+ function runTimeout(index) |
+ { |
+ var name = trackpadScrollEvents[index][0]; |
+ if (name == "scrollBegin") { |
+ eventSender.trackpadScrollBegin(); |
+ } else if (name == "scroll") { |
+ var deltaX = trackpadScrollEvents[index][1]; |
+ var deltaY = trackpadScrollEvents[index][2]; |
+ eventSender.trackpadScroll(deltaX, deltaY, false, true); |
+ } else if (name == "scrollEnd") { |
+ eventSender.trackpadScrollEnd(); |
+ } else if (name == "momentumBegin") { |
+ var deltaX = trackpadScrollEvents[index][1]; |
+ var deltaY = trackpadScrollEvents[index][2]; |
+ eventSender.mouseMomentumBegin2(deltaX, deltaY, false, true); |
+ } else if (name == "momentumEnd") { |
+ eventSender.mouseMomentumEnd(); |
+ } |
+ |
+ // Queues another event, if one is available. |
+ if (index + 1 < trackpadScrollEvents.length) { |
+ queueTimeout(index + 1); |
+ } |
+ } |
+ |
+ // Queue the first event for replay. |
+ queueTimeout(0); |
+ |
+ // The ScrollElasticityController receives callbacks every 16ms, and animates the release effect of the rubber-band. Wait for 2 seconds to give the animation time to settle. |
+ testRunner.waitUntilDone(); |
+ setTimeout(function() { |
+ document.getElementById('box').style.background = 'green'; |
+ // The left margin should have rebounded back to 0. |
+ if (document.documentElement.scrollLeft != 0) { |
+ document.getElementById('box').style.background = 'yellow'; |
+ } |
+ // The content should be scrolled to the bottom. |
+ var expectedScrollTop = document.documentElement.scrollHeight - document.documentElement.clientHeight; |
+ if (document.documentElement.scrollTop != expectedScrollTop) { |
+ document.getElementById('box').style.background = 'yellow'; |
+ } |
+ testRunner.notifyDone(); |
+ }, 2000); |
+ } |
+</script> |
+</body> |
+</html> |