<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="../debugger/resources/breakpoint-options-utilities.js"></script>
<script src="../debugger/resources/log-active-stack-trace.js"></script>
<script src="resources/event-breakpoint-utilities.js"></script>
<script>

function handleWindow_setTimeout() {
    TestPage.dispatchEventToFrontend("TestPage-setTimeout");
}

function trigger_setTimeout() {
    setTimeout(handleWindow_setTimeout, 10);
}

function test() {
    const eventName = "setTimeout";

    let suite = InspectorTest.createAsyncSuite("DOMDebugger.Event.Timer");

    suite.addTestCase({
        name: `DOMDebugger.Event.Timeout.AddBreakpoint`,
        description: "Check that the debugger pauses for enabled breakpoints.",
        test(resolve, reject) {
            let paused = false;

            let listener = WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                paused = true;

                InspectorTest.pass("Should pause before event handler is run.");
                logActiveStackTrace();

                WI.debuggerManager.resume()
                .catch(reject);
            });

            InspectorTest.singleFireEventListener(`TestPage-${eventName}`, (event) => {
                if (!paused) {
                    WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);

                    InspectorTest.fail("Should pause before event handler is run.");
                }

                resolve();
            });

            InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Timeout)
            .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName))
            .catch(reject);
        },
        teardown: InspectorTest.EventBreakpoint.teardown,
    });

    suite.addTestCase({
        name: `DOMDebugger.Event.Timeout.AddDisabledBreakpoint`,
        description: "Check that debugger does not pause for disabled breakpoints.",
        test(resolve, reject) {
            InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Timeout, eventName, "Should not pause for disabled breakpoint.");

            InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Timeout)
            .then(InspectorTest.EventBreakpoint.disableBreakpoint)
            .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName))
            .catch(reject);
        },
        teardown: InspectorTest.EventBreakpoint.teardown,
    });

    suite.addTestCase({
        name: `DOMDebugger.Event.Timeout.RemoveBreakpoint`,
        description: "Check that debugger does not pause for removed breakpoint.",
        test(resolve, reject) {
            InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Timeout, eventName, "Should not pause for removed breakpoint.");

            InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Timeout)
            .then(InspectorTest.EventBreakpoint.removeBreakpoint)
            .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName))
            .catch(reject);
        },
        teardown: InspectorTest.EventBreakpoint.teardown,
    });

    suite.addTestCase({
        name: `DOMDebugger.Event.Timeout.RemoveDisabledBreakpoint`,
        description: "Check that a disabled breakpoint can be removed.",
        test(resolve, reject) {
            InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Timeout, eventName, "Should not pause for removed disabled breakpoint.");

            InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Timeout)
            .then(InspectorTest.EventBreakpoint.disableBreakpoint)
            .then(InspectorTest.EventBreakpoint.removeBreakpoint)
            .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName))
            .catch(reject);
        },
        teardown: InspectorTest.EventBreakpoint.teardown,
    });

    InspectorTest.BreakpointOptions.addTestCases(suite, {
        createBreakpoint() {
            return InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Timeout, {eventName});
        },
        triggerBreakpoint() {
            return Promise.all([
                InspectorTest.awaitEvent("TestPage-" + eventName),
                InspectorTest.evaluateInPage(`trigger_${eventName}()`),
            ]);
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Tests for Event Timer breakpoints.</p>
</body>
</html>
