<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
<script src="resources/shadow-dom.js"></script>
</head>
<body>
<p id="description"></p>
<div id="sandbox"></div>
<pre id="console"></pre>
<script>
description("Tests to ensure that MouseEvent's offsetX and offsetY are adjusted in re-targeting.");

function moveMouseOver(element)
{
    if (!window.eventSender || !window.internals)
        return;

    var x = element.offsetLeft + element.offsetWidth / 2;
    var y = element.offsetTop + element.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
}

var eventRecords = {};

function recordEvent(event)
{
    var eventType = event.type
    var eventRecord = {}
    eventRecord['currentTarget'] = event.currentTarget.id
    eventRecord['target'] = event.target.id
    eventRecord['offsetX'] = event.offsetX;
    eventRecord['offsetY'] = event.offsetY;
    eventRecords[event.currentTarget.id] = eventRecord;
}

function addEventListeners(nodes)
{
    for (var i = 0; i < nodes.length; ++i) {
        var node = getNodeInShadowTreeStack(nodes[i]);
        node.addEventListener('mouseover', recordEvent, false);
    }
}

function testMouseEventOffset()
{
    var sandbox = document.getElementById('sandbox');
    sandbox.innerHTML = '';
    sandbox.appendChild(
        createDOM('div', {'id': 'top', 'style': 'padding-top: 77px;'},
                  createDOM('div', {'id': 'shadow-host', 'style': 'padding-left: 100px; padding-top: 20px'},
                            createShadowRoot(
                                createDOM('div', {'id': 'parent'},
                                          createDOM('div', {'id': 'target', 'style': 'padding-top: 10px; width: 80px'}))))));
    addEventListeners(['top', 'shadow-host', 'shadow-host/parent']);
    sandbox.offsetLeft;
    moveMouseOver(getNodeInShadowTreeStack('shadow-host/target'));

    shouldBe("eventRecords['parent']['offsetY']", "5");
    shouldBe("eventRecords['shadow-host']['offsetY']", "5 + 20");
    shouldBe("eventRecords['top']['offsetY']", "5 + 20");

    shouldBe("eventRecords['parent']['offsetX']", "80 / 2");
    shouldBe("eventRecords['shadow-host']['offsetX']", "80 / 2 + 100");
    shouldBe("eventRecords['top']['offsetX']", "80 / 2 + 100");
}

function test()
{
    if (window.testRunner)
        testRunner.dumpAsText();

    testMouseEventOffset();
}

test();
</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
