<!DOCTYPE html>
<title>Tests mouse interactions on a non-custom composited root scrollbar thumb.</title>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../resources/gesture-util.js"></script>
<script src="../../../resources/scrollbar-util.js"></script>
<body style="height: 1000px; width: 1000px">
<script>
if (window.internals)
    internals.settings.setScrollAnimatorEnabled(false);

window.onload = () => {
  const TRACK_WIDTH = calculateScrollbarThickness();
  const BUTTON_WIDTH = TRACK_WIDTH;
  const onMacPlatform =  navigator.userAgent.search(/\bMac OS X\b/) != -1;

  promise_test (async () => {
    await waitForCompositorCommit();
    resetScrollOffset(document.scrollingElement);

    // Testing the vertical scrollbar thumb.
    let x = window.innerWidth - TRACK_WIDTH / 2;
    let y = BUTTON_WIDTH + 10;
    let asc_increments = [25, 10, 35, 7, 23];
    let asc_offsets = [45, 64, 128, 141, 183];
    let asc_offsets_mac = [43, 60, 121, 133, 173];

    let desc_increments = [33, 11, 21, 5, 30];
    let desc_offsets = [122, 102, 64, 55, 0];
    let desc_offsets_mac = [116, 97, 60, 52, 0];

    await mouseMoveTo(x, y);
    await mouseDownAt(x, y);

     // Scroll down
    for (var i = 0; i < 5; i++){
      y += asc_increments[i];
      await mouseMoveTo(x, y);
      const offset = onMacPlatform ? asc_offsets_mac[i] : asc_offsets[i];
      if (internals.runtimeFlags.fractionalScrollOffsetsEnabled) {
        assert_approx_equals(window.scrollY, offset, 1,
          "Vertical thumb drag downwards did not scroll as expected at "+asc_increments[i]+" - ");
      } else {
        assert_equals(window.scrollY, offset,
          "Vertical thumb drag downwards did not scroll as expected at "+asc_increments[i]+" - ");
      }
    };

    // Scroll up
    for (var i = 0; i < 5; i++){
      y -= desc_increments[i];
      await mouseMoveTo(x, y);
      const offset = onMacPlatform ? desc_offsets_mac[i] : desc_offsets[i];
      if (internals.runtimeFlags.fractionalScrollOffsetsEnabled) {
        assert_approx_equals(window.scrollY, offset, 1,
          "Vertical thumb drag upwards did not scroll as expected at "+desc_increments[i]+" - ");
      } else {
        assert_equals(window.scrollY, offset,
          "Vertical thumb drag upwards did not scroll as expected at "+desc_increments[i]+" - ");
      }
    };

    await mouseUpAt(x, y);
    assert_equals(window.scrollY, 0, "Mouseup on vertical scrollbar thumb is not expected to scroll.");

    // Since the horizontal scrolling is essentially the same codepath as vertical,
    // this need not be tested in the interest of making the test run faster.
  }, "Test mouse drags in increments on non-custom composited root scrollbar thumb.");
}
</script>
</body>
