<!DOCTYPE html>
<title>Testing scrollOptions' behavior for Element.scroll* and scroll-behavior on an element</title>
<meta name="timeout" content="long"/>
<link rel="author" title="Frédéric Wang" href="mailto:fwang@igalia.com">
<link rel="help" href="https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior">
<link rel="help" href="https://drafts.csswg.org/cssom-view/#scrolling-box">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/scroll-behavior.js"></script>
<style>
  .scrollable {
    overflow: auto;
    width: 400px;
    height: 200px;
  }
  .autoBehavior {
    scroll-behavior: auto;
  }
  .smoothBehavior {
    scroll-behavior: smooth;
  }
</style>
<div id="log">
</div>
<div id="overflowNode" class="scrollable">
  <div style="width: 2000px; height: 1000px; background: linear-gradient(135deg, red, green);">
    <span style="display: inline-block; width: 500px; height: 250px;"></span><span id="elementToReveal" style="display: inline-block; vertical-align: -15px; width: 10px; height: 15px; background: black;"></span>
  </div>
</div>
<script>
  var scrollingElement = overflowNode;
  var styledElement = overflowNode;
  var elementToRevealLeft = 500;
  var elementToRevealTop = 250;

  ["scroll", "scrollTo", "scrollBy", "scrollIntoView"].forEach((scrollFunction) => {
    promise_test(() => {
      resetScroll(scrollingElement);
      setScrollBehavior(styledElement, "autoBehavior");
      assert_equals(scrollingElement.scrollLeft, 0);
      assert_equals(scrollingElement.scrollTop, 0);
      scrollNode(scrollingElement, scrollFunction, null, elementToRevealLeft, elementToRevealTop);
      assert_equals(scrollingElement.scrollLeft, elementToRevealLeft, "Should set scrollLeft immediately");
      assert_equals(scrollingElement.scrollTop, elementToRevealTop, "Should set scrollTop immediately");
      return new Promise((resolve) => { resolve(); });
    }, `Element with auto scroll-behavior ; ${scrollFunction}() with default behavior`);

    promise_test(() => {
      resetScroll(scrollingElement);
      setScrollBehavior(styledElement, "autoBehavior");
      assert_equals(scrollingElement.scrollLeft, 0);
      assert_equals(scrollingElement.scrollTop, 0);
      scrollNode(scrollingElement, scrollFunction, "auto", elementToRevealLeft, elementToRevealTop);
      assert_equals(scrollingElement.scrollLeft, elementToRevealLeft, "Should set scrollLeft immediately");
      assert_equals(scrollingElement.scrollTop, elementToRevealTop, "Should set scrollTop immediately");
      return new Promise((resolve) => { resolve(); });
    }, `Element with auto scroll-behavior ; ${scrollFunction}() with auto behavior`);

    promise_test(() => {
      resetScroll(scrollingElement);
      setScrollBehavior(styledElement, "autoBehavior");
      assert_equals(scrollingElement.scrollLeft, 0);
      assert_equals(scrollingElement.scrollTop, 0);
      scrollNode(scrollingElement, scrollFunction, "instant", elementToRevealLeft, elementToRevealTop);
      assert_equals(scrollingElement.scrollLeft, elementToRevealLeft, "Should set scrollLeft immediately");
      assert_equals(scrollingElement.scrollTop, elementToRevealTop, "Should set scrollTop immediately");
      return new Promise((resolve) => { resolve(); });
    }, `Element with auto scroll-behavior ; ${scrollFunction}() with instant behavior`);

    promise_test(() => {
      resetScroll(scrollingElement);
      setScrollBehavior(styledElement, "autoBehavior");
      assert_equals(scrollingElement.scrollLeft, 0);
      assert_equals(scrollingElement.scrollTop, 0);
      scrollNode(scrollingElement, scrollFunction, "smooth", elementToRevealLeft, elementToRevealTop);
      assert_less_than(scrollingElement.scrollLeft, elementToRevealLeft, "Should not set scrollLeft immediately");
      assert_less_than(scrollingElement.scrollTop, elementToRevealTop, "Should not set scrollTop immediately");
      return waitForScrollEnd(scrollingElement).then(() => {
        assert_equals(scrollingElement.scrollLeft, elementToRevealLeft, "Final value of scrollLeft");
        assert_equals(scrollingElement.scrollTop, elementToRevealTop, "Final value of scrollTop");
      });
    }, `Element with auto scroll-behavior ; ${scrollFunction}() with smooth behavior`);

    promise_test(() => {
      resetScroll(scrollingElement);
      setScrollBehavior(styledElement, "smoothBehavior");
      assert_equals(scrollingElement.scrollLeft, 0);
      assert_equals(scrollingElement.scrollTop, 0);
      scrollNode(scrollingElement, scrollFunction, null, elementToRevealLeft, elementToRevealTop);
      assert_less_than(scrollingElement.scrollLeft, elementToRevealLeft, "Should not set scrollLeft immediately");
      assert_less_than(scrollingElement.scrollTop, elementToRevealTop, "Should not set scrollTop immediately");
      return waitForScrollEnd(scrollingElement).then(() => {
        assert_equals(scrollingElement.scrollLeft, elementToRevealLeft, "Final value of scrollLeft");
        assert_equals(scrollingElement.scrollTop, elementToRevealTop, "Final value of scrollTop");
      });
    }, `Element with smooth scroll-behavior ; ${scrollFunction}() with default behavior`);

    promise_test(() => {
      resetScroll(scrollingElement);
      setScrollBehavior(styledElement, "smoothBehavior");
      assert_equals(scrollingElement.scrollLeft, 0);
      assert_equals(scrollingElement.scrollTop, 0);
      scrollNode(scrollingElement, scrollFunction, "auto", elementToRevealLeft, elementToRevealTop);
      assert_less_than(scrollingElement.scrollLeft, elementToRevealLeft, "Should not set scrollLeft immediately");
      assert_less_than(scrollingElement.scrollTop, elementToRevealTop, "Should not set scrollTop immediately");
      return waitForScrollEnd(scrollingElement).then(() => {
        assert_equals(scrollingElement.scrollLeft, elementToRevealLeft, "Final value of scrollLeft");
        assert_equals(scrollingElement.scrollTop, elementToRevealTop, "Final value of scrollTop");
      });
    }, `Element with smooth scroll-behavior ; ${scrollFunction}() with auto behavior`);

    promise_test(() => {
      resetScroll(scrollingElement);
      setScrollBehavior(styledElement, "smoothBehavior");
      assert_equals(scrollingElement.scrollLeft, 0);
      assert_equals(scrollingElement.scrollTop, 0);
      scrollNode(scrollingElement, scrollFunction, "instant", elementToRevealLeft, elementToRevealTop);
      assert_equals(scrollingElement.scrollLeft, elementToRevealLeft, "Should set scrollLeft immediately");
      assert_equals(scrollingElement.scrollTop, elementToRevealTop, "Should set scrollTop immediately");
      return new Promise((resolve) => { resolve(); });
    }, `Element with smooth scroll-behavior ; ${scrollFunction}() with instant behavior`);

    promise_test(() => {
      resetScroll(scrollingElement);
      setScrollBehavior(styledElement, "smoothBehavior");
      assert_equals(scrollingElement.scrollLeft, 0);
      assert_equals(scrollingElement.scrollTop, 0);
      scrollNode(scrollingElement, scrollFunction, "smooth", elementToRevealLeft, elementToRevealTop);
      assert_less_than(scrollingElement.scrollLeft, elementToRevealLeft, "Should not set scrollLeft immediately");
      assert_less_than(scrollingElement.scrollTop, elementToRevealTop, "Should not set scrollTop immediately");
      return waitForScrollEnd(scrollingElement).then(() => {
        assert_equals(scrollingElement.scrollLeft, elementToRevealLeft, "Final value of scrollLeft");
        assert_equals(scrollingElement.scrollTop, elementToRevealTop, "Final value of scrollTop");
      });
   }, `Element with smooth scroll-behavior ; ${scrollFunction}() with smooth behavior`);
  });

  promise_test(() => {
    resetScroll(scrollingElement);
    setScrollBehavior(styledElement, "smoothBehavior");
    assert_equals(scrollingElement.scrollLeft, 0);
    assert_equals(scrollingElement.scrollTop, 0);
    scrollNode(scrollingElement, "scroll", "smooth", elementToRevealLeft, elementToRevealTop);
    scrollNode(scrollingElement, "scroll", "smooth", elementToRevealLeft / 2, elementToRevealTop / 2);
    return waitForScrollEnd(scrollingElement).then(() => {
      assert_equals(scrollingElement.scrollLeft, elementToRevealLeft / 2, "Final value of scrollLeft");
      assert_equals(scrollingElement.scrollTop, elementToRevealTop / 2, "Final value of scrollTop");
    });
  }, "Aborting an ongoing smooth scrolling on an element with another smooth scrolling");

  promise_test(() => {
    resetScroll(scrollingElement);
    setScrollBehavior(styledElement, "smoothBehavior");
    assert_equals(scrollingElement.scrollLeft, 0);
    assert_equals(scrollingElement.scrollTop, 0);
    scrollNode(scrollingElement, "scroll", "smooth", elementToRevealLeft, elementToRevealTop);
    scrollNode(scrollingElement, "scroll", "instant", 0, 0);
    return waitForScrollEnd(scrollingElement).then(() => {
      assert_equals(scrollingElement.scrollLeft, 0, "Final value of scrollLeft");
      assert_equals(scrollingElement.scrollTop, 0, "Final value of scrollTop");
    });
  }, "Aborting an ongoing smooth scrolling on an element with an instant scrolling");
</script>
