Add a test ensuring that scrolling in the middle of a page can't start a swipe gesture
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Sep 2015 19:22:01 +0000 (19:22 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Sep 2015 19:22:01 +0000 (19:22 +0000)
https://bugs.webkit.org/show_bug.cgi?id=148904

Reviewed by Myles Maxfield.

* swipe/main-frame-pinning-requirement.html: Added.

* WebKitTestRunner/TestController.cpp:
(WTR::parseBooleanTestHeaderValue):
(WTR::updateViewOptionsFromTestHeader):
Check for the key "useThreadedScrolling".
Add some code to check for "true" and "false" for boolean options.

(WTR::TestController::viewOptionsForTest):
Apply the test's overrides last, even after the platform's.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@189922 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/swipe/main-frame-pinning-requirement-expected.txt [new file with mode: 0644]
LayoutTests/swipe/main-frame-pinning-requirement.html [new file with mode: 0644]
Tools/ChangeLog
Tools/WebKitTestRunner/TestController.cpp

index 89cb146..1a2bda8 100644 (file)
@@ -1,3 +1,12 @@
+2015-09-17  Tim Horton  <timothy_horton@apple.com>
+
+        Add a test ensuring that scrolling in the middle of a page can't start a swipe gesture
+        https://bugs.webkit.org/show_bug.cgi?id=148904
+
+        Reviewed by Myles Maxfield.
+
+        * swipe/main-frame-pinning-requirement.html: Added.
+
 2015-09-17  Zalan Bujtas  <zalan@apple.com>
 
         column-rule-style: outset/inset doesn't work
diff --git a/LayoutTests/swipe/main-frame-pinning-requirement-expected.txt b/LayoutTests/swipe/main-frame-pinning-requirement-expected.txt
new file mode 100644 (file)
index 0000000..6359740
--- /dev/null
@@ -0,0 +1,24 @@
+swipe event (delta 0 0, phase 'maybegin')
+scroll event (delta 10 0, phase 'began')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 10 0, phase 'changed')
+scroll event (delta 0 0, phase 'ended')
+swipe event (delta 0 0, phase 'maybegin')
+scroll event (delta 1 0, phase 'began')
+scroll event (delta 10 0, phase 'changed')
+didBeginSwipe
+swipe event (delta 1 0, phase 'changed')
+swipe event (delta 256 0, phase 'changed')
+swipe event (delta 0 0, phase 'ended')
+willEndSwipe
+didEndSwipe
+didRemoveSwipeSnapshot
+
diff --git a/LayoutTests/swipe/main-frame-pinning-requirement.html b/LayoutTests/swipe/main-frame-pinning-requirement.html
new file mode 100644 (file)
index 0000000..9aa7afb
--- /dev/null
@@ -0,0 +1,135 @@
+<!-- webkit-test-runner [ useThreadedScrolling=true ] -->
+<!-- This test has to use threaded scrolling because we don't
+properly support swipe pinning with the antique scrolling path. -->
+
+<head>
+<style>
+html {
+    font-size: 32pt;
+}
+</style>
+<script src="resources/swipe-test.js"></script>
+<script>
+function startSwipeGesture()
+{
+    eventSender.mouseMoveTo(100, 100);
+
+    // The first swipe should fail because we're scrolled to the middle of the document
+    // and this is all a single gesture. We can only start swipes if we *begin*
+    // pinned to the edge.
+    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
+    eventQueue.enqueueScrollEvent(10, 0, 'began');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(10, 0, 'changed');
+    eventQueue.enqueueScrollEvent(0, 0, 'ended');
+
+    eventQueue.callAfterEventDispatch(function () {
+        testRunner.clearTestRunnerCallbacks();
+        testRunner.installDidBeginSwipeCallback(didBeginSwipeCallback);
+        testRunner.installWillEndSwipeCallback(willEndSwipeCallback);
+        testRunner.installDidEndSwipeCallback(didEndSwipeCallback);
+        testRunner.installDidRemoveSwipeSnapshotCallback(didRemoveSwipeSnapshotCallback);
+
+        setTimeout(function () {
+            // The second swipe should succeed because we are now scrolled to the left edge.
+            eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
+            eventQueue.enqueueScrollEvent(1, 0, 'began');
+            eventQueue.enqueueScrollEvent(10, 0, 'changed');
+        }, 0);
+    })
+}
+
+function completeSwipeGesture()
+{
+    eventQueue.enqueueSwipeEvent(1, 0, 'changed');
+    eventQueue.enqueueSwipeEvent(256, 0, 'changed');
+    eventQueue.enqueueSwipeEvent(0, 0, 'ended');
+}
+
+function didBeginSwipeNotReachedCallback()
+{
+    log("Failure. Should never begin a swipe, because we were in the middle of a scrolling gesture that started when the main frame was not pinned to the left.");
+}
+
+function didBeginSwipeCallback()
+{
+    log("didBeginSwipe");
+
+    shouldBe(false, eventQueue.hasPendingEvents(), "Event queue should be empty. Both scroll events should be required to start the swipe because of the swipe-start hysteresis.");
+
+    completeSwipeGesture();
+}
+
+function willEndSwipeCallback()
+{
+    log("willEndSwipe");
+
+    shouldBe(false, isFirstPage(), "The swipe should not yet have navigated away from the second page.");
+}
+
+function didEndSwipeCallback()
+{
+    log("didEndSwipe");
+
+    shouldBe(0, eventQueue.hasPendingEvents(), "Event queue should be empty. The swipe isn't complete until we see the end of the gesture.");
+    startMeasuringDuration("snapshotRemoval");
+}
+
+function didRemoveSwipeSnapshotCallback()
+{
+    log("didRemoveSwipeSnapshot");
+
+    shouldBe(true, isFirstPage(), "The swipe should have navigated back to the first page.");
+    measuredDurationShouldBeLessThan("snapshotRemoval", 1000, "Because we're using the page cache, it shouldn't be long between the gesture completing and the snapshot being removed.")
+
+    testComplete();
+}
+
+function isFirstPage()
+{
+    return window.location.href.indexOf("second") == -1;
+}
+
+window.onload = function () {
+    if (!window.eventSender || !window.testRunner) {
+        document.getElementById("large").innerHTML = "This test must be run in WebKitTestRunner.";
+        return;
+    }
+
+    document.getElementById("large").innerHTML = isFirstPage() ? "first" : "second";
+
+    if (isFirstPage()) {
+        initializeSwipeTest();
+
+        testRunner.installDidBeginSwipeCallback(didBeginSwipeNotReachedCallback);
+        testRunner.installWillEndSwipeCallback(willEndSwipeCallback);
+        testRunner.installDidEndSwipeCallback(didEndSwipeCallback);
+        testRunner.installDidRemoveSwipeSnapshotCallback(didRemoveSwipeSnapshotCallback);
+
+        testRunner.overridePreference("WebKitUsesPageCachePreferenceKey", 1);
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+
+        setTimeout(function () {
+            window.location.href = window.location.href + "?second";
+        }, 0);
+        return;
+    }
+
+    // Second page loaded.
+    window.scrollTo(1000, 0);
+    startSwipeGesture();
+};
+</script>
+</head>
+<body>
+<div id="large" style="width: 2000px; height: 2000px;"></div>
+</body>
\ No newline at end of file
index f7ed167..cb89684 100644 (file)
@@ -1,3 +1,19 @@
+2015-09-17  Tim Horton  <timothy_horton@apple.com>
+
+        Add a test ensuring that scrolling in the middle of a page can't start a swipe gesture
+        https://bugs.webkit.org/show_bug.cgi?id=148904
+
+        Reviewed by Myles Maxfield.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::parseBooleanTestHeaderValue):
+        (WTR::updateViewOptionsFromTestHeader):
+        Check for the key "useThreadedScrolling".
+        Add some code to check for "true" and "false" for boolean options.
+
+        (WTR::TestController::viewOptionsForTest):
+        Apply the test's overrides last, even after the platform's.
+
 2015-09-16  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         printing does not use minimum page zoom factor
index ccd34f0..1aca570 100644 (file)
@@ -827,6 +827,17 @@ static std::string testPath(const WKURLRef url)
     return std::string();
 }
 
+static bool parseBooleanTestHeaderValue(const std::string& value)
+{
+    if (value == "true")
+        return true;
+    if (value == "false")
+        return false;
+
+    LOG_ERROR("Found unexpected value '%s' for boolean option. Expected 'true' or 'false'.", value.c_str());
+    return false;
+}
+
 static void updateTestOptionsFromTestHeader(TestOptions& testOptions, const TestInvocation& test)
 {
     std::string filename = testPath(test.url());
@@ -863,6 +874,8 @@ static void updateTestOptionsFromTestHeader(TestOptions& testOptions, const Test
         auto value = pairString.substr(equalsLocation + 1, pairEnd - (equalsLocation + 1));
         if (key == "language")
             String(value.c_str()).split(",", false, testOptions.overrideLanguages);
+        if (key == "useThreadedScrolling")
+            testOptions.useThreadedScrolling = parseBooleanTestHeaderValue(value);
         pairStart = pairEnd + 1;
     }
 }
@@ -875,10 +888,10 @@ TestOptions TestController::testOptionsForTest(const TestInvocation& test) const
     options.shouldShowWebView = m_shouldShowWebView;
     options.useFixedLayout = shouldUseFixedLayout(test);
 
-    updateTestOptionsFromTestHeader(options, test);
-
     updatePlatformSpecificTestOptionsForTest(options, test);
 
+    updateTestOptionsFromTestHeader(options, test);
+
     return options;
 }