3 <script src="../js/resources/js-test-pre.js"></script>
7 vertical-align: middle;
15 -webkit-user-drag: none;
16 -webkit-user-select: none;
20 var didFireMousedownForFirstMouseButton;
21 var didFireMousedownForSecondMouseButton;
22 var firstMouseButtonElem;
23 var previouslyChosenFirstMouseButton = 0;
24 var secondMouseButtonElem;
27 // Extracted from the DOM Level 3 Events Mouse Event Types section <http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button>.
28 var LeftMouseButton = 0;
29 var MiddleMouseButton = 1;
30 var RightMouseButton = 2;
32 window.onload = function()
34 firstMouseButtonElem = document.getElementById("firstMouseButton");
35 secondMouseButtonElem = document.getElementById("secondMouseButton");
36 firstMouseButtonElem.onchange = function() {
37 disableIllogicalSecondMouseButtonOptions();
40 secondMouseButtonElem.onchange = resetTest;
42 square = document.getElementById("square");
43 square.onmousedown = checkIfDoneOnMouseDown;
44 square.onmouseup = checkIfDoneOnMouseUp;
45 square.oncontextmenu = cancelContextMenu;
50 function toIEMouseButton(w3cButton)
55 case MiddleMouseButton:
57 case RightMouseButton:
60 return; // We shouldn't get here.
63 function shortMouseButtonName(w3cButton)
68 case MiddleMouseButton:
70 case RightMouseButton:
73 return; // We shouldn't get here.
76 function mouseButtonName(w3cButton)
78 return shortMouseButtonName(w3cButton) + " mouse button";
81 function cancelContextMenu(event)
83 event = event || window.event;
84 if (event.preventDefault)
85 event.preventDefault();
87 // Assume this script is executing within Internet Explorer.
88 event.returnValue = false;
92 function checkIfDoneOnMouseDown(event)
94 var pressedButtons; // A bitmask that represents the combination of buttons that are currently being pressed.
95 if (event && event.buttons)
96 pressedButtons = event.buttons; // DOM Level 3 Events (Working Draft 07 September 2010).
98 // For browsers than don't support event.buttons (or IE's window.event.button) we convert event.button to
99 // the corresponding bitmask to simplify the logic below.
100 pressedButtons = toIEMouseButton(event.button);
102 // Assume this script is running within Internet Explorer.
103 pressedButtons = window.event.button;
106 var chosenFirstMouseButton = firstMouseButtonElem.selectedIndex;
107 var chosenSecondMouseButton = secondMouseButtonElem.selectedIndex;
108 if (!didFireMousedownForFirstMouseButton && (pressedButtons & toIEMouseButton(chosenFirstMouseButton)) == toIEMouseButton(chosenFirstMouseButton)) {
109 didFireMousedownForFirstMouseButton = true;
110 square.innerHTML = "Now, " + shortMouseButtonName(chosenSecondMouseButton) + " click";
111 } else if (didFireMousedownForFirstMouseButton && (pressedButtons & toIEMouseButton(chosenSecondMouseButton)) == toIEMouseButton(chosenSecondMouseButton))
112 didFireMousedownForSecondMouseButton = true;
113 if (didFireMousedownForFirstMouseButton && didFireMousedownForSecondMouseButton) {
114 testPassed("received mousedown for the " + mouseButtonName(chosenSecondMouseButton) + " while pressing the " + mouseButtonName(chosenFirstMouseButton) + ".");
119 function checkIfDoneOnMouseUp()
121 if (didFireMousedownForFirstMouseButton && !didFireMousedownForSecondMouseButton) {
122 // Without loss of generality, either the mousedown for the right button button wasn't
123 // dispatched or the user didn't press the right mouse button while pressing left mouse button.
124 var chosenFirstMouseButton = firstMouseButtonElem.selectedIndex;
125 var chosenSecondMouseButton = secondMouseButtonElem.selectedIndex;
126 testFailed("didn't receive mousedown for the " + mouseButtonName(chosenSecondMouseButton) + " while pressing the " + mouseButtonName(chosenFirstMouseButton) + ".");
133 didFireMousedownForFirstMouseButton = false;
134 didFireMousedownForSecondMouseButton = false;
135 square.innerHTML = "Press and hold the " + mouseButtonName(firstMouseButtonElem.selectedIndex) + " on me";
138 function disableIllogicalSecondMouseButtonOptions()
140 secondMouseButtonElem.options[previouslyChosenFirstMouseButton].disabled = false;
141 if (firstMouseButtonElem.selectedIndex === secondMouseButtonElem.selectedIndex)
142 secondMouseButtonElem.options[(secondMouseButtonElem.selectedIndex + 1) % secondMouseButtonElem.length].selected = true;
143 secondMouseButtonElem.options[firstMouseButtonElem.selectedIndex].disabled = true;
144 previouslyChosenFirstMouseButton = firstMouseButtonElem.selectedIndex;
149 if (!window.eventSender)
152 var numFirstMouseButtonOptions = firstMouseButtonElem.options.length;
153 var numSecondMouseButtonOptions = secondMouseButtonElem.options.length;
154 eventSender.mouseMoveTo(square.offsetLeft + 10, square.offsetTop + 10);
155 var firstMouseButton = 0;
156 var secondMouseButton = 0;
157 while (firstMouseButton < numFirstMouseButtonOptions) {
158 if (firstMouseButton === secondMouseButton)
160 if (secondMouseButton >= numSecondMouseButtonOptions) {
162 secondMouseButton = 0;
164 if (firstMouseButton >= numFirstMouseButtonOptions)
167 firstMouseButtonElem.options[firstMouseButton].selected = true;
168 secondMouseButtonElem.options[secondMouseButton].selected = true;
169 if (secondMouseButton % numSecondMouseButtonOptions === 0)
170 debug('<br />When pressing and holding the "' + mouseButtonName(firstMouseButton) + '"<br />');
171 eventSender.mouseDown(firstMouseButton);
172 eventSender.leapForward(100);
173 eventSender.mouseDown(secondMouseButton);
174 eventSender.mouseUp(secondMouseButton);
175 eventSender.mouseUp(firstMouseButton);
176 eventSender.leapForward(100);
178 resetTest(); // We reset the test here in case neither a mousedown nor mouseup event was fired.
180 document.body.removeChild(document.getElementById("test-container"));
181 debug('<br /><span class="pass">TEST COMPLETE</span>');
186 <p id="description"></p>
187 <div id="test-container">
188 <p>Note: Ensure mouse gestures are disabled when running this test in Opera. In Opera 11.10 you can disable gestures by selecting Opera > Preferences > Advanced > Shortcuts. Then uncheck Enable mouse gestures. Also, to test "pressing-and-holding the right mouse button then clicking the left mouse" (*) ensure that Enable Mouse Flips is disabled. To disable it open <a href="opera:config" target="_blank">opera:config</a> then search for "Enable Mouse Flips" and uncheck it. As of 04/15/2011, for some reason (*) neither <span class="pass">PASS</span>es nor <span class="fail">FAIL</span>s.</p>
189 <!-- The <option>s in these <select>s are explicitly ordered to match the DOM Level 3 Events mouse button values for Left, Middle, and Right mouse buttons. -->
190 <label for="firstMouseButton">Will press and hold</label> <select id="firstMouseButton">
191 <option>Left mouse button</option>
192 <option>Middle mouse button</option>
193 <option>Right mouse button</option>
195 <span>on blue square then</span>
196 <label for="secondMouseButton">click</label> <select id="secondMouseButton">
197 <option disabled>Left mouse button</option>
198 <option selected>Middle mouse button</option>
199 <option>Right mouse button</option>
202 <div id="square"></div>
205 <div id="console"></div>
207 description("This test verifies that we fire a mousedown event whenever pressing and holding a mouse button A while simultaneously " +
208 "clicking with mouse button B, where A != B.<br/>" +
209 "For each mouse button that is pressed and held, iterates through the possible second mouse buttons that can be clicked.");