<!DOCTYPE html>
<html>
<head>
    <title>CSS Variables - Transitions - From value to no value</title>

    <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">

    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <style>
        #target
        {
            transition-property: --value;
            transition-duration: 1s;
        }
        #target
        {
            color: var(--value);
        }
    </style>
</head>
<body>

    <div id="target" style="--value: green">This text should transition from green to black over a period of 1 second.</div>

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

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

    test(function() {
        assert_equals(window.getComputedStyle(document.getElementById("target")).getPropertyValue("--value").trim(), "green", "--value is green before transition runs");
        }, "Verify CSS variable value before transition");

    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, 128, 0)", "rgba(0, 128, 0, 1)"],
            "color is green before transition runs");
        }, "Verify substituted color value before transition");

    var afterAnimationVariableTest = async_test("Verify CSS variable value after transition");
    document.getElementById("target").addEventListener("transitionend", afterAnimationVariableTest.step_func_done(function() {
        assert_equals(window.getComputedStyle(document.getElementById("target")).getPropertyValue("--value").trim(), "", "--value has no value after transition runs")
        }));

    var afterAnimationColorTest = async_test("Verify substituted color value after transition");
    document.getElementById("target").addEventListener("transitionend", afterAnimationColorTest.step_func_done(function() {
        assert_in_array(window.getComputedStyle(document.getElementById("target")).getPropertyValue("color").trim(),
            ["rgb(0, 0, 0)", "rgba(0, 0, 0, 1)"],
            "color is black after transition runs")
        }));

    // Trigger transition
    document.getElementById("target").removeAttribute("style");

    // Force another layout pass
    document.documentElement.offsetHeight;
</script>

</body>
</html>
