<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function triggerPause() {
    TestPage.addResult("Before debugger");
    debugger;
    TestPage.addResult("After debugger");
}

function testProcessingUserGesture() {
    if (window.internals)
        TestPage.addResult(window.internals.isProcessingUserGesture() ? "In User Gesture" : "Not in User Gesture");
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("Debugger.BreakpointAction");

    suite.addTestCase({
        name: "Debugger.BreakpointAction.emulateUserGesture.false",
        description: "Evalute with the emulateUserGesture option set to false.",
        async test() {
            let action = new WI.BreakpointAction(WI.BreakpointAction.Type.Evaluate, {data: `testProcessingUserGesture()`, emulateUserGesture: false});
            WI.debuggerManager.debuggerStatementsBreakpoint.addAction(action);

            let pausedPromise = WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Paused);
            InspectorTest.evaluateInPage("triggerPause()");
            await pausedPromise;

            InspectorTest.assert(WI.debuggerManager.activeCallFrame, "Should have active call frame.");

            await Promise.all([
                WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Resumed),
                WI.debuggerManager.resume(),
            ]);

            WI.debuggerManager.debuggerStatementsBreakpoint.removeAction(action);
        }
    });

    suite.addTestCase({
        name: "Debugger.BreakpointAction.emulateUserGesture.true",
        description: "Evalute with the emulateUserGesture option set to true.",
        async test() {
            let action = new WI.BreakpointAction(WI.BreakpointAction.Type.Evaluate, {data: `testProcessingUserGesture()`, emulateUserGesture: true});
            WI.debuggerManager.debuggerStatementsBreakpoint.addAction(action);

            let pausedPromise = WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Paused);
            InspectorTest.evaluateInPage("triggerPause()");
            await pausedPromise;

            InspectorTest.assert(WI.debuggerManager.activeCallFrame, "Should have active call frame.");

            await Promise.all([
                WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Resumed),
                WI.debuggerManager.resume(),
            ]);

            WI.debuggerManager.debuggerStatementsBreakpoint.removeAction(action);
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for Debugger.BreakpointAction emulateUserGesture parameter.</p>
</body>
</html>
