<!doctype html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="./resources/timeline-helper.js"></script>
<script>
function installTimer()
{
    setTimeout(function() {
        callFunction(mul, add(1, 3), 3);
        hook();
    });
}

function add(a, b)
{
    TestPage.addResult("Calling add(): " + a + " + " + b);
    return a + b;
}

function mul(a, b)
{
    TestPage.addResult("Calling mul(): " + a + " * " + b);
    return a * b;
}

function test()
{
    // First, set up the breakpoint, start timeline capturing, and trigger execution of installTimer().
    WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.ScriptAdded, function(event) {
        var scriptObject = event.data.script;

        if (!/timeline-helper\.js$/.test(scriptObject.url))
            return;

        var location = scriptObject.createSourceCodeLocation(17, 0);  // Inside timeline-helper.js:hook()
        var breakpoint = new WI.Breakpoint(location);
        WI.debuggerManager.addBreakpoint(breakpoint);
        InspectorTest.addResult("Added a breakpoint inside hook().")

        WI.timelineManager.startCapturing();
        InspectorTest.evaluateInPage("installTimer()");
    });

    // Second, the debugger will pause during timeline capturing. Resume, then stop timeline capturing.
    WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, function(event) {
            InspectorTest.addResult("Debugger paused; resuming...");

            WI.debuggerManager.resume().then(function() {
                InspectorTest.addResult("Debugger resumed; stopping timeline capture.");
                WI.timelineManager.stopCapturing();
            })
    });

    // When timeline capturing stops, inspect the resulting timeline records for a profile.
    WI.timelineManager.addEventListener(WI.TimelineManager.Event.CapturingStopped, function(event) {
        var recording = WI.timelineManager.activeRecording;
        var scriptTimeline = recording.timelines.get(WI.TimelineRecord.Type.Script);
        console.assert(scriptTimeline);

        InspectorTest.addResult("Timeline capturing stopped. Inspecting the active recording....");

        for (var record of scriptTimeline.records) {
            if (record.eventType !== WI.ScriptTimelineRecord.EventType.TimerFired)
                continue;

            var result = record.profile ? "TRUE" : "FALSE";
            InspectorTest.addResult("TimerFired timeline record has profile attached: " + result);
        }

        InspectorTest.completeTest();
    });

    InspectorTest.reloadPage();
}
</script>
</head>
<body onload="runTest()">
    <p>Testing that profiling data is correctly generated and attached to Timeline records when the debugger pauses and resumes while capturing timelines.</p>
</body>
</html>
