<html>
<head>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.setCanOpenWindows();
    testRunner.setPopupBlockingEnabled(true);
    testRunner.setCloseRemainingWindowsWhenComplete(true);
    testRunner.waitUntilDone();
}

function test() {
    if (!window.testRunner)
        return;
    // Record current window count.
    window.windowCount = window.testRunner.windowCount();
    console.log("window count: " + window.testRunner.windowCount());
    // Send a mouse-click event to set the input focus to the test plugin.
    eventSender.mouseMoveTo(0, 0);
    eventSender.mouseMoveTo(20, 20);
    eventSender.mouseDown();
    eventSender.mouseUp();
}

// This function will be called when plugin receives a mousedown event.
function popup_by_mousedown() {
    // Open a new window.
    window.open("data:text/html\, open new window by mouse down", "_blank");
    // Check the new opened window and logging the result.
    console.log("window count: " + window.testRunner.windowCount());
    if (window.testRunner.windowCount() == (window.windowCount + 1)) {
        document.getElementById("mousedown_output").innerHTML = "PASSED";
        window.windowCount++;
    }
   setTimeout(send_key_to_plugin, 100);
}

function send_key_to_plugin() {
    // Send keyboard events to the plugin.
    eventSender.mouseMoveTo(0, 0);
    eventSender.mouseMoveTo(60, 60);
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.keyDown('p');
}

// This function will be called when plugin receives a keydown event.
function popup_by_keydown() {
    // Open a new window.
    window.open("data:text/html\, open new window by key down", "_blank");
    // Check the new opened window and logging the result.
    console.log("window count: " + window.testRunner.windowCount());
    if (window.testRunner.windowCount() == (window.windowCount + 1))
        document.getElementById("keydown_output").innerHTML = "PASSED";
    // Wait for plugin stopping and ending this test.
    setTimeout(end_test, 100);
}

function end_test() {
    // Change focus back to window to stop the plugin event logging.
    window.focus();
    // Close the test.
     setTimeout(function() {testRunner.notifyDone();}, 1);
}
</script>
</head>
<body onload="internals.updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(); test();">
<embed type="application/x-webkit-test-netscape" width=100 height=40 evaluatescript="mouse::popup_by_mousedown()" windowedplugin="false"></embed><br>
<embed type="application/x-webkit-test-netscape" width=100 height=40 evaluatescript="key::popup_by_keydown()" windowedplugin="false"></embed><br>
Specify a script and a mouse/keyboard event to the plugin. The specified script will be evaluated in the browser when the specified event is received by the plugin. The test is for bug https://bugs.webkit.org/show_bug.cgi?id=41292.<br>
Opening window by mouse down is <span id="mousedown_output">FAILED</span><br>
Opening window by key down is <span id="keydown_output">FAILED</span>
</body>
</html>
