| <!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> |