| <script> |
| if (window.testRunner) { |
| testRunner.waitUntilDone(); |
| testRunner.dumpAsText(); |
| } |
| |
| var haveAddedIFrame = false; |
| |
| window.onbeforeunload = function() { |
| if (!haveAddedIFrame) |
| document.getElementById("logger").innerText += "onbeforeunload called, and iframe hasn't been added yet.\n"; |
| var a = document.createEvent("MouseEvents"); |
| a.initEvent("click", true, true); |
| var d = document.createElement("a"); |
| d.href = "http://localhost:1234/"; |
| d.dispatchEvent(a); |
| } |
| |
| function clicked() { |
| window.location.href="http://127.0.0.1:1234/"; |
| } |
| |
| function addiframe() { |
| document.getElementById("logger").innerText += "Adding iframe.\n"; |
| var frame = document.createElement("iframe"); |
| frame.src = "http://localhost:1234/" |
| document.body.appendChild(frame); |
| haveAddedIFrame = true; |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| |
| function runTest() { |
| clicked(); |
| setTimeout("addiframe();", 0); |
| } |
| |
| </script> |
| <body onload="runTest();"> |
| This test demonstrates a problem with our handling of the beforeunload event.<br> |
| If a script manages to try and navigate the frame from beforeunload - when a navigation is already pending - we end up blowing out the stack by recursively consulting the policy delegate then running onbeforeunload repeatedly.<br> |
| After this happens, the FrameLoader is in a bogus state where it thinks it is in the middle of a provisional load, but it doesn't have a provisional document loader.<br> |
| In this state, the frame is very difficult to navigate anywhere else, and attempts to load new things within the frame can result in a crash.<br> |
| This was reproducibly identified on sears.com following a bizarre Safari specific code path.<br> |
| <a href="javascript:void(clicked())">Click here to run the beforeunload test and blow out the stack</a><br> |
| <a href="javascript:void(addiframe())">Click here to append an iframe and crash</a><br> |
| <div id="logger"></div> |
| </body> |