<!DOCTYPE html>
<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>
