| <!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> |