зеркало из https://github.com/mozilla/pjs.git
Changes needed to support testing event simulation for bug 371260, r=sayrer
This commit is contained in:
Родитель
a5097f9ce6
Коммит
75f44376fd
|
@ -153,4 +153,183 @@ function __doEventDispatch(aTarget, aCharCode, aKeyCode, aHasShift) {
|
||||||
$(aTarget).dispatchEvent(event);
|
$(aTarget).dispatchEvent(event);
|
||||||
return accepted;
|
return accepted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the key modifier flags from aEvent. Used to share code between
|
||||||
|
* synthesizeMouse and synthesizeKey.
|
||||||
|
*/
|
||||||
|
function _parseModifiers(aEvent)
|
||||||
|
{
|
||||||
|
var mval = 0;
|
||||||
|
if (aEvent.shiftKey)
|
||||||
|
mval |= masks.SHIFT_MASK;
|
||||||
|
if (aEvent.ctrlKey)
|
||||||
|
mval |= masks.CONTROL_MASK;
|
||||||
|
if (aEvent.altKey)
|
||||||
|
mval |= masks.ALT_MASK;
|
||||||
|
if (aEvent.metaKey)
|
||||||
|
mval |= masks.META_MASK;
|
||||||
|
if (aEvent.accelKey)
|
||||||
|
mval |= (navigator.platform.indexOf("Mac") >= 0) ? masks.META_MASK :
|
||||||
|
masks.CONTROL_MASK;
|
||||||
|
|
||||||
|
return mval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Synthesize a mouse event on a target. The actual client point is determined
|
||||||
|
* by taking the aTarget's client box and offseting it by aOffsetX and
|
||||||
|
* aOffsetY. This allows mouse clicks to be simulated by calling this method.
|
||||||
|
*
|
||||||
|
* aEvent is an object which may contain the properties:
|
||||||
|
* shiftKey, ctrlKey, altKey, metaKey, accessKey, type
|
||||||
|
*
|
||||||
|
* If the type is specified, an mouse event of that type is fired. Otherwise,
|
||||||
|
* a mousedown followed by a mouse up is performed.
|
||||||
|
*/
|
||||||
|
function synthesizeMouse(aTarget, aOffsetX, aOffsetY, aEvent)
|
||||||
|
{
|
||||||
|
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||||
|
|
||||||
|
var utils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
|
||||||
|
getInterface(Components.interfaces.nsIDOMWindowUtils);
|
||||||
|
if (utils) {
|
||||||
|
var button = aEvent.button || 0;
|
||||||
|
var clickCount = aEvent.clickCount || 1;
|
||||||
|
var modifiers = _parseModifiers(aEvent);
|
||||||
|
|
||||||
|
var left = aTarget.boxObject.x;
|
||||||
|
var top = aTarget.boxObject.y;
|
||||||
|
|
||||||
|
if (aEvent.type) {
|
||||||
|
utils.sendMouseEvent(aEvent.type, left + aOffsetX, top + aOffsetY, button, clickCount, modifiers);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
utils.sendMouseEvent("mousedown", left + aOffsetX, top + aOffsetY, button, clickCount, modifiers);
|
||||||
|
utils.sendMouseEvent("mouseup", left + aOffsetX, top + aOffsetY, button, clickCount, modifiers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Synthesize a key event. It is targeted at whatever would be targeted by an
|
||||||
|
* actual keypress by the user, typically the focused element.
|
||||||
|
*
|
||||||
|
* aKey should be either a character or a keycode starting with VK_ such as
|
||||||
|
* VK_ENTER.
|
||||||
|
*
|
||||||
|
* aEvent is an object which may contain the properties:
|
||||||
|
* shiftKey, ctrlKey, altKey, metaKey, accessKey, type
|
||||||
|
*
|
||||||
|
* If the type is specified, a key event of that type is fired. Otherwise,
|
||||||
|
* a keydown, a keypress and then a keyup event are fired in sequence.
|
||||||
|
*/
|
||||||
|
function synthesizeKey(aKey, aEvent)
|
||||||
|
{
|
||||||
|
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||||
|
|
||||||
|
var utils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
|
||||||
|
getInterface(Components.interfaces.nsIDOMWindowUtils);
|
||||||
|
if (utils) {
|
||||||
|
var keyCode = 0, charCode = 0;
|
||||||
|
if (aKey.indexOf("VK_") == 0)
|
||||||
|
keyCode = KeyEvent["DOM_" + aKey];
|
||||||
|
else
|
||||||
|
charCode = aKey.charCodeAt(0);
|
||||||
|
|
||||||
|
var modifiers = _parseModifiers(aEvent);
|
||||||
|
|
||||||
|
if (aEvent.type) {
|
||||||
|
utils.sendKeyEvent(aEvent.type, keyCode, charCode, modifiers);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
utils.sendKeyEvent("keydown", keyCode, charCode, modifiers);
|
||||||
|
utils.sendKeyEvent("keypress", keyCode, charCode, modifiers);
|
||||||
|
utils.sendKeyEvent("keyup", keyCode, charCode, modifiers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var _gSeenEvent = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicate that an event with an original target of aExpectedTarget and
|
||||||
|
* a type of aExpectedEvent is expected to be fired, or not expected to
|
||||||
|
* be fired.
|
||||||
|
*/
|
||||||
|
function _expectEvent(aExpectedTarget, aExpectedEvent, aTestName)
|
||||||
|
{
|
||||||
|
if (!aExpectedTarget || !aExpectedEvent)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
_gSeenEvent = false;
|
||||||
|
|
||||||
|
var type = (aExpectedEvent.charAt(0) == "!") ?
|
||||||
|
aExpectedEvent.substring(1) : aExpectedEvent;
|
||||||
|
var eventHandler = function(event) {
|
||||||
|
var epassed = (!_gSeenEvent && event.originalTarget == aExpectedTarget &&
|
||||||
|
event.type == type);
|
||||||
|
is(epassed, true, aTestName + " " + type + " event target " + (_gSeenEvent ? "twice" : ""));
|
||||||
|
_gSeenEvent = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
aExpectedTarget.addEventListener(type, eventHandler, false);
|
||||||
|
return eventHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the event was fired or not. The event handler aEventHandler
|
||||||
|
* will be removed.
|
||||||
|
*/
|
||||||
|
function _checkExpectedEvent(aExpectedTarget, aExpectedEvent, aEventHandler, aTestName)
|
||||||
|
{
|
||||||
|
if (aEventHandler) {
|
||||||
|
var expectEvent = (aExpectedEvent.charAt(0) != "!");
|
||||||
|
var type = expectEvent ? aExpectedEvent : aExpectedEvent.substring(1);
|
||||||
|
aExpectedTarget.removeEventListener(type, aEventHandler, false);
|
||||||
|
var desc = type + " event";
|
||||||
|
if (!expectEvent)
|
||||||
|
desc += " not";
|
||||||
|
is(_gSeenEvent, expectEvent, aTestName + " " + desc + " fired");
|
||||||
|
}
|
||||||
|
|
||||||
|
_gSeenEvent = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Similar to synthesizeMouse except that a test is performed to see if an
|
||||||
|
* event is fired at the right target as a result.
|
||||||
|
*
|
||||||
|
* aExpectedTarget - the expected originalTarget of the event.
|
||||||
|
* aExpectedEvent - the expected type of the event, such as 'select'.
|
||||||
|
* aTestName - the test name when outputing results
|
||||||
|
*
|
||||||
|
* To test that an event is not fired, use an expected type preceded by an
|
||||||
|
* exclamation mark, such as '!select'. This might be used to test that a
|
||||||
|
* click on a disabled element doesn't fire certain events for instance.
|
||||||
|
*/
|
||||||
|
function synthesizeMouseExpectEvent(aTarget, aOffsetX, aOffsetY, aEvent,
|
||||||
|
aExpectedTarget, aExpectedEvent, aTestName)
|
||||||
|
{
|
||||||
|
var eventHandler = _expectEvent(aExpectedTarget, aExpectedEvent, aTestName);
|
||||||
|
synthesizeMouse(aTarget, aOffsetX, aOffsetY, aEvent);
|
||||||
|
_checkExpectedEvent(aExpectedTarget, aExpectedEvent, eventHandler, aTestName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Similar to synthesizeKey except that a test is performed to see if an
|
||||||
|
* event is fired at the right target as a result.
|
||||||
|
*
|
||||||
|
* aExpectedTarget - the expected originalTarget of the event.
|
||||||
|
* aExpectedEvent - the expected type of the event, such as 'select'.
|
||||||
|
* aTestName - the test name when outputing results
|
||||||
|
*
|
||||||
|
* To test that an event is not fired, use an expected type preceded by an
|
||||||
|
* exclamation mark, such as '!select'.
|
||||||
|
*/
|
||||||
|
function synthesizeKeyExpectEvent(key, aEvent, aExpectedTarget, aExpectedEvent, aTestName)
|
||||||
|
{
|
||||||
|
var eventHandler = _expectEvent(aExpectedTarget, aExpectedEvent, aTestName);
|
||||||
|
synthesizeKey(key, aEvent);
|
||||||
|
_checkExpectedEvent(aExpectedTarget, aExpectedEvent, eventHandler, aTestName);
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче