<!DOCTYPE html>
<html>
<head>
    <title>CSS Variables - Animation - Substitute Into Keyframe</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>

    <meta rel="author" title="Kevin Babbitt">
    <meta rel="author" title="Greg Whitworth">
    <link rel="author" title="Microsoft Corporation" href="http://microsoft.com" />
    <link rel="help" href="http://www.w3.org/TR/css-variables-1/#syntax">

    <style>
        @keyframes coloranim
        {
            from { color: blue; }
            to { color: var(--endColor); }
        }

        /* Start the animation in the paused state and fill at both ends so we can inspect values from both keyframes. */
        #target
        {
            animation-name: coloranim;
            animation-duration: 1s;
            animation-play-state: paused;
            animation-fill-mode: both;
        }
        #target
        {
            color: red;
            --endColor: green;
        }
    </style>
</head>
<body>

    <div id="target">This text should animate from blue to green over a period of 1 second.</div>

<script type="text/javascript">
    "use strict";

    // Force an initial layout pass
    document.documentElement.offsetHeight;

    test(function() {
        // Different browsers generate interpolated colors differently, so check multiple valid forms.
        assert_in_array(window.getComputedStyle(document.getElementById("target")).getPropertyValue("color").trim(),
            ["rgb(0, 0, 255)", "rgba(0, 0, 255, 1)"],
            "color is blue before animation runs");
        }, "Verify color before animation");

    var animationTest = async_test("Verify color after animation");

    animationTest.step(function() {
        // Set event handler
        document.getElementById("target").addEventListener("animationend", animationTest.step_func(function() {
            assert_in_array(window.getComputedStyle(document.getElementById("target")).getPropertyValue("color").trim(),
                ["rgb(0, 128, 0)", "rgba(0, 128, 0, 1)"],
                "color is green after animation runs")
            animationTest.done();
            }));

        // Trigger animation
        document.getElementById("target").style.animationPlayState = "running";
    });
</script>

</body>
</html>
