fune/testing/web-platform/tests/scroll-to-text-fragment/iframe-target.html
David Bokan 88a452b538 Bug 1735962 [wpt PR 31259] - Fix element hash fallback in iframes, a=testonly
Automatic update from web-platform-tests
Fix element hash fallback in iframes

The text directive element-id fallback tries to scroll to the element-id
if a text match wasn't found. It does so in PerformPreRafActions since
element fragments cause focus which can execute script. Invoke(), where
the text fragment performs its text search, occurs from lifecycle
updates where script execution is forbidden.

Text directives used to be limited to main-frames but were enabled
explicitly for iframes in https://crrev.com/a71830a90b72f0a613fe9.
However, PerformPreRafActions wasn't updated to call into the
FragmentAnchor of an iframe

We also need to strip the fragment directives in
ElementFragmentAnchor::TryCreate.  In cases where a text fragment is
successfully created, the element id fallback works by creating an
ElementFragmentAnchor from inside TextFragmentAnchor. However, if the
TextFragmentAnchor is blocked or not parsed correctly, the URL passed to
ElementFragmentAnchor in FragmentDirective::TryCreate will still include
the directives. A test for this was added in the new
same-document.tests.html

Bug: 1260135
Change-Id: Ib3f19b462016d34cc41d21b05933aa9cb822a9b8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3224519
Commit-Queue: David Bokan <bokan@chromium.org>
Reviewed-by: Robert Flack <flackr@chromium.org>
Cr-Commit-Position: refs/heads/main@{#933575}

--

wpt-commits: c8131af860cd65db70f7a5adc921f313db7aec5a
wpt-pr: 31259
2021-10-29 10:24:14 +00:00

50 lines
1.3 KiB
HTML

<!doctype html>
<title>Inner document for use in iframes.sub.html test</title>
<script>
function isInView(element) {
let rect = element.getBoundingClientRect();
return rect.top >= 0 && rect.top <= window.innerHeight
&& rect.left >= 0 && rect.left <= window.innerWidth;
}
function postResult() {
let position = 'unknown';
if (window.scrollY == 0)
position = 'top';
else if (isInView(document.getElementById('target')))
position = 'target';
else if (isInView(document.getElementById('elementid')))
position = 'elementid';
let results = {
scrollPosition: position,
href: window.location.href,
};
window.top.postMessage(results, "*");
}
window.addEventListener('message', (e) => {
if (e.data == 'getResult') {
// rAF twice in case there is any asynchronicity in scrolling to the
// target.
window.requestAnimationFrame(() => {
window.requestAnimationFrame(postResult);
})
} else if (e.data == 'reset') {
window.location.hash = '';
window.scrollTo(0, 0);
window.top.postMessage('', "*");
}
});
</script>
<style>
p {
margin-top: 400vh;
margin-bottom: 400vh;
}
</style>
<body>
<p id="target">Target Text</p>
<div id="elementid">DIV</div>
</body>