Chromium Code Reviews| Index: LayoutTests/fast/scroll-behavior/resources/scroll-interruption-test.js | 
| diff --git a/LayoutTests/fast/scroll-behavior/resources/scroll-interruption-test.js b/LayoutTests/fast/scroll-behavior/resources/scroll-interruption-test.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..73b48f93698b2b1fe4c2077a018b0b716b9a5ef7 | 
| --- /dev/null | 
| +++ b/LayoutTests/fast/scroll-behavior/resources/scroll-interruption-test.js | 
| @@ -0,0 +1,196 @@ | 
| +(function() { | 
| + var instantTest = async_test('interrupt with instant scroll'); | 
| + var smoothTest = async_test('interrupt with smooth scroll'); | 
| + var touchTest = async_test('interrupt with touch scroll'); | 
| + var wheelTest = async_test('interrupt with mouse wheel'); | 
| + var testElement; | 
| + var testCase; | 
| + var testInnerPoint; | 
| + var previousScrollTop; | 
| + var previousTimestamp; | 
| + | 
| + | 
| + function verifyScrollOffsetUnchangedAfterInstantScroll() | 
| + { | 
| + instantTest.step(function() { | 
| + assert_equals(testElement.scrollTop, testCase.y3); | 
| 
 
Ian Vollick
2014/02/06 16:02:31
I don't like the assumptions about the contents of
 
 | 
| + }); | 
| + instantTest.done(); | 
| + window.requestAnimationFrame(startSmoothTest); | 
| + } | 
| + | 
| + function verifyProgressTowardsNewDestination() | 
| + { | 
| + var previousDelta = testCase.y3 - previousScrollTop; | 
| + var currentDelta = testCase.y3 - testElement.scrollTop; | 
| + if (Math.abs(currentDelta) < Math.abs(previousDelta)) { | 
| + smoothTest.done(); | 
| + window.requestAnimationFrame(startTouchTest); | 
| + return; | 
| + } | 
| + previousScrollTop = testElement.scrollTop; | 
| + window.requestAnimationFrame(verifyProgressTowardsNewDestination); | 
| + } | 
| + | 
| + function verifyScrollOffsetStopsChangingAfterTouchScroll(timestamp) | 
| + { | 
| + if (previousScrollTop == testElement.scrollTop) { | 
| + // Ensure that the animation has really stopped, not that we just have | 
| + // two frames that are so close together that the animation only seems to | 
| + // have stopped. | 
| + if (timestamp - previousTimestamp > 16) { | 
| + touchTest.done(); | 
| + window.requestAnimationFrame(startWheelTest); | 
| + } else { | 
| + window.requestAnimationFrame(verifyScrollOffsetStopsChangingAfterTouchScroll); | 
| + } | 
| + return; | 
| + } | 
| + | 
| + previousTimestamp = timestamp; | 
| + previousScrollTop = testElement.scrollTop; | 
| + touchTest.step(function() { | 
| + assert_not_equals(previousScrollTop, testCase.y2); | 
| + }); | 
| + window.requestAnimationFrame(verifyScrollOffsetStopsChangingAfterTouchScroll); | 
| + } | 
| + | 
| + function verifyScrollOffsetStopsChangingAfterWheelScroll(timestamp) | 
| + { | 
| + if (previousScrollTop == testElement.scrollTop) { | 
| + // Ensure that the animation has really stopped, not that we just have | 
| + // two frames that are so close together that the animation only seems to | 
| + // have stopped. | 
| + if (timestamp - previousTimestamp > 16) { | 
| + wheelTest.done(); | 
| + } else { | 
| + window.requestAnimationFrame(verifyScrollOffsetStopsChangingAfterWheelScroll); | 
| + } | 
| + return; | 
| + } | 
| + | 
| + previousTimestamp = timestamp; | 
| + previousScrollTop = testElement.scrollTop; | 
| + wheelTest.step(function() { | 
| + assert_not_equals(previousScrollTop, testCase.y2); | 
| + }); | 
| + window.requestAnimationFrame(verifyScrollOffsetStopsChangingAfterWheelScroll); | 
| + } | 
| + | 
| + function interruptWithInstantScroll() | 
| + { | 
| + if (testElement.scrollTop == testCase.y1) { | 
| + window.requestAnimationFrame(interruptWithInstantScroll); | 
| + return; | 
| + } | 
| + | 
| + instantlyScrollTo(testCase.y3); | 
| + instantTest.step(function() { | 
| + assert_equals(testElement.scrollTop, testCase.y3); | 
| + }); | 
| + window.requestAnimationFrame(verifyScrollOffsetUnchangedAfterInstantScroll); | 
| + } | 
| + | 
| + function interruptWithSmoothScroll() | 
| + { | 
| + if (testElement.scrollTop == testCase.y1) { | 
| + window.requestAnimationFrame(interruptWithSmoothScroll); | 
| + return; | 
| + } | 
| + | 
| + previousScrollTop = testElement.scrollTop; | 
| + smoothlyScrollTo(testCase.y3); | 
| + smoothTest.step(function() { | 
| + assert_equals(testElement.scrollTop, previousScrollTop); | 
| + }); | 
| + window.requestAnimationFrame(verifyProgressTowardsNewDestination); | 
| + } | 
| + | 
| + function interruptWithTouchScroll(timestamp) | 
| + { | 
| + if (testElement.scrollTop == testCase.y1) { | 
| + window.requestAnimationFrame(interruptWithTouchScroll); | 
| + return; | 
| + } | 
| + | 
| + previousScrollTop = testElement.scrollTop; | 
| + previousTimestamp = timestamp; | 
| + if (window.eventSender) { | 
| + eventSender.gestureScrollBegin(testInnerPoint.x, testInnerPoint.y); | 
| + eventSender.gestureScrollUpdate(0, -10); | 
| + eventSender.gestureScrollEnd(0, 0); | 
| + } else { | 
| + document.write("This test does not work in manual mode."); | 
| + } | 
| + | 
| + window.requestAnimationFrame(verifyScrollOffsetStopsChangingAfterTouchScroll); | 
| + } | 
| + | 
| + function interruptWithWheelScroll(timestamp) | 
| + { | 
| + if (testElement.scrollTop == testCase.y1) { | 
| + window.requestAnimationFrame(interruptWithWheelScroll); | 
| + return; | 
| + } | 
| + | 
| + previousScrollTop = testElement.scrollTop; | 
| + previousTimestamp = timestamp; | 
| + if (window.eventSender) { | 
| + eventSender.mouseMoveTo(testInnerPoint.x, testInnerPoint.y); | 
| + eventSender.mouseScrollBy(0, -10); | 
| + } else { | 
| + document.write("This test does not work in manual mode."); | 
| + } | 
| + | 
| + window.requestAnimationFrame(verifyScrollOffsetStopsChangingAfterWheelScroll); | 
| + } | 
| + | 
| + function smoothlyScrollTo(y) | 
| + { | 
| + testElement.style.scrollBehavior = "smooth"; | 
| + testElement.scrollTop = y; | 
| + } | 
| + | 
| + function instantlyScrollTo(y) | 
| + { | 
| + testElement.style.scrollBehavior = "instant"; | 
| + testElement.scrollTop = y; | 
| + } | 
| + | 
| + function startInstantTest() | 
| + { | 
| + instantlyScrollTo(testCase.y1); | 
| + smoothlyScrollTo(testCase.y2); | 
| + window.requestAnimationFrame(interruptWithInstantScroll); | 
| + } | 
| + | 
| + function startSmoothTest() | 
| + { | 
| + instantlyScrollTo(testCase.y1); | 
| + smoothlyScrollTo(testCase.y2); | 
| + window.requestAnimationFrame(interruptWithSmoothScroll); | 
| + } | 
| + | 
| + function startTouchTest() | 
| + { | 
| + instantlyScrollTo(testCase.y1); | 
| + smoothlyScrollTo(testCase.y2); | 
| + window.requestAnimationFrame(interruptWithTouchScroll); | 
| + } | 
| + | 
| + function startWheelTest() | 
| + { | 
| + instantlyScrollTo(testCase.y1); | 
| + smoothlyScrollTo(testCase.y2); | 
| + window.requestAnimationFrame(interruptWithWheelScroll); | 
| + } | 
| + | 
| + runScrollInterruptionTests = function runScrollInterruptionTests(element, | 
| 
 
Ian Vollick
2014/02/06 16:02:31
Does this function need to be named?
 
 | 
| + scrolls, | 
| + innerPoint) { | 
| + testElement = element; | 
| + testCase = scrolls; | 
| + testInnerPoint = innerPoint; | 
| 
 
Ian Vollick
2014/02/06 16:02:31
It's a bit funky that startInstantTest does more t
 
 | 
| + startInstantTest(); | 
| + } | 
| +})(); |