| Index: LayoutTests/fast/dom/defaultView-on-detached-document.html
|
| diff --git a/LayoutTests/fast/dom/defaultView-on-detached-document.html b/LayoutTests/fast/dom/defaultView-on-detached-document.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b5095d2d88625b93ecceacb3f528a750baa59396
|
| --- /dev/null
|
| +++ b/LayoutTests/fast/dom/defaultView-on-detached-document.html
|
| @@ -0,0 +1,51 @@
|
| +<!DOCTYPE html>
|
| +<script src="../../resources/js-test.js"></script>
|
| +<script>
|
| +var jsTestIsAsync = true;
|
| +
|
| +description("Tests that document.defaultView on a detached document doesn't crash.");
|
| +
|
| +var cachedWindow;
|
| +var cachedDocument;
|
| +var testFrameUnloaded = false;
|
| +
|
| +// DRT dumps out the number of unload handlers associated with a document once it loads.
|
| +// Unfortunately, load order is not guaranteed, so wait until the first frame has finished loading
|
| +// before setting up the rest of the test.
|
| +function setupTest()
|
| +{
|
| + var frame2 = document.createElement('iframe');
|
| + frame2.srcdoc = '<script>window.onunload=function() { window.top.finishTest(); };</scr' + 'ipt>';
|
| + frame2.onload = runTest;
|
| + document.getElementById('frames').appendChild(frame2);
|
| +}
|
| +
|
| +function runTest()
|
| +{
|
| + var i = document.getElementById("testFrame");
|
| + // Make sure DOMWindow doesn't get GCed and clear Document's pointer back to it.
|
| + cachedWindow = i.contentWindow;
|
| + cachedDocument = i.contentDocument;
|
| + // This test is structured to catch a document.defaultView crash when all of the following are true:
|
| + // 1. Document's pointer back to DOMWindow has not yet been cleared by DOMWindow destruction.
|
| + // 2. DOMWindow's pointer back to its Frame has not yet been cleared by Frame destruction.
|
| + // 3. The frame is already detached.
|
| + // One way to satisfy this condition is to test the value of document.defaultView when removing
|
| + // a DOM node that contains multiple subframes, since ChildFrameDisconnector keeps a ref to the
|
| + // affected HTMLFrameOwnerElements (and consequently the Frame) on the stack.
|
| + var frameContainer = document.getElementById("frames");
|
| + frameContainer.parentNode.removeChild(frameContainer);
|
| +}
|
| +
|
| +function finishTest()
|
| +{
|
| + shouldBeTrue("testFrameUnloaded");
|
| + shouldBeUndefined("cachedDocument.defaultView");
|
| + finishJSTest();
|
| +}
|
| +</script>
|
| +<body onload="setupTest()">
|
| + <div id="frames">
|
| + <iframe id="testFrame" srcdoc="<script>window.onunload=function() { window.top.testFrameUnloaded = true; };</script>"></iframe>
|
| + </div>
|
| +</body>
|
|
|