<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<style>
@keyframes test {
    to { opacity: 0; }
}
.test {
    animation: test 1s linear;
}
</style>
<script>
function startCSSAnimation() {
    let element = document.body.appendChild(document.createElement("div"));
    element.className = "test";
}

function test()
{
    let suite = ProtocolTest.createAsyncSuite("Animation.Tracking");

    InspectorProtocol.sendCommand("DOM.getDocument");

    suite.addTestCase({
        name: "Animation.Tracking.StartAndStopTrackingWithEvent",
        test(resolve, reject) {
            InspectorProtocol.awaitEvent({event: "Animation.trackingStart"}).then((messageObject) => {
                ProtocolTest.log("Animation.trackingStart");
                ProtocolTest.expectEqual(typeof messageObject.params.timestamp, "number", "Should have a timestamp when starting.");

                ProtocolTest.evaluateInPage("startCSSAnimation()");
            });

            InspectorProtocol.awaitEvent({event: "Animation.trackingUpdate"}).then((messageObject) => {
                ProtocolTest.log("Animation.trackingUpdate");
                ProtocolTest.expectEqual(typeof messageObject.params.timestamp, "number", "Should should have a timestamp number.");
                ProtocolTest.expectEqual(typeof messageObject.params.event, "object", "Should have an event object.");
                ProtocolTest.expectEqual(typeof messageObject.params.event.trackingAnimationId, "string", "Event should have an animation tracking ID.");
                ProtocolTest.expectEqual(typeof messageObject.params.event.animationState, "string", "Event should have an animation state.");
                ProtocolTest.expectEqual(typeof messageObject.params.event.nodeId, "number", "Event should have a node ID.");
                ProtocolTest.expectEqual(messageObject.params.event.animationName, "test", "Event should have the related CSS animation's name.");

                ProtocolTest.assert(typeof messageObject.params.event.transitionProperty === "undefined", "Event should not have a `transitionProperty` if it has an `animationName`.");

                InspectorProtocol.sendCommand("Animation.stopTracking", {});
            });

            InspectorProtocol.awaitEvent({event: "Animation.trackingComplete"}).then((messageObject) => {
                ProtocolTest.log("Animation.trackingComplete");
                resolve();
            });

            InspectorProtocol.sendCommand("Animation.startTracking", {});
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests that Animation.startTracking and Animation.stopTracking trigger Animation.trackingStart, Animation.trackingUpdate, and Animation.trackingComplete events with expected data.</p>
</body>
</html>
