<!DOCTYPE html><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->

<script src="../../../resources/js-test-pre.js"></script>

<style>
#before:before,
#after:after {
    content: "";
    display: block;
    height: 50px;
    width: 50px;
    -webkit-transition: width 1ms;
    transition: width 1ms;
}

#before.transition:before,
#after.transition:after {
    height: 10px;
    width: 10px;
}

#before,
#after {
    display: inline-block;
    border: 1px solid black;
    background: red;
}

#after.transition,
#before.transition {
    background: green;
}
</style>

<div id="before"></div>
<div id="after"></div>

<script>
description('Transitions on :before and :after pseudo elements should run and fire DOM events');

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

var expectedEvents = [ ["width", "before", "::before"] , ["width", "after", "::after"] ];
var currentEvent = 0;

function recordTransitionEvent()
{
    shouldBe("event.propertyName", "expectedEvents[currentEvent][0]");
    shouldBe("event.target.id", "expectedEvents[currentEvent][1]");
    shouldBe("event.pseudoElement", "expectedEvents[currentEvent][2]");
    if (currentEvent == 1) {
        isSuccessfullyParsed();
        if (window.testRunner)
            testRunner.notifyDone();
    } else {
        currentEvent++;
        testTransition('after');
    }
}

function testTransition(id)
{
    var div = document.getElementById(id);
    div.className = 'transition';
}

onload = function() {
    document.addEventListener( 'transitionend', recordTransitionEvent);
    testTransition('before');
};
</script>
