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

var TEST_STARTED = 0;
var TEST_WITH_ENABLING_POPUP_BLOCKER = 1;
var TEST_WITH_DISABLING_POPUP_BLOCKER = 2;
var TEST_COMPLETED = 3;

function nextTestStage() {
    window.testStage++;
    if (TEST_WITH_ENABLING_POPUP_BLOCKER == window.testStage) {
        window.popupBlockerIsEnabled = true;
        doClick();
    } else if (TEST_WITH_DISABLING_POPUP_BLOCKER == window.testStage) {
        window.popupBlockerIsEnabled = false;
        doClick();
    } else {
        document.getElementById("console").innerHTML = "PASSED";
        testRunner.notifyDone();
    }
}

function dispatchEvent(obj, evt)  { 
    return function() {
        return obj.dispatchEvent(evt);
    }
}

function simulateClick() {
    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent("click", true, true, window,
        0, 0, 0, 0, 0, false, false, false, false, 0, null);
    var cb = document.getElementById("anchor"); 
    Promise.resolve().then(dispatchEvent(cb, evt));
}

function openWindow(evt) {
    window.open("data:text/html\, try to open new window", "_blank");
    // If we enabled the popup blocker, the new window should be blocked.
    // The windowCount should still be 1.
    var expectedWindowCount = 1;
    // If we disabled the popup blocker, the new window should be created.
    // The windowCount should be 2.
    if (!window.popupBlockerIsEnabled)
        expectedWindowCount = 2;
    // Encounter a failure, quit test.
    if (testRunner.windowCount() != expectedWindowCount) {
        testRunner.notifyDone();
        return;
    }
    // Go to next test stage.
    Promise.resolve().then(nextTestStage);
}

function doClick() {
    testRunner.setPopupBlockingEnabled(window.popupBlockerIsEnabled);
    // Send a mouse-click event to click the button.
    eventSender.mouseMoveTo(0, 0);
    eventSender.mouseMoveTo(20, 20);
    eventSender.mouseDown();
    eventSender.mouseUp();
}

function test() {
    if (!window.testRunner)
        return;
    window.testStage = TEST_STARTED;
    nextTestStage();
}

</script>
<body onload="test();">
<input type="button" onclick="simulateClick();" value="click me" id="btn"><br>
<a onclick="openWindow(event)" id="anchor"> open a new window </a><br>
The JavaScript created (untrusted) event inside a user-initiated (trusted) event should not cache the UserGesture status. This test is for bug https://bugs.webkit.org/show_bug.cgi?id=50508.
<div id="console">FAILED</div>
