<!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=99493>Bug 99493</a></p>
<div id="test-container">
  <div style='cursor: -webkit-image-set(url(resources/greenbox.png) 1x), pointer'>25x25 image at 1x</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox.png) 2x), pointer'>25x25 image at 2x</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox.png) 1x, url(resources/greenbox30.png) 2x), pointer'>25x25 image at 1x, 30x30 image at 2x</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox.png) 1.5x, url(resources/greenbox30.png) 5x), pointer'>25x25 image at 1.5x, 30x30 image at 5x</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox.png) 0.0001x), pointer'>Invalid tiny scale with fallback to pointer</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox200.png) 1x), pointer'>Over-large image with fallback to pointer</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox200.png) 4x), pointer'>200x200 image at 4x (not over-large in UI pixels)</div>
  <div style='cursor: -webkit-image-set(url(doesntexist.png) 1x), url(resources/greenbox.png), pointer'>Non-existent image in image-set with fallback to 25x25 image</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox.png) 1x, url(resources/greenbox30.png) 2x) 5 3, pointer'>Explicit hotspot at (5,3) logical in 1x and 2x</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox.png) 0.7x, url(resources/greenbox30.png) 1.4x) 7 3, pointer'>Explicit hotspot at (7,3) logical in 0.7x and 1.4x - should round to nearest integer</div>
  <div style='cursor: -webkit-image-set(url(resources/greenbox-hotspot5-4.cur) 1x, url(resources/greenbox30-hotspot28-3.cur) 2x), pointer'>Implicit hot-spot at (5,4) physical for 1x and (28,3) physical for 2x</div>
</div>
<br/>
<div id="console"></div>
<script>
var imagesLeftToLoad = 0;
var testContainer = document.getElementById('test-container');

function checkCursors() {
    debug('Checking cursors with device pixel ratio of ' + window.devicePixelRatio);  
    debug('----------------------------------------------');
	
    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('');
    }
}

function runTests() {
    if (window.eventSender) {
        checkCursors();
        // Repeat in high-dpi mode
        testRunner.setBackingScaleFactor(2, function() {
            // Failed images are apparently reset on scale factor change. 
            loadImages([{ url: 'doesntexist.png', error: true }], function() {
                checkCursors();
                testContainer.style.display = 'none';
                finishJSTest();
            });
    	});	
    } else {
        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, 6, runTests, /doesntexist/);

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