forked from mirrors/gecko-dev
Same-document navigation follows a different code path than normal navigation and was therefore not covered in the initial implementation for text fragments. Same-document navigation does not set a URI in the `Document`, which is the way cross-document navigation would parse text directives from the URL. Instead, `nsDocShell::ScrollToAnchor()` is called via `nsDocShell::InternalLoad()`-> `nsDocShell::HandleSameDocumentNavigation()`. This code path needs to parse and remove the fragment directive from the new fragment to be able to find text fragments and to allow for element-id fallback. `nsDocShell::ScrollToAnchor()` needs to start an attempt to scroll to the text fragment if it exists. It must not, however, clear the uninvoked text directives, because a same-document navigation could happen before the document is fully loaded, hence the target text might not be part of the DOM tree. As per spec, a second attempt to scroll to the text fragment is done after the load is completed. This is done by `Document::ScrollToRef()`, which is called by `nsDocumentViewer::LoadComplete()` after the load has finished. This call will clear the uninvoked directives. Differential Revision: https://phabricator.services.mozilla.com/D209726
27 lines
1 KiB
HTML
27 lines
1 KiB
HTML
<!doctype html>
|
|
<title>Same document navigation to text fragment directives before loading the document has finished</title>
|
|
<meta charset=utf-8>
|
|
<link rel="help" href="https://wicg.github.io/ScrollToTextFragment/">
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="resources/util.js"></script>
|
|
<script>
|
|
// Ensure that a same-document text directive navigation works correctly
|
|
// if the navigation is triggered before the page finishes loading.
|
|
promise_test(async t => {
|
|
assert_implements(document.fragmentDirective, 'Text directive not implemented');
|
|
|
|
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');
|
|
}, 'Same-document text directive navigation before loading the document has finished');
|
|
</script>
|
|
<style>
|
|
div {
|
|
margin: 200vh 0 200vh 0;
|
|
}
|
|
</style>
|
|
|
|
<div id="text">
|
|
This is a line of text.
|
|
</div>
|