function reset() { location.hash = ''; window.scrollTo(0, 0); } function runTests() { promise_test(async t => { assert_implements(document.fragmentDirective, 'Text directive not implemented'); reset(); location.hash = 'elementid'; await t.step_wait(() => window.scrollY > 0, "Wait for scroll"); assert_true(isInViewport(document.getElementById('elementid')), 'Scrolled to text'); }, 'Basic element fragment navigation'); // Ensure a simple text directive works correctly when navigated to the // same document using `location.hash`. promise_test(async t => { assert_implements(document.fragmentDirective, 'Text directive not implemented'); reset(); location.hash = ':~:text=line%20of%20text'; await t.step_wait(() => window.scrollY > 0, "Wait for scroll"); assert_true(isInViewport(document.getElementById('text')), 'Scrolled to text'); }, 'Basic text directive navigation'); // Test that we correctly fallback to the element id when we have a text // directive that doesn't match any text in the page. promise_test(async t => { assert_implements(document.fragmentDirective, 'Text directive not implemented'); reset(); location.hash = 'elementid:~:text=textDoesntExist'; await t.step_wait(() => window.scrollY > 0, "Wait for scroll"); assert_true(isInViewport(document.getElementById('elementid')), 'Scrolled to `elementid`'); }, 'Basic element id fallback'); // Test that we correctly fallback to the element id when we have a text // directive that's malformed and won't be parsed. promise_test(async t => { assert_implements(document.fragmentDirective, 'Text directive not implemented'); reset(); location.hash = 'elementid:~:text=,,,,,'; await t.step_wait(() => window.scrollY > 0, "Wait for scroll"); assert_true(isInViewport(document.getElementById('elementid')), 'Scrolled to `elementid`'); }, 'Malformed text directive element id fallback'); }