<!DOCTYPE html><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->
<html>
<head>
<style>
@keyframes top-keyframes {
    0% { background: red; }
    100% { background: green; }
}
@keyframes shadow-keyframes {
    0% { background: green; }
    100% { background: red; }
}
@keyframes slotted-keyframes {
    0% { background: green; }
    100% { background: red; }
}
@keyframes deep-slotted-keyframes {
    0% { background: green; }
    100% { background: red; }
}
.test {
    width: 100px;
    height: 25px;
    background: red;
    color: green;
}

#host1.green {
    animation-duration: 0.1s;
    animation-iteration-count: 1;
    animation-name: top-keyframes;
    animation-fill-mode: forwards;
}

</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 animationEndEvent()
{
    ++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('animationend', animationEndEvent);
    host.classList.toggle('green');
}

{
    const host = document.getElementById('host2');
    host.attachShadow({mode: 'closed'}).innerHTML = `
    <style>
    @keyframes shadow-keyframes {
        0% { background: red; }
        100% { background: green; }
    }
    :host(.green) {
        animation-duration: 0.1s;
        animation-iteration-count: 1;
        animation-name: shadow-keyframes;
        animation-fill-mode: forwards;
    }
    </style>
    <slot></slot>
    `;

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

{
    const host = document.getElementById('host3');
    const shadow = host.attachShadow({mode: 'closed'});
    shadow.innerHTML = `
    <style>
    @keyframes slotted-keyframes {
        0% { background: red; }
        100% { background: green; }
    }
    ::slotted(.green) {
        animation-duration: 0.1s;
        animation-iteration-count: 1;
        animation-name: slotted-keyframes;
        animation-fill-mode: forwards;
        height: 100%;
    }
    div { height: 100%; }
    </style>
    <div><slot></slot></div>
    `;

    shadow.querySelector('div').attachShadow({mode: 'closed'}).innerHTML = `
    <style>
    @keyframes slotted-keyframes {
        0% { background: green; }
        100% { background: red; }
    }
    </style>
    <slot></slot>
    `;

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

{
    const host = document.getElementById('host4');
    const shadow = host.attachShadow({mode: 'closed'});
    shadow.innerHTML = `
    <style>
    @keyframes deep-slotted-keyframes {
        0% { background: green; }
        100% { background: red; }
    }
    div { height: 100%; }
    </style>
    <div><slot></slot></div>
    `;

    shadow.querySelector('div').attachShadow({mode: 'closed'}).innerHTML = `
    <style>
    @keyframes deep-slotted-keyframes {
        0% { background: red; }
        100% { background: green; }
    }
    ::slotted(.green) {
        animation-duration: 0.1s;
        animation-iteration-count: 1;
        animation-name: deep-slotted-keyframes;
        animation-fill-mode: forwards;
        height: 100%;
    }
    </style>
    <slot></slot>
    `;

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

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