Bug 1425603 - APZ mochitest for obeying overscroll-behavior when scrolling over a checkerboarded area. r=kats draft
authorBotond Ballo <botond@mozilla.com>
Wed, 21 Mar 2018 18:59:38 -0400
changeset 772711 be9f67885ef2fd13b6e3bc377903da7878d53ed1
parent 771610 5bc910c1f477d8095dcde2c96b7e8639211b9a84
push id104033
push userbballo@mozilla.com
push dateMon, 26 Mar 2018 21:44:07 +0000
reviewerskats
bugs1425603
milestone61.0a1
Bug 1425603 - APZ mochitest for obeying overscroll-behavior when scrolling over a checkerboarded area. r=kats MozReview-Commit-ID: JMWBVf2bKKP
gfx/layers/apz/test/mochitest/helper_overscroll_behavior_bug1425573.html
gfx/layers/apz/test/mochitest/helper_overscroll_behavior_bug1425603.html
gfx/layers/apz/test/mochitest/helper_scroll_overscroll_behavior.html
gfx/layers/apz/test/mochitest/mochitest.ini
gfx/layers/apz/test/mochitest/test_group_wheelevents.html
rename from gfx/layers/apz/test/mochitest/helper_scroll_overscroll_behavior.html
rename to gfx/layers/apz/test/mochitest/helper_overscroll_behavior_bug1425573.html
new file mode 100644
--- /dev/null
+++ b/gfx/layers/apz/test/mochitest/helper_overscroll_behavior_bug1425603.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Scrolling over checkerboarded area respects overscroll-behavior</title>
+  <script type="application/javascript" src="apz_test_utils.js"></script>
+  <script type="application/javascript" src="apz_test_native_event_utils.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/paint_listener.js"></script>
+  <meta name="viewport" content="width=device-width"/>
+  <style>
+    #subframe {
+      width: 100px;
+      height: 100px;
+      overflow: scroll;
+      margin-top: 10px;
+      margin-left: 10px;
+      overscroll-behavior: contain;
+    }
+    #contents {
+      width: 100%;
+      height: 1000px;
+      background-image: linear-gradient(red, blue);
+    }
+  </style>
+</head>
+<body>
+  <div id="subframe">
+    <div id="contents"></div>
+  </div>
+  <div id="make_root_scrollable" style="height: 5000px"></div>
+</body>
+<script type="application/javascript">
+
+function* test(testDriver) {
+  var config = getHitTestConfig();
+  var utils = config.utils;
+
+  var subframe = document.getElementById('subframe');
+
+  // Activate the scrollframe but keep the main-thread scroll position at 0.
+  // Also apply an async scroll offset in the y-direction large enough
+  // to make the scrollframe checkerboard.
+  // Note: We have to be careful with the numbers here.
+  //   moveMouseAndScrollWheelOver() relies on the main thread receiving
+  //   the synthesized mouse-move and wheel events. However, the async
+  //   transform created by setAsyncScrollOffset() will cause an untransform
+  //   to be applied to the synthesized events' coordinates before they're
+  //   passed to the main thread. We have to make sure the transform is
+  //   large enough to cause the scroll frame to checkerboard, but not so
+  //   large that the untransformed coordinates hit-test out of bounds for
+  //   the browser's content area. This is why we make the scroll frame
+  //   small (100x100), and give it a display port that's also just 100x100,
+  //   so we can keep the async scroll offset small enough (300 in this case)
+  //   that the untransformed coordinates are still in-bounds for the window.
+  utils.setDisplayPortForElement(0, 0, 100, 100, subframe, 1);
+  yield waitForAllPaints(testDriver);
+  var scrollY = 300;
+  utils.setAsyncScrollOffset(subframe, 0, scrollY);
+  if (config.isWebRender) {
+    // Tick the refresh driver once to make sure the compositor has applied the
+    // async scroll offset (for APZ hit-testing this doesn't matter, but for
+    // WebRender hit-testing we need to make sure WR has the latest info).
+    utils.advanceTimeAndRefresh(16);
+    utils.restoreNormalRefresh();
+  }
+
+  // Scroll over the subframe, and make sure that the page does not scroll,
+  // i.e. overscroll-behavior is respected.
+  var waitForScroll = false;  // don't wait for a scroll event, it will never come
+  yield moveMouseAndScrollWheelOver(subframe, 50, 50, testDriver, waitForScroll);
+  ok(window.scrollY == 0, "overscroll-behavior was respected");
+
+  subtestDone();
+}
+
+waitUntilApzStable().then(runContinuation(test));
+
+</script>
+</html>
--- a/gfx/layers/apz/test/mochitest/mochitest.ini
+++ b/gfx/layers/apz/test/mochitest/mochitest.ini
@@ -23,21 +23,22 @@
     helper_iframe2.html
     helper_hittest_basic.html
     helper_hittest_checkerboard.html
     helper_hittest_subframe_float.html
     helper_key_scroll.html
     helper_long_tap.html
     helper_override_root.html
     helper_override_subdoc.html
+    helper_overscroll_behavior_bug1425573.html
+    helper_overscroll_behavior_bug1425603.html
     helper_scroll_inactive_perspective.html
     helper_scroll_inactive_zindex.html
     helper_scroll_on_position_fixed.html
     helper_scroll_over_scrollbar.html
-    helper_scroll_overscroll_behavior.html
     helper_scroll_tables_perspective.html
     helper_scrollto_tap.html
     helper_subframe_style.css
     helper_tall.html
     helper_tap.html
     helper_tap_fullzoom.html
     helper_tap_passive.html
     helper_touch_action.html
--- a/gfx/layers/apz/test/mochitest/test_group_wheelevents.html
+++ b/gfx/layers/apz/test/mochitest/test_group_wheelevents.html
@@ -21,29 +21,30 @@ var prefs = [
 
 // For helper_scroll_over_scrollbar, we need to set a pref to force
 // layerization of the scrollbar track to reproduce the bug being fixed.
 // Otherwise, the bug only manifests with overlay scrollbars on macOS,
 // or in a XUL RCD, both of which are hard to materialize in a test.
 var scrollbar_prefs = prefs.slice();  // make a copy
 scrollbar_prefs.push(["layout.scrollbars.always-layerize-track", true]);
 
-// For helper_scroll_overscroll_behavior, we need to set the APZ content
+// For helper_overscroll_behavior_bug1425573, we need to set the APZ content
 // response timeout to 0, so we exercise the fallback codepath.
 var timeout_prefs = prefs.slice();  // make a copy
 timeout_prefs.push(["apz.content_response_timeout", 0]);
 
 var subtests = [
   {'file': 'helper_scroll_on_position_fixed.html', 'prefs': prefs},
   {'file': 'helper_bug1271432.html', 'prefs': prefs},
+  {'file': 'helper_overscroll_behavior_bug1425573.html', 'prefs': timeout_prefs},
+  {'file': 'helper_overscroll_behavior_bug1425603.html', 'prefs': prefs},
   {'file': 'helper_scroll_inactive_perspective.html', 'prefs': prefs},
   {'file': 'helper_scroll_inactive_zindex.html', 'prefs': prefs},
   {'file': 'helper_scroll_over_scrollbar.html', 'prefs': scrollbar_prefs},
   {'file': 'helper_scroll_tables_perspective.html', 'prefs': prefs},
-  {'file': 'helper_scroll_overscroll_behavior.html', 'prefs': timeout_prefs},
 ];
 
 if (isApzEnabled()) {
   SimpleTest.waitForExplicitFinish();
   window.onload = function() {
     runSubtestsSeriallyInFreshWindows(subtests)
     .then(SimpleTest.finish, SimpleTest.finish);
   };