chromium/third_party/blink/web_tests/virtual/threaded/fast/events/pinch/gesture-pinch-zoom-scroll-bubble.html

<!DOCTYPE html>
<script src="../../../../../resources/testharness.js"></script>
<script src="../../../../../resources/testharnessreport.js"></script>
<script src="../../../../../resources/gesture-util.js"></script>
<div style="margin: 0px 0; width: 100px; height: 1000px; background-color: blue;"></div>
<script>

var EPSILON = 0.001;

var t = async_test("Scrolling with a scaled visual viewport");

// This test verifies scrolling of the page while pinch-zoomed in. We ensure
// that the scrolls target the correct (visual/layout) viewport and that
// bubbling between the two works correctly.
window.onload = t.step_func(async function() {
  await waitForCompositorCommit();
  await pinchBy(2, 400, 599, SPEED_INSTANT, GestureSourceType.TOUCHPAD_INPUT);
  await waitForCompositorCommit();
  assert_approx_equals(window.visualViewport.scale, 2.0, EPSILON);
  assert_approx_equals(window.visualViewport.offsetLeft, 200, EPSILON);
  assert_approx_equals(window.visualViewport.offsetTop, 300, EPSILON);
  // We're already within |EPSILON| of the desired offset, but we'll set it
  // here to avoid rounding issues later in the test.
  window.internals.setVisualViewportOffset(200, 300);
  await waitForCompositorCommit();

  // Scroll down, this will affect only the layout viewport.
  await smoothScroll(2, 400, 300, GestureSourceType.TOUCHPAD_INPUT, "down", SPEED_INSTANT);
  await waitForCompositorCommit();
  assert_equals(window.scrollY, 1);

  // Scroll right, this will affect only the visual viewport.
  await smoothScroll(2, 400, 300, GestureSourceType.TOUCHPAD_INPUT, "right", SPEED_INSTANT);
  await waitForCompositorCommit();
  assert_equals(window.visualViewport.offsetLeft, 201);

  // Move the visual viewport up by a pixel so that the next gesture will
  // bubble.
  window.internals.setVisualViewportOffset(201, 299);
  await waitForCompositorCommit();

  // Scroll back diagonally. This will affect both viewports by bubbling from
  // the visual to the layout.
  await smoothScroll(4, 400, 300, GestureSourceType.TOUCHPAD_INPUT, "downleft", SPEED_INSTANT);
  await waitForCompositorCommit();
  assert_equals(window.scrollY, 2);
  assert_equals(window.visualViewport.offsetTop, 300);
  assert_equals(window.visualViewport.offsetLeft, 199);

  t.done();
});

</script>