1
MARIONETTE_CONTEXT="chrome";
2
MARIONETTE_TIMEOUT=120000;
4
// Must be synchronized with nsIDOMWindowUtils.
5
const COMPOSITION_ATTR_RAWINPUT = 0x02;
6
const COMPOSITION_ATTR_SELECTEDRAWTEXT = 0x03;
7
const COMPOSITION_ATTR_CONVERTEDTEXT = 0x04;
8
const COMPOSITION_ATTR_SELECTEDCONVERTEDTEXT = 0x05;
12
* see http://mxr.mozilla.org/mozilla-central/source/testing/mochitest/tests/SimpleTest/EventUtils.js
14
sendMouseEvent: function EventUtils__sendMouseEvent(aEvent, aTarget, aWindow) {
15
if (['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout'].indexOf(aEvent.type) == -1) {
16
throw new Error("sendMouseEvent doesn't know about event type '" + aEvent.type + "'");
23
if (typeof(aTarget) == "string") {
24
aTarget = aWindow.document.getElementById(aTarget);
27
var event = aWindow.document.createEvent('MouseEvent');
29
var typeArg = aEvent.type;
30
var canBubbleArg = true;
31
var cancelableArg = true;
32
var viewArg = aWindow;
33
var detailArg = aEvent.detail || (aEvent.type == 'click' ||
34
aEvent.type == 'mousedown' ||
35
aEvent.type == 'mouseup' ? 1 :
36
aEvent.type == 'dblclick'? 2 : 0);
37
var screenXArg = aEvent.screenX || 0;
38
var screenYArg = aEvent.screenY || 0;
39
var clientXArg = aEvent.clientX || 0;
40
var clientYArg = aEvent.clientY || 0;
41
var ctrlKeyArg = aEvent.ctrlKey || false;
42
var altKeyArg = aEvent.altKey || false;
43
var shiftKeyArg = aEvent.shiftKey || false;
44
var metaKeyArg = aEvent.metaKey || false;
45
var buttonArg = aEvent.button || 0;
46
var relatedTargetArg = aEvent.relatedTarget || null;
48
event.initMouseEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg,
49
screenXArg, screenYArg, clientXArg, clientYArg,
50
ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg,
51
buttonArg, relatedTargetArg);
53
aTarget.dispatchEvent(event);
56
sendChar: function EventUtils_sendChar(aChar, aWindow) {
57
// DOM event charcodes match ASCII (JS charcodes) for a-zA-Z0-9.
58
var hasShift = (aChar == aChar.toUpperCase());
59
this.synthesizeKey(aChar, { shiftKey: hasShift }, aWindow);
62
sendString: function EventUtils_sendString(aStr, aWindow) {
63
for (var i = 0; i < aStr.length; ++i) {
64
this.sendChar(aStr.charAt(i), aWindow);
68
sendKey: function EventUtils_sendKey(aKey, aWindow) {
69
var keyName = "VK_" + aKey.toUpperCase();
70
this.synthesizeKey(keyName, { shiftKey: false }, aWindow);
73
_getDOMWindowUtils: function EventUtils__getDOMWindowUtils(aWindow) {
78
// we need parent.SpecialPowers for:
79
// layout/base/tests/test_reftests_with_caret.html
80
// chrome: toolkit/content/tests/chrome/test_findbar.xul
81
// chrome: toolkit/content/tests/chrome/test_popup_anchor.xul
82
/*if ("SpecialPowers" in window && window.SpecialPowers != undefined) {
83
return SpecialPowers.getDOMWindowUtils(aWindow);
85
if ("SpecialPowers" in parent && parent.SpecialPowers != undefined) {
86
return parent.SpecialPowers.getDOMWindowUtils(aWindow);
89
//TODO: this is assuming we are in chrome space
90
return aWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
91
getInterface(Components.interfaces.nsIDOMWindowUtils);
94
_computeKeyCodeFromChar: function EventUtils__computeKeyCodeFromChar(aChar) {
95
if (aChar.length != 1) {
98
const nsIDOMKeyEvent = Components.interfaces.nsIDOMKeyEvent;
99
if (aChar >= 'a' && aChar <= 'z') {
100
return nsIDOMKeyEvent.DOM_VK_A + aChar.charCodeAt(0) - 'a'.charCodeAt(0);
102
if (aChar >= 'A' && aChar <= 'Z') {
103
return nsIDOMKeyEvent.DOM_VK_A + aChar.charCodeAt(0) - 'A'.charCodeAt(0);
105
if (aChar >= '0' && aChar <= '9') {
106
return nsIDOMKeyEvent.DOM_VK_0 + aChar.charCodeAt(0) - '0'.charCodeAt(0);
108
// returns US keyboard layout's keycode
112
return nsIDOMKeyEvent.DOM_VK_BACK_QUOTE;
114
return nsIDOMKeyEvent.DOM_VK_1;
116
return nsIDOMKeyEvent.DOM_VK_2;
118
return nsIDOMKeyEvent.DOM_VK_3;
120
return nsIDOMKeyEvent.DOM_VK_4;
122
return nsIDOMKeyEvent.DOM_VK_5;
124
return nsIDOMKeyEvent.DOM_VK_6;
126
return nsIDOMKeyEvent.DOM_VK_7;
128
return nsIDOMKeyEvent.DOM_VK_8;
130
return nsIDOMKeyEvent.DOM_VK_9;
132
return nsIDOMKeyEvent.DOM_VK_0;
135
return nsIDOMKeyEvent.DOM_VK_SUBTRACT;
138
return nsIDOMKeyEvent.DOM_VK_EQUALS;
141
return nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET;
144
return nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET;
147
return nsIDOMKeyEvent.DOM_VK_BACK_SLASH;
150
return nsIDOMKeyEvent.DOM_VK_SEMICOLON;
153
return nsIDOMKeyEvent.DOM_VK_QUOTE;
156
return nsIDOMKeyEvent.DOM_VK_COMMA;
159
return nsIDOMKeyEvent.DOM_VK_PERIOD;
162
return nsIDOMKeyEvent.DOM_VK_SLASH;
168
_parseModifiers: function EventUtils__parseModifiers(aEvent) {
169
const masks = Components.interfaces.nsIDOMNSEvent;
172
mval |= masks.SHIFT_MASK;
174
mval |= masks.CONTROL_MASK;
176
mval |= masks.ALT_MASK;
178
mval |= masks.META_MASK;
180
mval |= (navigator.platform.indexOf("Mac") >= 0) ? masks.META_MASK :
186
isKeypressFiredKey: function EventUtils_isKeypressFiredKey(aDOMKeyCode) {
187
if (typeof(aDOMKeyCode) == "string") {
188
if (aDOMKeyCode.indexOf("VK_") == 0) {
189
aDOMKeyCode = KeyEvent["DOM_" + aDOMKeyCode];
191
throw "Unknown key: " + aDOMKeyCode;
194
// If the key generates a character, it must cause a keypress event.
198
switch (aDOMKeyCode) {
199
case KeyEvent.DOM_VK_SHIFT:
200
case KeyEvent.DOM_VK_CONTROL:
201
case KeyEvent.DOM_VK_ALT:
202
case KeyEvent.DOM_VK_CAPS_LOCK:
203
case KeyEvent.DOM_VK_NUM_LOCK:
204
case KeyEvent.DOM_VK_SCROLL_LOCK:
205
case KeyEvent.DOM_VK_META:
212
synthesizeKey: function EventUtils_synthesizeKey(aKey, aEvent, aWindow) {
213
var utils = this._getDOMWindowUtils(aWindow);
215
var keyCode = 0, charCode = 0;
216
if (aKey.indexOf("VK_") == 0) {
217
keyCode = KeyEvent["DOM_" + aKey];
219
throw "Unknown key: " + aKey;
222
charCode = aKey.charCodeAt(0);
223
keyCode = this._computeKeyCodeFromChar(aKey.charAt(0));
226
var modifiers = this._parseModifiers(aEvent);
228
if (!("type" in aEvent) || !aEvent.type) {
229
// Send keydown + (optional) keypress + keyup events.
230
var keyDownDefaultHappened =
231
utils.sendKeyEvent("keydown", keyCode, 0, modifiers);
232
if (this.isKeypressFiredKey(keyCode)) {
233
utils.sendKeyEvent("keypress", charCode ? 0 : keyCode, charCode,
234
modifiers, !keyDownDefaultHappened);
236
utils.sendKeyEvent("keyup", keyCode, 0, modifiers);
237
} else if (aEvent.type == "keypress") {
238
// Send standalone keypress event.
239
utils.sendKeyEvent(aEvent.type, charCode ? 0 : keyCode,
240
charCode, modifiers);
242
// Send other standalone event than keypress.
243
utils.sendKeyEvent(aEvent.type, keyCode, 0, modifiers);
249
function waitForExplicitFinish() {}
251
var SpecialPowers = {
252
_prefService: Components.classes["@mozilla.org/preferences-service;1"]
253
.getService(Components.interfaces.nsIPrefBranch),
255
setBoolPref: function SpecialPowers__setBoolPref(pref, value) {
256
this._prefService.setBoolPref(pref, value);
260
var readyAndUnlocked;
262
// see http://mxr.mozilla.org/mozilla-central/source/testing/mochitest/browser-test.js#478
263
function nextStep(arg) {
265
__generator.send(arg);
266
} catch(ex if ex instanceof StopIteration) {
269
ok(false, "Unhandled exception: " + ex);
274
// see http://mxr.mozilla.org/mozilla-central/source/testing/mochitest/browser-test.js#523
275
function requestLongerTimeout() {
279
// The browser-chrome tests either start with test() or generatorTest().
280
var __generator = null;
281
if (typeof(test) != 'undefined')
283
else if (typeof(generatorTest) != 'undefined') {
284
__generator = generatorTest();