<!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.userIsInteracting() ? "User is Interacting" : "User is NOT Interacting");
}

function test()
{
    const expression = `testProcessingUserGesture()`;
    const objectGroup = "test";

    let suite = InspectorTest.createAsyncSuite("Debugger.evaluateOnCallFrame.emulateUserGesture.userIsInteracting");

    suite.addTestCase({
        name: "EvaluateWithoutEmulatingUserGesture",
        description: "Evalute with the emulateUserGesture option set to false.",
        async test() {
            InspectorTest.assert(!WI.debuggerManager.paused, "Should not be paused.");

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

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

            DebuggerAgent.evaluateOnCallFrame.invoke({callFrameId: WI.debuggerManager.activeCallFrame.id, expression, objectGroup, emulateUserGesture: false}, (error, resultValue, wasThrown) => {
                InspectorTest.assert(!error, "Should not be a protocol error.");
            });

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

    suite.addTestCase({
        name: "EvaluateWithEmulatingUserGesture",
        description: "Evalute with the emulateUserGesture option set to true.",
        async test() {
            InspectorTest.assert(!WI.debuggerManager.paused, "Should not be paused.");

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

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

            DebuggerAgent.evaluateOnCallFrame.invoke({callFrameId: WI.debuggerManager.activeCallFrame.id, expression, objectGroup, emulateUserGesture: true}, (error, resultValue, wasThrown) => {
                InspectorTest.assert(!error, "Should not be a protocol error.");
            });

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

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