<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.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, 100);
}

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.addBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint)
            .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.addBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint)
            .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.addBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint)
            .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.addBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint)
            .then(InspectorTest.EventBreakpoint.disableBreakpoint)
            .then(InspectorTest.EventBreakpoint.removeBreakpoint)
            .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName))
            .catch(reject);
        },
        teardown: InspectorTest.EventBreakpoint.teardown,
    });

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