<!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=100550>Bug 100550</a></p>
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink" width="0" height="0">
  <defs>
    <cursor id="greenbox" xlink:href="resources/greenbox.png" x="0" y="0"/>
  </defs>
</svg>
<div id="test-container">
  <div>Implicit default cursor</div>
  <div style='cursor: default'>Explicit default</div>
  <div style='cursor: auto'>Explicit auto</div>
  <div style='cursor: none'>No cursor</div>
  <div style='cursor: pointer'>Pointer</div>
  <div style='cursor: -webkit-grabbing'>-webkit-grabbing</div>
  <div style='cursor: url(resources/greenbox.png), hand'>Existing 25x25 image</div>
  <div style='cursor: url(doesntexist_FAIL.png), pointer'>Invalid URL with fallback to pointer</div>
  <div style='cursor: url(doesntexist_FAIL.png), url(resources/greenbox.png), pointer'>Invalid with fallback to 25x25 image</div>
  <div style='cursor: url(resources/greenbox.png) 0 0, pointer'>Image with explicit hot spot at (0,0)</div>
  <div style='cursor: url(resources/greenbox.png) 20 10, pointer'>Image with explicit hot spot at (20,10)</div>
  <div style='cursor: url(resources/greenbox.png) -1 -1, pointer'>Image with explicit hot spot at (-1,-1)</div>
  <div style='cursor: url(resources/greenbox.png) 30 30, pointer'>Image with explicit hot spot outside image at (30,30)</div>
  <div style='cursor: url(resources/greenbox-hotspot5-4.cur), pointer'>Image with implicit hot spot at (5,4)</div>
  <div style='cursor: url(resources/greenbox-hotspot5-4.cur) 20 10, pointer'>Image with explicit hot spot at (20,10) overriding implicit hot spot</div>
  <div style='cursor: url(resources/greenbox-hotspot35-4.cur), pointer'>Image with implicit hot spot outside image at (35,4)</div>
  <div style='cursor: url(resources/onload-image.png), pointer'>Over large image with fallback to pointer</div>
  <div style='cursor: url(#greenbox), pointer'>SVG cursor</div>
  <div style='cursor: url(mouse-cursor_FAIL.html), url(unknown-scheme:cursor_FAIL.png), pointer'>Multiple invalid cursors with fallback to pointer</div>
  <div style='cursor: url(#nonexistent_FAIL), pointer'>Nonexistent SVG cursor with fallback to pointer</div>
  <div><a href='#'>A link with default cursor</a></div>
  <div style='cursor: wait'><a href='#'>Link with default cursor overriding wait</a></div>
  <div style='cursor: wait'><div style='cursor: doesntexist'>Wait cursor which should not be affected by unknown cursor rule</div></div>
</div>
<br/>
<div id="console"></div>
<script>

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.scrollingElement.scrollTop = node.offsetTop - 50;
            eventSender.mouseMoveTo(node.offsetLeft + 3, node.offsetTop - document.scrollingElement.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, 9, runTests, /(#greenbox|_FAIL)/);

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