blob: 34f7fc0047df6818eef761b62bf56f135371dacd [file] [log] [blame]
<html>
<head>
<script>
function setup()
{
var results = document.createElement('div');
results.id = "res";
results.appendChild(document.createTextNode("Results:"));
document.body.appendChild(results);
}
function checkSelection(expected)
{
actual = getSelectedOptions("sl1");
if (actual.toString() != expected)
log('Incorrect selection: "' + actual + '" instead of "' + expected + '"');
}
function test()
{
setup();
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
checkSelection("0");
log("1) Make sure onChange doesn't fire when clicking on an initially selected item");
mouseDownOnSelect("sl1", 0, false, false);
mouseUpOnSelect("sl1", 0, false, false);
checkSelection("0");
log("2) Make sure onChange fires when deselecting an initially selected item");
mouseDownOnSelect("sl1", 0, false, true);
mouseUpOnSelect("sl1", 0, false, true);
checkSelection("");
log("3) Make sure onChange fires when clicking");
mouseDownOnSelect("sl1", 2, false, false);
mouseUpOnSelect("sl1", 2, false, false);
checkSelection("2");
log("4) Make sure onChange doesn't fire when clicking again on the same item");
mouseDownOnSelect("sl1", 2, false, false);
mouseUpOnSelect("sl1", 2, false, false);
checkSelection("2");
log("5) Make sure onChange fires when clicking on a new item");
mouseDownOnSelect("sl1", 0, false, false);
mouseUpOnSelect("sl1", 0, false, false);
checkSelection("0");
log("6) Make sure onChange fires when changing the selection with the keyboard");
keyDownOnSelect("sl1", "downArrow", true, false);
checkSelection("0,1");
log("7) Make sure onChange doesn't fire when setting the select element's value from JS");
document.getElementById("sl1").value = "2";
checkSelection("2");
log("8) Make sure onChange doesn't fire when clicking on the already selected option");
mouseDownOnSelect("sl1", 2, false, false);
mouseUpOnSelect("sl1", 2, false, false);
checkSelection("2");
log("9) Make sure onChange doesn't fire when setting an option's selected state from JS");
document.getElementById("sl1").item(3).selected = true;
checkSelection("2,3");
document.getElementById("sl1").item(2).selected = false;
checkSelection("3");
log("10) Make sure onChange doesn't fire when clicking on this option");
mouseDownOnSelect("sl1", 3, false, false);
mouseUpOnSelect("sl1", 3, false, false);
checkSelection("3");
log("11) Make sure onChange fires when deselecting the last selected option with a mouse click");
mouseDownOnSelect("sl1", 3, false, true);
mouseUpOnSelect("sl1", 3, false, true);
checkSelection("");
log("12) Make sure onChange doesn't fire when adding a new selected option");
option = document.createElement("option");
option.setAttribute("selected", "");
option.appendChild(document.createTextNode("item 4"));
document.getElementById("sl1").appendChild(option);
checkSelection("4");
log("13) Make sure onChange doesn't fire when clicking on it");
mouseDownOnSelect("sl1", 4, false, false);
mouseUpOnSelect("sl1", 4, false, false);
checkSelection("4");
log("14) Make sure onChange fires when clicking on a previously selected option");
mouseDownOnSelect("sl1", 3, false, true);
mouseUpOnSelect("sl1", 3, false, true);
checkSelection("3,4");
log("15) Make sure onChange doesn't fire when removing a selected option");
document.getElementById("sl1").removeChild(document.getElementById("sl1").item(4));
checkSelection("3");
log("16) Make sure onChange doesn't fire when clicking on the option that remains selected");
mouseDownOnSelect("sl1", 3, false, false);
mouseUpOnSelect("sl1", 3, false, false);
checkSelection("3");
log("17) Make sure onChange fires when typing the name of an option");
option = document.createElement("option");
option.appendChild(document.createTextNode("keyboard test"));
document.getElementById("sl1").appendChild(option);
keyDownOnSelect("sl1", "K", false, false);
checkSelection("4");
log("18) Make sure onChange doesn't fire when leaving the select");
document.getElementById("sl1").blur();
checkSelection("4");
if (window.testRunner)
testRunner.notifyDone();
}
function mouseDownOnSelect(selId, index, shift, metaOrCtrl)
{
var meta = false;
var ctrl = false;
if (metaOrCtrl) {
if (navigator.userAgent.search(/\bMac OS X\b/) != -1)
meta = true;
else
ctrl = true;
}
var sl = document.getElementById(selId);
var itemHeight = 14;
var border = 1;
var y = border + index * itemHeight - window.pageYOffset;
var event = document.createEvent("MouseEvent");
event.initMouseEvent("mousedown", true, true, document.defaultView, 1, sl.offsetLeft + border, sl.offsetTop + y, sl.offsetLeft + border, sl.offsetTop + y, ctrl, false, shift, meta, 0, document);
sl.dispatchEvent(event);
}
function mouseUpOnSelect(selId, index, shift, metaOrCtrl)
{
var meta = false;
var ctrl = false;
if (metaOrCtrl) {
if (navigator.userAgent.search(/\bMac OS X\b/) != -1)
meta = true;
else
ctrl = true;
}
var sl = document.getElementById(selId);
var itemHeight = 14;
var border = 1;
var y = border + index * itemHeight - window.pageYOffset;
var event = document.createEvent("MouseEvent");
event.initMouseEvent("mouseup", true, true, document.defaultView, 1, sl.offsetLeft + border, sl.offsetTop + y, sl.offsetLeft + border, sl.offsetTop + y, ctrl, false, shift, meta, 0, document);
sl.dispatchEvent(event);
}
function keyDownOnSelect(selId, identifier, shift, metaOrCtrl)
{
modifiers = [];
if (shift)
modifiers[0] = "shiftKey";
if (metaOrCtrl) {
if (navigator.userAgent.search(/\bMac OS X\b/) != -1)
modifiers[modifiers.length] = "metaKey";
else
modifiers[modifiers.length] = "controlKey";
}
document.getElementById(selId).focus();
eventSender.keyDown(identifier, modifiers);
}
function getSelectedOptions(selId)
{
result = new Array;
var sl = document.getElementById(selId);
for (i = 0; i < sl.options.length; ++i)
if (sl.item(i).selected)
result.push(i);
return result;
}
function log(msg)
{
var r = document.getElementById('res');
r.innerHTML = r.innerHTML + "<br>" + msg;
}
</script>
</head>
<body onload="test()">
<select id="sl1" size=5 multiple onchange="log('onChange fired')">
<option selected value="0">item 0</option>
<option value="1">item 1
<option value="2">item 2
<option value="3">item 3
</select>
</body>
</html>