blob: 0539f98be89c3a5b6f734868820cda1db0f138f6 [file] [log] [blame]
<!-- webkit-test-runner [ UsesBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<p>This tests that pageshow event is fired before the object element loads when a document in the page cache is restored.</p>
<div id="result"></div>
<script>
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
let newWindow;
function start() {
result.textContent = 'Running...';
newWindow = window.open(URL.createObjectURL(newPage));
}
const newPage = new Blob([`<!DOCTYPE html>
<html>
<body>
<p>This is new page.</p>
<iframe id="iframe2"></iframe>
<iframe id="iframe1"></iframe>
<script>
window.pageShowed = false;
iframe2.onload = () => {
opener.postMessage({step: 'opened'}, '*');
}
onmessage = () => {
opener.postMessage({step: 'ready'}, '*');
}
iframe1.contentDocument.body.innerHTML = '<span>hello</span>';
iframe2.src = URL.createObjectURL(opener.subframePage);
</scr` + `ipt>
</body>
</html>`], {'type': 'text/html'});
window.subframePage = new Blob([`<!DOCTYPE html>
<html>
<body>
<object id="object1"></object>
<script>
window.addEventListener('pagehide', () => {
const object1 = window.object1;
object1.remove();
document.body.appendChild(object1);
object1.addEventListener('beforeload', () => {
top.opener.postMessage({step: 'check', pageShowed: !!top.iframe1.contentDocument.body.firstChild.offsetHeight}, '*');
}, {once: true});
});
</sc` + `ript>
</body>
</html>`], {'type': 'text/html'});
const secondPage = new Blob([`<!DOCTYPE html>
<html>
<body onload="opener.postMessage({step: 'navigated'}, '*')">
<p>second page.</p>
</body>
</html>`], {'type': 'text/html'});
let isLastStep = false;
onmessage = (event) => {
if (isLastStep && event.data.step != 'check')
return;
switch (event.data.step) {
case 'opened':
newWindow.postMessage('getready', '*');
break;
case 'ready':
newWindow.location = URL.createObjectURL(secondPage);
break;
case 'navigated':
isLastStep = true;
newWindow.history.back();
break;
case 'check':
result.textContent = event.data.pageShowed ? 'PASS' : 'FAIL';
newWindow.close();
if (window.testRunner)
testRunner.notifyDone();
break;
}
}
if (window.testRunner)
window.onload = start;
else
document.write('<button onclick="start()">Start</button>');
setTimeout(() => testRunner.notifyDone(), 3000);
</script>
</body>
</html>