blob: 9c98fc2cb40ec0b4f72eb17c5294534a335b9a7b [file] [log] [blame]
<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test.js"></script>
<script>
description('This tests navigating away from a document after setting a selection deletes the document.');
jsTestIsAsync = true;
function appendIframe()
{
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.contentDocument.body.innerHTML = '<p>hello</p>';
return iframe;
}
function setEditorStates(iframe)
{
iframe.contentDocument.designMode = 'on';
iframe.contentWindow.getSelection().setPosition(iframe.contentDocument.body, 1);
iframe.contentDocument.execCommand('bold', false, null);
}
function wait(duration)
{
return new Promise(function (resolve) {
setTimeout(resolve, 0);
});
}
var frame;
var initialDocumentCount;
async function runTest()
{
initialDocumentCount = internals.numberOfLiveDocuments();
let frames = [];
const count = 200;
for (let i = 0; i < count; ++i)
frames.push(appendIframe());
await wait(0); // Make sure the transient document created by inserting an iframe is removed.
GCController.collect();
for (let frame of frames)
setEditorStates(frame);
await wait(0); // Wait for UI update timer to fire.
let resolved = 0;
for (let frame of frames) {
frame.src = "resources/select-iframe-focusin-document-crash-frame.html";
frame.onload = async () => {
++resolved;
if (resolved !== count)
return;
let before = internals.numberOfLiveDocuments();
await wait(0);
GCController.collect();
let after = internals.numberOfLiveDocuments();
let delta = before - after;
if (delta > 0.15 * count)
debug("PASS freed more than 15% of documents");
else
debug("FAIL freed less than 15% of documents");
finishJSTest();
};
}
}
if (!window.GCController || !window.internals) {
debug('This test requires GCController and internals');
} else {
// Clear out any lingering documents from the previous tests.
GCController.collect();
GCController.collect();
runTest();
}
</script>
</body>
</html>