<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="../../resources/image-preload-helper.js"></script>
<style type="text/css">
</style>
</head>
<body>
<p id="description"></p>
<p><a href=https://bugs.webkit.org/show_bug.cgi?id=100059>Bug 100059</a></p>
<div id="test-container">
  <div>Implicit default cursor</div>
  <div style='cursor: url(resources/greenbox-3frames.cur), pointer'>CUR file with 3 frames, largest of which (2nd frame) is 20x12 with hotspot at (18,11).</div>
</div>
<br/>
<div id="console"></div>
<script>
var imagesLeftToLoad = 0;
var testContainer = document.getElementById('test-container');

function runTests() {
    // Can't do anything useful here without eventSender
    if (window.eventSender) {
        var nodesToTest = document.querySelectorAll('#test-container > div');
        for (var i = 0; i < nodesToTest.length; i++) {
            var node = nodesToTest[i];
            debug('TEST CASE: ' + node.textContent);

            // Make sure the node is visible and move the mouse over top of it.
            document.body.scrollTop = node.offsetTop - 50;
            eventSender.mouseMoveTo(node.offsetLeft + 3, node.offsetTop - document.body.scrollTop + 3);

            // Get details of the current mouse cursor.
            // Note that we could return structured data which we then validate, but that's a lot more
            // work and is redundant with relying on the expected output anyway.  Better to just dump
            // it and inspect that it matches the description.
            debug('Cursor Info: ' + window.internals.getCurrentCursorInfo());
            debug('');
        }
        // This text is redundant with the test output - hide it
        testContainer.style.display = 'none';
    }
    
    finishJSTest();
}

description("Test that mouse cursors are applied correctly.");

if (!window.eventSender) {
    testFailed('This test requires DumpRenderTree');
}

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
    window.jsTestIsAsync = true;
}

// Now wait for each image to load or fail to load before starting tests.
// Without this we can get null images in the cursors - eg. no known size.
preloadImagesFromStyle(testContainer, 1, runTests);

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