| OLD | NEW |
| (Empty) |
| 1 <html> | |
| 2 <head> | |
| 3 <script> | |
| 4 function setup() | |
| 5 { | |
| 6 var results = document.createElement('div'); | |
| 7 results.id = "res"; | |
| 8 results.appendChild(document.createTextNode("Results:")); | |
| 9 document.body.appendChild(results); | |
| 10 } | |
| 11 function checkSelection(expected) | |
| 12 { | |
| 13 actual = getSelectedOptions("sl1"); | |
| 14 if (actual.toString() != expected) | |
| 15 log('Incorrect selection: "' + actual + '" instead of "' + e
xpected + '"'); | |
| 16 } | |
| 17 function test() | |
| 18 { | |
| 19 setup(); | |
| 20 | |
| 21 if (window.testRunner) { | |
| 22 testRunner.dumpAsText(); | |
| 23 testRunner.waitUntilDone(); | |
| 24 } | |
| 25 | |
| 26 checkSelection("0"); | |
| 27 | |
| 28 log("1) Make sure onChange doesn't fire when clicking on an init
ially selected item"); | |
| 29 mouseDownOnSelect("sl1", 0, false, false); | |
| 30 mouseUpOnSelect("sl1", 0, false, false); | |
| 31 checkSelection("0"); | |
| 32 | |
| 33 log("2) Make sure onChange fires when deselecting an initially s
elected item"); | |
| 34 mouseDownOnSelect("sl1", 0, false, true); | |
| 35 mouseUpOnSelect("sl1", 0, false, true); | |
| 36 checkSelection(""); | |
| 37 | |
| 38 log("3) Make sure onChange fires when clicking"); | |
| 39 mouseDownOnSelect("sl1", 2, false, false); | |
| 40 mouseUpOnSelect("sl1", 2, false, false); | |
| 41 checkSelection("2"); | |
| 42 | |
| 43 log("4) Make sure onChange doesn't fire when clicking again on t
he same item"); | |
| 44 mouseDownOnSelect("sl1", 2, false, false); | |
| 45 mouseUpOnSelect("sl1", 2, false, false); | |
| 46 checkSelection("2"); | |
| 47 | |
| 48 log("5) Make sure onChange fires when clicking on a new item"); | |
| 49 mouseDownOnSelect("sl1", 0, false, false); | |
| 50 mouseUpOnSelect("sl1", 0, false, false); | |
| 51 checkSelection("0"); | |
| 52 | |
| 53 log("6) Make sure onChange fires when changing the selection wit
h the keyboard"); | |
| 54 keyDownOnSelect("sl1", "downArrow", true, false); | |
| 55 checkSelection("0,1"); | |
| 56 | |
| 57 log("7) Make sure onChange doesn't fire when setting the select
element's value from JS"); | |
| 58 document.getElementById("sl1").value = "2"; | |
| 59 checkSelection("2"); | |
| 60 | |
| 61 log("8) Make sure onChange doesn't fire when clicking on the alr
eady selected option"); | |
| 62 mouseDownOnSelect("sl1", 2, false, false); | |
| 63 mouseUpOnSelect("sl1", 2, false, false); | |
| 64 checkSelection("2"); | |
| 65 | |
| 66 log("9) Make sure onChange doesn't fire when setting an option's
selected state from JS"); | |
| 67 document.getElementById("sl1").item(3).selected = true; | |
| 68 checkSelection("2,3"); | |
| 69 document.getElementById("sl1").item(2).selected = false; | |
| 70 checkSelection("3"); | |
| 71 | |
| 72 log("10) Make sure onChange doesn't fire when clicking on this o
ption"); | |
| 73 mouseDownOnSelect("sl1", 3, false, false); | |
| 74 mouseUpOnSelect("sl1", 3, false, false); | |
| 75 checkSelection("3"); | |
| 76 | |
| 77 log("11) Make sure onChange fires when deselecting the last sele
cted option with a mouse click"); | |
| 78 mouseDownOnSelect("sl1", 3, false, true); | |
| 79 mouseUpOnSelect("sl1", 3, false, true); | |
| 80 checkSelection(""); | |
| 81 | |
| 82 log("12) Make sure onChange doesn't fire when adding a new selec
ted option"); | |
| 83 option = document.createElement("option"); | |
| 84 option.setAttribute("selected", ""); | |
| 85 option.appendChild(document.createTextNode("item 4")); | |
| 86 document.getElementById("sl1").appendChild(option); | |
| 87 checkSelection("4"); | |
| 88 | |
| 89 log("13) Make sure onChange doesn't fire when clicking on it"); | |
| 90 mouseDownOnSelect("sl1", 4, false, false); | |
| 91 mouseUpOnSelect("sl1", 4, false, false); | |
| 92 checkSelection("4"); | |
| 93 | |
| 94 log("14) Make sure onChange fires when clicking on a previously
selected option"); | |
| 95 mouseDownOnSelect("sl1", 3, false, true); | |
| 96 mouseUpOnSelect("sl1", 3, false, true); | |
| 97 checkSelection("3,4"); | |
| 98 | |
| 99 log("15) Make sure onChange doesn't fire when removing a selecte
d option"); | |
| 100 document.getElementById("sl1").removeChild(document.getElementBy
Id("sl1").item(4)); | |
| 101 checkSelection("3"); | |
| 102 | |
| 103 log("16) Make sure onChange doesn't fire when clicking on the op
tion that remains selected"); | |
| 104 mouseDownOnSelect("sl1", 3, false, false); | |
| 105 mouseUpOnSelect("sl1", 3, false, false); | |
| 106 checkSelection("3"); | |
| 107 | |
| 108 log("17) Make sure onChange fires when typing the name of an opt
ion"); | |
| 109 option = document.createElement("option"); | |
| 110 option.appendChild(document.createTextNode("keyboard test")); | |
| 111 document.getElementById("sl1").appendChild(option); | |
| 112 keyDownOnSelect("sl1", "K", false, false); | |
| 113 checkSelection("4"); | |
| 114 | |
| 115 log("18) Make sure onChange doesn't fire when leaving the select
"); | |
| 116 document.getElementById("sl1").blur(); | |
| 117 checkSelection("4"); | |
| 118 | |
| 119 if (window.testRunner) | |
| 120 testRunner.notifyDone(); | |
| 121 } | |
| 122 | |
| 123 function buildModifiers(shift, metaOrCtrl) { | |
| 124 modifiers = []; | |
| 125 if (shift) | |
| 126 modifiers.push("shiftKey"); | |
| 127 if (metaOrCtrl) | |
| 128 modifiers.push("addSelectionKey"); | |
| 129 return modifiers; | |
| 130 } | |
| 131 | |
| 132 function mouseDownOnSelect(selId, index, shift, metaOrCtrl) | |
| 133 { | |
| 134 modifiers = buildModifiers(shift, metaOrCtrl); | |
| 135 var sl = document.getElementById(selId); | |
| 136 var rect = sl.options[index].getBoundingClientRect(); | |
| 137 if (window.eventSender) { | |
| 138 eventSender.mouseMoveTo(rect.left + 1, rect.top + 1); | |
| 139 eventSender.mouseDown(0, modifiers); | |
| 140 } else { | |
| 141 testFailed("This test requires window.eventSender."); | |
| 142 } | |
| 143 } | |
| 144 | |
| 145 function mouseUpOnSelect(selId, index, shift, metaOrCtrl) | |
| 146 { | |
| 147 modifiers = buildModifiers(shift, metaOrCtrl); | |
| 148 var sl = document.getElementById(selId); | |
| 149 var rect = sl.options[index].getBoundingClientRect(); | |
| 150 if (window.eventSender) { | |
| 151 eventSender.mouseMoveTo(rect.left + 1, rect.top + 1); | |
| 152 eventSender.mouseUp(0, modifiers); | |
| 153 } else { | |
| 154 testFailed("This test requires window.eventSender."); | |
| 155 } | |
| 156 } | |
| 157 | |
| 158 function keyDownOnSelect(selId, identifier, shift, metaOrCtrl) | |
| 159 { | |
| 160 modifiers = buildModifiers(shift, metaOrCtrl); | |
| 161 document.getElementById(selId).focus(); | |
| 162 if (window.eventSender) { | |
| 163 eventSender.keyDown(identifier, modifiers); | |
| 164 } else { | |
| 165 testFailed("This test requires window.eventSender."); | |
| 166 } | |
| 167 } | |
| 168 | |
| 169 function getSelectedOptions(selId) | |
| 170 { | |
| 171 result = new Array; | |
| 172 var sl = document.getElementById(selId); | |
| 173 for (i = 0; i < sl.options.length; ++i) | |
| 174 if (sl.item(i).selected) | |
| 175 result.push(i); | |
| 176 return result; | |
| 177 } | |
| 178 | |
| 179 function log(msg) | |
| 180 { | |
| 181 var r = document.getElementById('res'); | |
| 182 r.innerHTML = r.innerHTML + "<br>" + msg; | |
| 183 } | |
| 184 </script> | |
| 185 </head> | |
| 186 <body onload="test()"> | |
| 187 <select id="sl1" size=5 multiple onchange="log('onChange fired')"> | |
| 188 <option selected value="0">item 0</option> | |
| 189 <option value="1">item 1 | |
| 190 <option value="2">item 2 | |
| 191 <option value="3">item 3 | |
| 192 </select> | |
| 193 </body> | |
| 194 </html> | |
| OLD | NEW |