<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
</head>
<body>
<input id="readonlyNumber" type="number" onmouseup="mouseupEventOnReadonlyNumber()" />
<input id="disabledNumber" type="number" onmouseup="mouseupEventOnDisabledNumber()" />
<p>
This tests if the value of a number input form does not continue
to increase/decrease in the following scenario.<br/>
(1) Click the spin button of the input form.<br/>
(2) Hook the 'mouseup' event and disable the input form.<br/>
(3) Enable the input form after some delay.<br/>
To run this test manually, input any value in the input form
and then click the spin-down button.
At this point, click the spin-down button quickly and
do not move the cursor from the spin-down button after the click.
If the value decreases by just 1, this test passes.
</p>
<div id="console"></div>
<script>
var testInputs;
var testDelays;
var input;
var delay;
window.jsTestIsAsync = true;

if (window.testRunner && window.eventSender) {
    testInputs = [document.getElementById("readonlyNumber"), document.getElementById("disabledNumber")];
    setTimeout(function() {
        nextInputTest();
    }, 0);
}

function nextInputTest() {
    if (testInputs.length == 0) {
        finishJSTest();
    } else {
        input = testInputs.shift();
        testDelays = [1, 10, 100];
        debug("");
        debug("Test on a " + (input.id == "readonlyNumber" ? "readonly" : "disabled") + " number input form:");
        nextDelayTest();
    }
}

function nextDelayTest() {
    if (testDelays.length == 0) {
        nextInputTest();
    } else {
        delay = testDelays.shift();
        initializeInputAttributes(input, 1234567);
        debug("delay = " + delay + " ms");
        clickSpinDownButton(input);
        setTimeout(function() {
            shouldBeEqualToString('input.value', "1234566");
            nextDelayTest();
        }, 500);
    }
}

function mouseupEventOnReadonlyNumber() {
    input.readOnly = true;
    setTimeout(function() {
        input.readOnly = false;
    }, delay);
}

function mouseupEventOnDisabledNumber() {
    input.disabled = true;
    setTimeout(function() {
        input.disabled = false;
    }, delay);
}

function initializeInputAttributes(input, value) {
    input.value = value;
    input.disabled = false;
    input.readOnly = false;
}

function clickSpinDownButton(input) {
    var x = input.offsetLeft + input.offsetWidth - 6;
    var y = input.offsetTop + input.offsetHeight - 6;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();
    eventSender.mouseUp();
}
</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
