forked from mirrors/gecko-dev
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
50 lines
1.3 KiB
HTML
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>
|