<!DOCTYPE html>
<html>
<head>
<style>
#red {
    background-color: red;
    position: absolute;
    left: 50px;
    top: 50px;
    height: 100px;
    width: 100px;
}

#blue {
    background-color: blue;
    position: absolute;
    left: 50px;
    top: 200px;
    height: 100px;
    width: 100px;
}
#blue:hover::after {
    content: "Hovered.";
}

</style>
<script src="../../resources/js-test.js"></script>
</head>
<body onload="runtest()" style="margin:0">

<script type="text/javascript">
var redDiv;
var blueDiv;
var containerDiv;
var blueText;
var redDivComputedContentWhenHovered = "Red hovered.";
var blueDivComputedContentWhenNotHovered = "";
var blueDivComputedContentWhenHovered = '"Hovered."';
function runtest()
{
    if (!window.testRunner || !window.eventSender)
        return;

    if (!window.internals || !internals.setIsCursorVisible) {
        debug("internals.setIsCursorVisible is required to run this test.");
        return;
    }

    testRunner.waitUntilDone();

    containerDiv = document.getElementById('container');

    redDiv = document.createElement("div");
    redDiv.id = "red";
    blueDiv = document.createElement("div");
    blueDiv.id = "blue";
    insertDivs();

    document.addEventListener('keydown', function(e) {
        blueDiv.style.top = "50px";
        redDiv.parentNode.removeChild(redDiv);
    });

    initialHoverOverRedDiv();

    debug("Mouse is visible, deleting the red div.");
    eventSender.keyDown("a");
    window.setTimeout(testAfterDeleteCursorVisible, 0);
}

function testAfterDeleteCursorVisible()
{
    checkBlueDivComputedContent(blueDivComputedContentWhenHovered);
    window.setTimeout(testWithInvisibleCursor, 0);
}

function testWithInvisibleCursor()
{
    blueDiv.parentNode.removeChild(blueDiv);
    insertDivs();

    initialHoverOverRedDiv();

    debug("Setting the mouse cursor to be invisible.");
    internals.setIsCursorVisible(document, false);
    shouldBeEqualToString("redDiv.innerHTML", redDivComputedContentWhenHovered);
    shouldBeEqualToString("blueDiv.innerHTML", blueDivComputedContentWhenNotHovered);

    debug("Mouse is invisible, deleting the red div.");
    eventSender.keyDown("a");
    window.setTimeout(testAfterDeleteCursorInvisible, 0);
}

function testAfterDeleteCursorInvisible()
{
    checkBlueDivComputedContent("none");
    testRunner.notifyDone();
}


// Helper functions

function checkBlueDivComputedContent(expectedText)
{
    shouldBe("blueDiv.offsetTop", "50");
    blueText = window.getComputedStyle(document.querySelector('#blue'), ':after').content;
    shouldBeEqualToString("blueText", expectedText);
}

function insertDivs()
{
    debug("Adding the red and blue divs.");
    blueDiv.style.top = "200px";
    containerDiv.appendChild(redDiv);
    containerDiv.appendChild(blueDiv);
    redDiv.addEventListener('mouseover', function(e) {
        this.innerHTML = redDivComputedContentWhenHovered;
    });
    shouldBe("blueDiv.offsetTop", "200");
    shouldBe("redDiv.offsetTop", "50");
}

function initialHoverOverRedDiv()
{
    debug("Mouse is visible, moving it over the red div.");
    internals.setIsCursorVisible(document, true);
    eventSender.mouseMoveTo(100, 100);
    shouldBeEqualToString("redDiv.innerHTML", redDivComputedContentWhenHovered);
    shouldBeEqualToString("blueDiv.innerHTML", blueDivComputedContentWhenNotHovered);
}
</script>

<div id="container">
</div>

<p>Test for <a href="http://crbug.com/240722">http://crbug.com/240722</a>. If the mouse cursor is not visible, no new hover effects should be invoked when the currently hovered node is removed from the DOM. Press any key to delete the red div.</p>

<div id="console"></div>
</body>
</html>
