summaryrefslogtreecommitdiffstats
path: root/toolkit/content/tests/chrome/test_scale.xul
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/content/tests/chrome/test_scale.xul')
-rw-r--r--toolkit/content/tests/chrome/test_scale.xul277
1 files changed, 277 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/test_scale.xul b/toolkit/content/tests/chrome/test_scale.xul
new file mode 100644
index 000000000..c1adea7ff
--- /dev/null
+++ b/toolkit/content/tests/chrome/test_scale.xul
@@ -0,0 +1,277 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
+<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
+<!--
+ XUL Widget Test for scale
+ -->
+<window title="scale" width="500" height="600"
+ onload="setTimeout(testtag_scale, 0);"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
+
+<hbox>
+ <vbox>
+ <scale id="scale-horizontal-normal"/>
+ <scale id="scale-horizontal-reverse" dir="reverse"/>
+ </vbox>
+ <scale id="scale-vertical-normal" orient="vertical"/>
+ <scale id="scale-vertical-reverse" orient="vertical" dir="reverse"/>
+</hbox>
+
+<body xmlns="http://www.w3.org/1999/xhtml">
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+</pre>
+</body>
+
+<script>
+<![CDATA[
+
+SimpleTest.waitForExplicitFinish();
+
+function testtag_scale()
+{
+ testtag_scale_inner("scale-horizontal-normal", true, false);
+ testtag_scale_inner("scale-horizontal-reverse", true, true);
+ testtag_scale_inner("scale-vertical-normal", false, false);
+ testtag_scale_inner("scale-vertical-reverse", false, true);
+
+ SimpleTest.finish();
+}
+
+function testtag_scale_inner(elementid, horiz, reverse)
+{
+ var testid = (horiz ? "horizontal " : "vertical ") +
+ (reverse ? "reverse " : "normal ");
+
+ var element = document.getElementById(elementid);
+
+ testtag_scale_States(element, 0, "", 0, 100, testid + "initial");
+
+ element.min = 0;
+ element.max = 10;
+ testtag_scale_States(element, 0, "", 0, 10, testid + "first set");
+
+ element.decrease();
+ is(element.value, 0, testid + "decrease");
+ element.increase();
+ is(element.value, 1, testid + "increase");
+ element.value = 0;
+ is(element.value, 0, testid + "set value");
+
+ testtag_scale_Increments(element, 0, 10, 6, 7, testid + "increase decrease");
+
+ // check if changing the min and max adjusts the value to fit in range
+ element.min = 5;
+ testtag_scale_States(element, 5, "5", 5, 10, testid + "change min");
+ element.value = 15;
+ is(element.value, 10, testid + "change minmax value set too high");
+ element.max = 8;
+ is(element.value, 8, testid + "change max");
+ element.value = 2;
+ is(element.value, 5, testid + "change minmax set too low");
+
+ // check negative values
+ element.min = -15;
+ element.max = -5;
+ testtag_scale_States(element, -5, "-5", -15, -5, testid + "minmax negative");
+ element.value = -15;
+ is(element.value, -15, testid + "change max negative");
+ testtag_scale_Increments(element, -15, -5, 7, 8, testid + "increase decrease negative");
+
+ // check case when min is negative and max is positive
+ element.min = -10;
+ element.max = 35;
+ testtag_scale_States(element, -10, "-10", -10, 35, testid + "minmax mixed sign");
+ testtag_scale_Increments(element, -10, 35, 25, 30, testid + "increase decrease mixed sign");
+
+ testtag_scale_UI(element, testid, horiz, reverse);
+}
+
+function testtag_scale_UI(element, testid, horiz, reverse)
+{
+ element.min = 0;
+ element.max = 20;
+ element.value = 7;
+ element.increment = 2;
+ element.pageIncrement = 4;
+
+ element.focus();
+
+ var leftIncrements = horiz && reverse;
+ var upDecrements = !horiz && !reverse;
+ synthesizeKeyExpectEvent("VK_LEFT", { }, element, "change", testid + "key left");
+ is(element.value, leftIncrements ? 9 : 5, testid + " key left");
+ synthesizeKeyExpectEvent("VK_RIGHT", { }, element, "change", testid + "key right");
+ is(element.value, 7, testid + " key right");
+ synthesizeKeyExpectEvent("VK_UP", { }, element, "change", testid + "key up");
+ is(element.value, upDecrements ? 5 : 9, testid + " key up");
+ synthesizeKeyExpectEvent("VK_DOWN", { }, element, "change", testid + "key down");
+ is(element.value, 7, testid + " key down");
+
+ synthesizeKeyExpectEvent("VK_PAGE_UP", { }, element, "change", testid + "key page up");
+ is(element.value, upDecrements ? 3 : 11, testid + " key page up");
+ synthesizeKeyExpectEvent("VK_PAGE_DOWN", { }, element, "change", testid + "key page down");
+ is(element.value, 7, testid + " key page down");
+
+ synthesizeKeyExpectEvent("VK_HOME", { }, element, "change", testid + "key home");
+ is(element.value, reverse ? 20 : 0, testid + " key home");
+ synthesizeKeyExpectEvent("VK_END", { }, element, "change", testid + "key end");
+ is(element.value, reverse ? 0 : 20, testid + " key end");
+
+ testtag_scale_UI_Mouse(element, testid, horiz, reverse, 4);
+
+ element.min = 4;
+ element.pageIncrement = 3;
+ testtag_scale_UI_Mouse(element, testid + " with min", horiz, reverse, 3);
+
+ element.pageIncrement = 30;
+ testtag_scale_UI_Mouse(element, testid + " with min past", horiz, reverse, 30);
+}
+
+function testtag_scale_UI_Mouse(element, testid, horiz, reverse, pinc)
+{
+ var initial = reverse ? 8 : 12;
+ var newval = initial + (reverse ? pinc : -pinc);
+ var endval = initial;
+ // in the pinc == 30 case, the page increment is large enough that it would
+ // just cause the thumb to reach the end of the scale. Make sure that the
+ // mouse click does not go past the end.
+ if (pinc == 30) {
+ newval = reverse ? 20 : 4;
+ endval = reverse ? 4 : 20;
+ }
+ element.value = initial;
+
+ var hmove = horiz ? 25 : 10;
+ var vmove = horiz ? 10 : 25;
+
+ var leftFn = function () { return reverse ? element.value < newval + 3 : element.value > newval - 3; }
+ var rightFn = function () { return reverse ? element.value < endval - 3 : element.value < endval + 3; }
+
+ // check that clicking the mouse on the trough moves the thumb properly
+ synthesizeMouseExpectEvent(element, hmove, vmove, { }, element, "change", testid + "mouse on left movetoclick=default");
+
+ if (navigator.platform.indexOf("Mac") >= 0) {
+ if (pinc == 30)
+ ok(element.value > 4, testid + " mouse on left movetoclick=default");
+ else
+ ok(leftFn, testid + " mouse on left movetoclick=default");
+ }
+ else {
+ is(element.value, newval, testid + " mouse on left movetoclick=default");
+ }
+
+ var rect = element.getBoundingClientRect();
+ synthesizeMouseExpectEvent(element, rect.right - rect.left - hmove,
+ rect.bottom - rect.top - vmove, { },
+ element, "change", testid + " mouse on right movetoclick=default");
+
+ if (navigator.platform.indexOf("Mac") >= 0) {
+ if (pinc == 30)
+ ok(element.value < 20, testid + " mouse on right movetoclick=default");
+ else
+ ok(rightFn, testid + " mouse on right movetoclick=default");
+ }
+ else {
+ is(element.value, endval, testid + " mouse on right movetoclick=default");
+ }
+
+ element.setAttribute("movetoclick", "true");
+ element.value = initial;
+
+ synthesizeMouseExpectEvent(element, hmove, vmove, { }, element, "change", testid + "mouse on left movetoclick=true");
+ if (pinc == 30)
+ ok(element.value > 4, testid + " mouse on left movetoclick=true");
+ else
+ ok(leftFn, testid + " mouse on left movetoclick=true");
+
+ var rect = element.getBoundingClientRect();
+ synthesizeMouseExpectEvent(element, rect.right - rect.left - hmove,
+ rect.bottom - rect.top - vmove, { },
+ element, "change", testid + " mouse on right movetoclick=true");
+ if (pinc == 30)
+ ok(element.value < 20, testid + " mouse on right movetoclick=true");
+ else
+ ok(rightFn, testid + " mouse on right movetoclick=true");
+
+ element.setAttribute("movetoclick", "false");
+ element.value = initial;
+
+ synthesizeMouseExpectEvent(element, hmove, vmove, { }, element, "change", testid + "mouse on left movetoclick=false");
+ is(element.value, newval, testid + " mouse on left movetoclick=false");
+
+ var rect = element.getBoundingClientRect();
+ synthesizeMouseExpectEvent(element, rect.right - rect.left - hmove,
+ rect.bottom - rect.top - vmove, { },
+ element, "change", testid + " mouse on right movetoclick=false");
+ is(element.value, endval, testid + " mouse on right movetoclick=false");
+
+ element.removeAttribute("movetoclick");
+
+ element.value = reverse ? element.max : element.min;
+
+ synthesizeMouse(element, 8, 8, { type: "mousedown" });
+ synthesizeMouse(element, horiz ? 2000 : 8, horiz ? 8 : 2000, { type: "mousemove" });
+ is(element.value, reverse ? element.min : element.max, testid + " move mouse too far after end");
+ synthesizeMouse(element, 2, 2, { type: "mouseup" });
+
+ synthesizeMouse(element, rect.width - 8, rect.height - 8, { type: "mousedown" });
+ synthesizeMouse(element, horiz ? -2000 : rect.width - 8, horiz ? rect.height - 8 : -2000, { type: "mousemove" });
+ is(element.value, reverse ? element.max : element.min, testid + " move mouse too far before start");
+
+ synthesizeMouse(element, 2, 2, { type: "mouseup" });
+
+ // now check if moving outside in both directions works. On Windows,
+ // it should snap back to the original location.
+ element.value = reverse ? element.max : element.min;
+
+ var expected = (navigator.platform.indexOf("Win") >= 0) ? element.value :
+ (reverse ? element.min : element.max);
+ synthesizeMouse(element, 7, 7, { type: "mousedown" });
+ synthesizeMouse(element, 2000, 2000, { type: "mousemove" });
+ is(element.value, expected, testid + " move mouse ouside in both directions");
+ synthesizeMouse(element, 2, 2, { type: "mouseup" });
+}
+
+function testtag_scale_States(element, evalue, evalueattr, emin, emax, testid)
+{
+ is(element.getAttribute("value"), evalueattr, testid + " value attribute");
+ is(element.value, evalue, testid + " value");
+ is(element.min, emin, testid + " min");
+ is(element.max, emax, testid + " max");
+}
+
+function testtag_scale_Increments(element, min, max, increment, pageIncrement, testid)
+{
+ // check the increase and decrease methods
+ element.increment = increment;
+ element.increase();
+ is(element.value, min + increment, testid + " increase 1");
+ element.increase();
+ is(element.value, max, testid + " increase 2");
+ element.decrease();
+ is(element.value, max - increment, testid + " decrease 1");
+ element.decrease();
+ is(element.value, min, testid + " decrease 2");
+
+ // check the increasePage and decreasePage methods
+ element.pageIncrement = pageIncrement;
+ element.increasePage();
+ is(element.value, min + pageIncrement, testid + " increasePage 1");
+ element.increasePage();
+ is(element.value, max, testid + " increasePage 2");
+ element.decreasePage();
+ is(element.value, max - pageIncrement, testid + " decreasePage 1");
+ element.decreasePage();
+ is(element.value, min, testid + " decreasePage 2");
+}
+
+]]>
+
+</script>
+
+</window>