blob: 2f8512a99b0a0d1d2f205c6f3b831cdb570213cf [file] [log] [blame]
<!DOCTYPE html>
<style>
iframe {
height: 300px;
width: 300px;
}
</style>
<body>
<iframe></iframe>
</body>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script type="text/javascript">
'use strict';
var iframe = document.querySelector('iframe');
var loadCount = 0;
// The test does the following navigation steps for iframe
// 1. load page-with-fragment.html#fragment
// 2. load blank2
// 3. go back to page-with-fragment.html
async_test(function(t) {
iframe.src = './resources/page-with-fragment.html#fragment';
iframe.onload = t.step_func(function() {
loadCount += 1;
switch (loadCount) {
case 1:
t.step(function() {
assert_regexp_match(iframe.contentWindow.location.href, /page-with-fragment/, 'should be on page-with-fragment page');
// wait one animation frame to ensure layout is run and fragment scrolling is complete
iframe.contentWindow.requestAnimationFrame(function() {
assert_equals(iframe.contentWindow.scrollY, 800, 'should scroll to fragment');
iframe.contentWindow.history.scrollRestoration = 'manual';
assert_equals(iframe.contentWindow.history.scrollRestoration, 'manual');
// navigate to new page
setTimeout(function() {
iframe.src = './resources/blank1.html';
}, 0);
});
});
break;
case 2:
t.step(function() {
assert_regexp_match(iframe.contentWindow.location.href, /blank1/, 'should be on second blank page');
assert_equals(iframe.contentWindow.history.scrollRestoration, 'auto', 'new page loads should set scrollRestoration to "auto"');
setTimeout(function() {
iframe.contentWindow.history.back();
}, 0);
});
break;
case 3:
t.step(function() {
// coming back from history, scrollRestoration should be set to manual and respected
assert_regexp_match(iframe.contentWindow.location.href, /page-with-fragment/, 'should be back on page-with-fragment page');
iframe.contentWindow.requestAnimationFrame(function() {
assert_equals(iframe.contentWindow.history.scrollRestoration, 'manual', 'navigating back should retain scrollRestoration value');
assert_equals(iframe.contentWindow.scrollX, 0, 'should not scroll to fragment');
assert_equals(iframe.contentWindow.scrollY, 0, 'should not scroll to fragment');
t.done();
});
});
break;
default:
assert_unreached('iframe should load 3 times');
}
});
}, 'Manual scroll restoration should take precedent over scrolling to fragment');
</script>