gecko-dev/testing/marionette/sendkeys.js
Carsten "Tomcat" Book d07b3125f8 Backed out 16 changesets (bug 1245153) for mochitest test-bustage on a CLOSED TREE
Backed out changeset 30c8ec933737 (bug 1245153)
Backed out changeset 4c2b1902d7cd (bug 1245153)
Backed out changeset 1be5f60393a0 (bug 1245153)
Backed out changeset 22321e6b65e9 (bug 1245153)
Backed out changeset c1e0abbfa66e (bug 1245153)
Backed out changeset 80ae953819c8 (bug 1245153)
Backed out changeset 3edb67388ad6 (bug 1245153)
Backed out changeset 55f64197f6b5 (bug 1245153)
Backed out changeset 6bb93562a576 (bug 1245153)
Backed out changeset 5da7628c3767 (bug 1245153)
Backed out changeset bd41e4ab829d (bug 1245153)
Backed out changeset ee7ee24cc65e (bug 1245153)
Backed out changeset 4b2a5ee7199e (bug 1245153)
Backed out changeset d75ad1397656 (bug 1245153)
Backed out changeset 1f5e37f8e446 (bug 1245153)
Backed out changeset aec0a0166685 (bug 1245153)

--HG--
rename : testing/marionette/event.js => testing/marionette/EventUtils.js
rename : testing/marionette/action.js => testing/marionette/actions.js
rename : testing/marionette/atom.js => testing/marionette/atoms/atoms.js
rename : testing/marionette/element.js => testing/marionette/elements.js
rename : testing/marionette/frame.js => testing/marionette/frame-manager.js
rename : testing/marionette/interaction.js => testing/marionette/interactions.js
extra : rebase_source : 11bba1116e87ed79fa72f24ff41216a6e3fb00d6
2016-02-05 14:18:19 +01:00

166 lines
4.4 KiB
JavaScript

/*
* Copyright 2007-2009 WebDriver committers
* Copyright 2007-2009 Google Inc.
* Portions copyright 2012 Software Freedom Conservancy
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("chrome://marionette/content/error.js");
var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Ci.mozIJSSubScriptLoader);
var utils = {};
loader.loadSubScript("chrome://marionette/content/EventUtils.js", utils);
loader.loadSubScript("chrome://marionette/content/ChromeUtils.js", utils);
var keyModifierNames = {
"VK_SHIFT": 'shiftKey',
"VK_CONTROL": 'ctrlKey',
"VK_ALT": 'altKey',
"VK_META": 'metaKey'
};
var keyCodes = {
'\uE001': "VK_CANCEL",
'\uE002': "VK_HELP",
'\uE003': "VK_BACK_SPACE",
'\uE004': "VK_TAB",
'\uE005': "VK_CLEAR",
'\uE006': "VK_RETURN",
'\uE007': "VK_RETURN",
'\uE008': "VK_SHIFT",
'\uE009': "VK_CONTROL",
'\uE00A': "VK_ALT",
'\uE03D': "VK_META",
'\uE00B': "VK_PAUSE",
'\uE00C': "VK_ESCAPE",
'\uE00D': "VK_SPACE", // printable
'\uE00E': "VK_PAGE_UP",
'\uE00F': "VK_PAGE_DOWN",
'\uE010': "VK_END",
'\uE011': "VK_HOME",
'\uE012': "VK_LEFT",
'\uE013': "VK_UP",
'\uE014': "VK_RIGHT",
'\uE015': "VK_DOWN",
'\uE016': "VK_INSERT",
'\uE017': "VK_DELETE",
'\uE018': "VK_SEMICOLON",
'\uE019': "VK_EQUALS",
'\uE01A': "VK_NUMPAD0",
'\uE01B': "VK_NUMPAD1",
'\uE01C': "VK_NUMPAD2",
'\uE01D': "VK_NUMPAD3",
'\uE01E': "VK_NUMPAD4",
'\uE01F': "VK_NUMPAD5",
'\uE020': "VK_NUMPAD6",
'\uE021': "VK_NUMPAD7",
'\uE022': "VK_NUMPAD8",
'\uE023': "VK_NUMPAD9",
'\uE024': "VK_MULTIPLY",
'\uE025': "VK_ADD",
'\uE026': "VK_SEPARATOR",
'\uE027': "VK_SUBTRACT",
'\uE028': "VK_DECIMAL",
'\uE029': "VK_DIVIDE",
'\uE031': "VK_F1",
'\uE032': "VK_F2",
'\uE033': "VK_F3",
'\uE034': "VK_F4",
'\uE035': "VK_F5",
'\uE036': "VK_F6",
'\uE037': "VK_F7",
'\uE038': "VK_F8",
'\uE039': "VK_F9",
'\uE03A': "VK_F10",
'\uE03B': "VK_F11",
'\uE03C': "VK_F12"
};
function getKeyCode (c) {
if (c in keyCodes) {
return keyCodes[c];
}
return c;
};
function sendKeyDown (keyToSend, modifiers, document) {
modifiers.type = "keydown";
sendSingleKey(keyToSend, modifiers, document);
if (["VK_SHIFT", "VK_CONTROL",
"VK_ALT", "VK_META"].indexOf(getKeyCode(keyToSend)) == -1) {
modifiers.type = "keypress";
sendSingleKey(keyToSend, modifiers, document);
}
delete modifiers.type;
}
function sendKeyUp (keyToSend, modifiers, document) {
modifiers.type = "keyup";
sendSingleKey(keyToSend, modifiers, document);
delete modifiers.type;
}
function sendSingleKey (keyToSend, modifiers, document) {
let keyCode = getKeyCode(keyToSend);
if (keyCode in keyModifierNames) {
let modName = keyModifierNames[keyCode];
modifiers[modName] = !modifiers[modName];
} else if (modifiers.shiftKey) {
keyCode = keyCode.toUpperCase();
}
utils.synthesizeKey(keyCode, modifiers, document);
}
/**
* Focus element and, if a textual input field and no previous selection
* state exists, move the caret to the end of the input field.
*
* @param {Element} el
* Element to focus.
*/
function focusElement(el) {
let t = el.type;
if (t && (t == "text" || t == "textarea")) {
if (el.selectionEnd == 0) {
let len = el.value.length;
el.setSelectionRange(len, len);
}
}
el.focus();
}
function sendKeysToElement(document, element, keysToSend, ignoreVisibility) {
if (ignoreVisibility || checkVisible(element)) {
focusElement(element);
let modifiers = {
shiftKey: false,
ctrlKey: false,
altKey: false,
metaKey: false
};
let value = keysToSend.join("");
for (var i = 0; i < value.length; i++) {
var c = value.charAt(i);
sendSingleKey(c, modifiers, document);
}
} else {
throw new ElementNotVisibleError("Element is not visible");
}
};