<title>Test that new transitions do not run while we are suspended</title>
<style>
#box {
    position: relative;
    left: 0px;
    height: 100px;
    width: 100px;
    background-color: blue;
    -webkit-transition: left 0.1s;
}
</style>
<script>
var box;

function suspend()
{
    if (window.internals)
        internals.suspendAnimations();
}

function resume()
{
    if (window.internals)
        internals.resumeAnimations();
}

function transitionEnded(event)
{
    log("Transition ended on element with id: " + event.target.id);
}

function suspendAndContinue()
{
    log("*** Suspending Animations/Transitions");
    suspend();
    setTimeout(function() {
        if (window.internals)
            log("Transitions should be suspended: " + (window.internals.animationsAreSuspended() ? "PASS" : "FAIL"));
        log("*** Setting left property to 200px. We should NOT see transition events.")
        box.style.left = "200px";
        setTimeout(function() {
            endTest();
        }, 200);
    }, 100);
}

function resumeAndContinue()
{
}

function endTest()
{
    log("*** Resuming Animations/Transitions");
    resume();
    if (window.internals)
        log("Transitions should not be suspended: " + (window.internals.animationsAreSuspended() ? "FAIL" : "PASS"));

    resume(); // Just in case.
    log("*** Test finished");
    if (window.testRunner)
        testRunner.notifyDone();
}

function startTest()
{
    log("*** Starting test.")

    box = document.getElementById("box");
    document.addEventListener("webkitTransitionEnd", transitionEnded, false);

    if (window.internals)
        log("Transitions should not be suspended: " + (window.internals.animationsAreSuspended() ? "FAIL" : "PASS"));

    setTimeout(function() {
        log("*** Setting left property to 100px. We should see transition events.")
        box.style.left = "100px";
        setTimeout(function() {
            suspendAndContinue();
        }, 200);
    }, 50);
}

function log(message)
{
    var results = document.getElementById("results");
    results.innerHTML = results.innerHTML + message + "<br>";
}

if (window.testRunner) {
    testRunner.waitUntilDone();
    testRunner.dumpAsText();
}

window.addEventListener("load", startTest, false);

</script>
<p>This test sets the left property on the box below. It will only have reproducible output when run in the test system</p>
<div id="box"></div>
<div id="results">
</div>
