<!DOCTYPE html>
<html>
<body>
<p>This tests mouseenter and mouseleave events across shadow boundaries.</p>
<div id="hostParent" style="display: inline-block; border: solid 10px green;">
<div id="host" style="display: inline-block;">
    text content
    <p id="targetParent" style="margin: 0;"><span id="target">element content</span></p>
</div></div><pre id="log"></pre>
<script>

const host = document.getElementById('host');
const shadowRoot = host.attachShadow({mode: 'closed'});
shadowRoot.innerHTML = `
    <div id="slotParent" style="width: 200px; margin: 10px; padding: 10px; border: solid 10px blue;">
        <slot id="slot"></slot>
    </div>`;
const slot = shadowRoot.querySelector('slot');

const target = document.getElementById('target');
for (const element of [host.parentNode, host, target, target.parentNode, slot, slot.parentNode]) {
    element.addEventListener('mouseenter', logEvent);
    element.addEventListener('mouseleave', logEvent);
}

function log(text) {
    document.getElementById('log').textContent += text + '\n';
}

function logEvent(event) {
    log(`${event.type} on ${event.target.id}`);
}

function logPhase(phase) {
    log(`\n==${phase}==`);
}

if (!window.eventSender)
    document.write('This test requires eventSender');
else {
    testRunner.dumpAsText();
    const hostRect = host.getBoundingClientRect();
    const targetRect = target.getBoundingClientRect();
    const xAboveText = hostRect.x + 40;
    let y = hostRect.top;
    logPhase('Entering host parent');
    eventSender.mouseMoveTo(xAboveText, y - 5);
    logPhase('Entering host');
    eventSender.mouseMoveTo(xAboveText, y + 5);
    logPhase('Entering shadow content');
    eventSender.mouseMoveTo(xAboveText, y + 15);

    logPhase('Entering slotted text');
    eventSender.mouseMoveTo(xAboveText, targetRect.top - 5);
    logPhase('Entering slotted element');
    eventSender.mouseMoveTo(xAboveText, targetRect.top + 5);

    logPhase('Leaving slotted element');
    eventSender.mouseMoveTo(xAboveText, targetRect.bottom + 5);
    logPhase('Leaving host');
    eventSender.mouseMoveTo(xAboveText, hostRect.bottom + 5);
    
    host.parentNode.style.display = 'none';
}

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