<!DOCTYPE html>
<html><head><meta charset=utf-8><title>Page Dismissal Modal Dialogs mainFrame</title><script>
function showMessages(event) {
    alert(event + " PASS");
    confirm(event + " PASS");
    prompt(event + " PASS", "PASS");
}

function handleEvent(event, otherFrame) {
    showMessages(event);
    var click = otherFrame.document.createEvent("UIEvent");
    click.initUIEvent("click", true, false, otherFrame, 1);
    otherFrame.document.getElementById("anchor").dispatchEvent(click);
}

function registerEvents(name, thisFrame, otherFrame) {
  thisFrame.addEventListener("beforeunload", function() { handleEvent(name + " beforeunload", otherFrame) }, false);
  thisFrame.addEventListener("pagehide", function() { handleEvent(name + " pagehide", otherFrame) }, false);
  thisFrame.addEventListener("unload", function() { handleEvent(name + " unload", otherFrame) }, false);
}

addEventListener("load", function() {
    registerEvents("mainFrame", window, frames[0]);
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }
    location = "resources/pass-and-notify-done.html";
}, false);
</script></head><body><div>

<span onclick="showMessages('mainFrame click')" id=anchor>anchor</span>
<iframe src=resources/page-dismissal-modal-dialogs-iframe.html></iframe>

This page registers handlers for various types of unload events and attempts to
popup modal dialogs through various JavaScript calls in each of them. Also, it
does the same thing in an iframe. In addition, it tries to popup dialogs in the
context of one frame when running a handler in the other frame.
</div></body></html>
