<!DOCTYPE html>
<title>cssom-view - scroll-behavior: smooth</title>
<meta name="timeout" content="long">
<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
<link rel="help" href="https://drafts.csswg.org/cssom-view/#smooth-scrolling">
<script src="../../../../../resources/testharness.js"></script>
<script src="../../../../../resources/testharnessreport.js"></script>
<style>
  .filler { height: 10000px }

  .smooth {
    scroll-behavior: smooth;
  }

  #scrollable {
    overflow: scroll;
    width: 100px;
    height: 100px;
  }
</style>
<div id="testContainer">
  <div id="scrollable">
    <div class="filler"></div>
  </div>
  <div class="filler"></div>
</div>
<script>
  test(() => {
    scrollable.scrollTo(0, 5000);
    assert_equals(scrollable.scrollTop, 5000, "Initially scrolls instantly");
    scrollable.scrollTo(0, 0);
    scrollable.className = "smooth";
    scrollable.scrollTo(0, 5000);
    assert_less_than(scrollable.scrollTop, 5000, "scroll-behavior:smooth should not scroll instantly");
    scrollable.className = "";
    scrollable.scrollTo(0, 0);
  }, "scroll-behavior: smooth on DIV element");

  test(() => {
    window.scrollTo(0, 5000);
    assert_equals(window.scrollY, 5000, "Initially scrolls instantly");
    window.scrollTo(0, 0);
    document.documentElement.className = "smooth";
    assert_less_than(window.scrollY, 5000, "scroll-behavior:smooth should not scroll instantly");
    document.documentElement.className = "";
    window.scrollTo(0, 0);
  }, "HTML element scroll-behavior should propagate to viewport");

  test(() => {
    window.scrollTo(0, 5000);
    assert_equals(window.scrollY, 5000, "Initially scrolls instantly");
    window.scrollTo(0, 0);
    document.body.className = "smooth";
    window.scrollTo(0, 5000);
    assert_equals(window.scrollY, 5000, "scroll-behavior:smooth on BODY should scroll viewport instantly");
    document.body.className = "";
    window.scrollTo(0, 0);
  }, "BODY element scroll-behavior should not propagate to viewport");

  var instantHistoryNavigationTest =
    async_test("Instant scrolling while doing history navigation.");
  var smoothHistoryNavigationTest =
    async_test("Smooth scrolling while doing history navigation.");

  function instant() {
    document.documentElement.className = "";
    document.body.className = "";
    window.scrollTo(0, 0);
    var p = document.createElement("pre");
    p.textContent = new Array(1000).join("newline\n");
    var a = document.createElement("a");
    a.href = "#";
    a.name = "foo";
    a.textContent = "foo";
    p.appendChild(a);
    document.body.appendChild(p);
    window.onhashchange = function() {
      window.onhashchange = function() {
        instantHistoryNavigationTest.step(function() {
          assert_equals(location.hash, "", "Shouldn't be scrolled to a fragment.");
          assert_equals(window.scrollY, 0, "Shouldn't be scrolled back to top yet.");
        });
        p.remove();
        instantHistoryNavigationTest.done();
        smooth();
      }

      instantHistoryNavigationTest.step(function() {
        assert_equals(location.hash, "#foo", "Should be scrolled to a fragment.");
        assert_not_equals(window.scrollY, 0, "Shouldn't be scrolled to top anymore.");
      });
      history.back();
    }

    instantHistoryNavigationTest.step(function() {
      assert_equals(window.scrollY, 0, "Should be scrolled to top.");
      assert_equals(location.hash, "", "Shouldn't be scrolled to a fragment.");
    });
    location.hash = "foo";
  };
  instant();

  function smooth() {
    document.documentElement.className = "";
    document.body.className = "";
    window.scrollTo(0, 0);
    var p = document.createElement("pre");
    p.textContent = new Array(1000).join("newline\n");
    var a = document.createElement("a");
    a.href = "#";
    a.name = "bar";
    a.textContent = "bar";
    p.appendChild(a);
    document.body.appendChild(p);
    window.onhashchange = function() {
      window.onhashchange = function() {
        smoothHistoryNavigationTest.step(function() {
          assert_equals(location.hash, "", "Shouldn't be scrolled to a fragment.");
          assert_not_equals(window.scrollY, 0, "Shouldn't be scrolled back to top yet.");
        });
        p.remove();
        smoothHistoryNavigationTest.done();
      }

      smoothHistoryNavigationTest.step(function() {
        assert_equals(location.hash, "#bar", "Should be scrolled to a fragment.");
        assert_not_equals(window.scrollY, 0, "Shouldn't be scrolled to top anymore.");
      });
      history.back();
    }

    smoothHistoryNavigationTest.step(function() {
      assert_equals(window.scrollY, 0, "Should be scrolled to top.");
      assert_equals(location.hash, "", "Shouldn't be scrolled to a fragment.");
    });
    location.hash = "bar";
    document.documentElement.className = "smooth";
  };

  testContainer.style.display = "none";
</script>
