<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<title>Check End Position of smooth scrollIntoView</title>
<div id="container" style="height: 2500px; width: 2500px;">
  <div id="content" style="height: 500px; width: 500px;margin-left: 1000px; margin-right: 1000px; margin-top: 1000px;margin-bottom: 1000px;background-color: red">
  </div>
  <div id="shadow"></div>
</div>
<script>
var content_height = 500;
var content_width = 500;
var window_height = document.documentElement.clientHeight;
var window_width = document.documentElement.clientWidth;
var content = document.getElementById("content");
add_completion_callback(() => document.getElementById("container").remove());

function waitForScrollEnd() {
  var last_changed_frame = 0;
  var last_x = window.scrollX;
  var last_y = window.scrollY;
  return new Promise((resolve, reject) => {
    function tick(frames) {
      // We requestAnimationFrame either for 500 frames or until 20 frames with
      // no change have been observed.
      if (frames >= 500 || frames - last_changed_frame > 20) {
        resolve();
      } else {
        if (window.scrollX != last_x || window.scrollY != last_y) {
          last_changed_frame = frames;
          last_x = window.scrollX;
          last_y = window.scrollY;
        }
        requestAnimationFrame(tick.bind(null, frames + 1));
      }
    }
    tick(0);
  });
}

// When testing manually, we need an additional frame at beginning
// to trigger the effect.
requestAnimationFrame(() => {
promise_test(t => {
  window.scrollTo(0, 0);
  var expected_x = content.offsetLeft + content_width - window_width;
  var expected_y = content.offsetTop + content_height - window_height;
  assert_not_equals(window.scrollX, expected_x, "scrollX");
  assert_not_equals(window.scrollY, expected_y, "scrollY");
  content.scrollIntoView({behavior: "smooth", block: "nearest", inline:
"nearest"});
  return waitForScrollEnd().then(() => {
    assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
    assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
  });
}, "Smooth scrollIntoView should scroll the element to the 'nearest' position");

promise_test(t => {
  window.scrollTo(0, 0);
  var expected_x = content.offsetLeft;
  var expected_y = content.offsetTop;
  assert_not_equals(window.scrollX, expected_x, "scrollX");
  assert_not_equals(window.scrollY, expected_y, "scrollY");
  content.scrollIntoView({behavior: "smooth", block: "start", inline:
"start"});
  return waitForScrollEnd().then(() => {
    assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
    assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
  });
}, "Smooth scrollIntoView should scroll the element to the 'start' position");

promise_test(t => {
  window.scrollTo(0, 0);
  var expected_x = content.offsetLeft + (content_width - window_width) / 2;
  var expected_y = content.offsetTop + (content_height - window_height) / 2;
  assert_not_equals(window.scrollX, expected_x, "scrollX");
  assert_not_equals(window.scrollY, expected_y, "scrollY");
  content.scrollIntoView({behavior: "smooth", block: "center", inline:
"center"});
  return waitForScrollEnd().then(() => {
    assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
    assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
  });
}, "Smooth scrollIntoView should scroll the element to the 'center' position");

promise_test(t => {
  window.scrollTo(0, 0);
  var expected_x = content.offsetLeft + content_width - window_width;
  var expected_y = content.offsetTop + content_height - window_height;
  assert_not_equals(window.scrollX, expected_x, "scrollX");
  assert_not_equals(window.scrollY, expected_y, "scrollY");
  content.scrollIntoView({behavior: "smooth", block: "end", inline:
"end"});
  return waitForScrollEnd().then(() => {
    assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
    assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
  });
}, "Smooth scrollIntoView should scroll the element to the 'end' position");

});
</script>
