<!DOCTYPE html><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->
<html>
<head>
<style>
.test {
    width: 100px;
    height: 25px;
    background: red;
    color: green;
}

#host1.green {
    transition: background 0.1s;
    background: green !important;
}

#host3 .green {
    transition: background 0.1s;
    background: green !important;
    height: 100%;
}

</style>
</head>
<body>
<p>Test passes if you see a single 100px by 100px green box below.</p>
<div id="host1" class="test"><div>text</div></div>
<div id="host2" class="test"><div>text</div></div>
<div id="host3" class="test"><div>text</div></div>
<div id="host4" class="test"><div>text</div></div>
<script>

if (window.testRunner)
    testRunner.waitUntilDone();

let expectedEventCount = 0;
let eventCount = 0;

function transitionEndEvent()
{
    ++eventCount;
    if (eventCount == expectedEventCount) {
        if (window.testRunner)
            testRunner.notifyDone();
    }
}

{
    const host = document.getElementById('host1');
    host.attachShadow({mode: 'closed'}).innerHTML = `
        <slot></slot>
    `;

    getComputedStyle(host.firstChild).backgroundColor;
    ++expectedEventCount;
    document.addEventListener('transitionend', transitionEndEvent);
    host.classList.toggle('green');
}

{
    const host = document.getElementById('host2');
    host.attachShadow({mode: 'closed'}).innerHTML = `
    <style>
    :host(.green) {
        transition: background 0.1s;
        background: green !important;
    }
    </style>
    <slot></slot>
    `;

    getComputedStyle(host.firstChild).backgroundColor;
    ++expectedEventCount;
    document.addEventListener('transitionend', transitionEndEvent);
    host.classList.toggle('green');
}

{
    const host = document.getElementById('host3');
    host.attachShadow({mode: 'closed'}).innerHTML = `
    <slot></slot>
    `;

    getComputedStyle(host.firstChild).backgroundColor;
    ++expectedEventCount;
    document.addEventListener('transitionend', transitionEndEvent);
    host.firstChild.classList.toggle('green');
}

{
    const host = document.getElementById('host4');
    host.attachShadow({mode: 'closed'}).innerHTML = `
    <style>
    ::slotted(.green) {
        transition: background 0.1s;
        background: green !important;
        height: 100%;
    }
    </style>
    <slot></slot>
    `;

    getComputedStyle(host.firstChild).backgroundColor;
    ++expectedEventCount;
    document.addEventListener('transitionend', transitionEndEvent);
    host.firstChild.classList.toggle('green');
}

</script>
</body>
</html>
