gecko-dev/dom/events/test/test_all_synthetic_events.html
Sebastian Hengst edb7a37036 Backed out 5 changesets (bug 1208328) for frequent failures in test_peerConnection_addtrack_removetrack_events.html on Android 4.3 debug. r=backout
Backed out changeset 3160ce8f8759 (bug 1208328)
Backed out changeset aa209325161f (bug 1208328)
Backed out changeset d48bc6eca9c3 (bug 1208328)
Backed out changeset 945141b1f8da (bug 1208328)
Backed out changeset 48da132353c7 (bug 1208328)
2016-06-14 11:04:28 +02:00

662 lines
47 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>Test all synthetic events</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script type="application/javascript">
/**
* kEventConstructors is a helper and database of all events.
* The sort order of the definition is by A to Z (ignore the Event postfix).
*
* XXX: should we move this into EventUtils.js?
*
* create: function or null. If this is null, it's impossible to create untrusted event for it.
* Otherwise, create(aName, aProps) returns an instance of the event initialized with aProps.
* aName specifies the event's type name. See each create() code for the detail of aProps.
*/
const kEventConstructors = {
Event: { create: function (aName, aProps) {
return new Event(aName, aProps);
},
},
AnimationEvent: { create: function (aName, aProps) {
return new AnimationEvent(aName, aProps);
},
},
AnimationPlaybackEvent: { create: function (aName, aProps) {
return new AnimationPlaybackEvent(aName, aProps);
},
},
AudioProcessingEvent: { create: null, // Cannot create untrusted event from JS.
},
BeforeAfterKeyboardEvent: { create: function (aName, aProps) {
return new BeforeAfterKeyboardEvent(aName, aProps);
},
},
BeforeUnloadEvent: { create: function (aName, aProps) {
var e = document.createEvent("beforeunloadevent");
e.initEvent(aName, aProps.bubbles, aProps.cancelable);
return e;
},
},
BlobEvent: { create: function (aName, aProps) {
return new BlobEvent(aName, aProps);
},
},
BluetoothAdapterEvent: { create: function (aName, aProps) {
return new BluetoothAdapterEvent(aName, aProps);
},
},
BluetoothAttributeEvent: { create: function (aName, aProps) {
return new BluetoothAttributeEvent(aName, aProps);
},
},
BluetoothDeviceEvent: { create: function (aName, aProps) {
return new BluetoothDeviceEvent(aName, aProps);
},
},
BluetoothGattAttributeEvent: { create: function (aName, aProps) {
return new BluetoothGattAttributeEvent(aName, aProps);
},
},
BluetoothGattCharacteristicEvent: { create: function (aName, aProps) {
return new BluetoothGattCharacteristicEvent(aName, aProps);
},
},
BluetoothLeDeviceEvent: { create: function (aName, aProps) {
return new BluetoothLeDeviceEvent(aName, aProps);
},
},
BluetoothObexAuthEvent: { create: function (aName, aProps) {
return new BluetoothObexAuthEvent(aName, aProps);
},
},
BluetoothPairingEvent: { create: function (aName, aProps) {
return new BluetoothPairingEvent(aName, aProps);
},
},
BluetoothMapFolderListingEvent: { create: function (aName, aProps) {
return new BluetoothMapFolderListingEvent(aName, aProps);
},
},
BluetoothMapGetMessageEvent: { create: function (aName, aProps) {
return new BluetoothMapGetMessageEvent(aName, aProps);
},
},
BluetoothMapMessagesListingEvent: { create: function (aName, aProps) {
return new BluetoothMapMessagesListingEvent(aName, aProps);
},
},
BluetoothMapMessageUpdateEvent: { create: function (aName, aProps) {
return new BluetoothMapMessageUpdateEvent(aName, aProps);
},
},
BluetoothMapSendMessageEvent: { create: function (aName, aProps) {
return new BluetoothMapSendMessageEvent(aName, aProps);
},
},
BluetoothMapSetMessageStatusEvent: { create: function (aName, aProps) {
return new BluetoothMapSetMessageStatusEvent(aName, aProps);
},
},
BluetoothPhonebookPullingEvent: { create: function (aName, aProps) {
return new BluetoothPhonebookPullingEvent(aName, aProps);
},
},
BluetoothStatusChangedEvent: { create: function (aName, aProps) {
return new BluetoothStatusChangedEvent(aName, aProps);
},
},
BluetoothVCardListingEvent: { create: function (aName, aProps) {
return new BluetoothVCardListingEvent(aName, aProps);
},
},
BluetoothVCardPullingEvent: { create: function (aName, aProps) {
return new BluetoothVCardPullingEvent(aName, aProps);
},
},
CallEvent: { create: function (aName, aProps) {
return new CallEvent(aName, aProps);
},
},
CallGroupErrorEvent: { create: function (aName, aProps) {
return new CallGroupErrorEvent(aName, aProps);
},
},
CameraClosedEvent: { create: function (aName, aProps) {
return new CameraClosedEvent(aName, aProps);
},
},
CameraConfigurationEvent: { create: function (aName, aProps) {
return new CameraConfigurationEvent(aName, aProps);
},
},
CameraFacesDetectedEvent: { create: function (aName, aProps) {
return new CameraFacesDetectedEvent(aName, aProps);
},
},
CameraStateChangeEvent: { create: function (aName, aProps) {
return new CameraStateChangeEvent(aName, aProps);
},
},
CFStateChangeEvent: { create: function (aName, aProps) {
return new CFStateChangeEvent(aName, aProps);
},
},
CloseEvent: { create: function (aName, aProps) {
return new CloseEvent(aName, aProps);
},
},
ClipboardEvent: { create: function (aName, aProps) {
return new ClipboardEvent(aName, aProps);
},
},
CommandEvent: { create: function (aName, aProps) {
var e = document.createEvent("commandevent");
e.initCommandEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.command);
return e;
},
},
CompositionEvent: { create: function (aName, aProps) {
var e = document.createEvent("compositionevent");
e.initCompositionEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.view, aProps.data, aProps.locale);
return e;
},
},
CustomEvent: { create: function (aName, aProps) {
return new CustomEvent(aName, aProps);
},
},
DataErrorEvent: { create: function (aName, aProps) {
return new DataErrorEvent(aName, aProps);
},
},
DataContainerEvent: { create: function (aName, aProps) {
var e = document.createEvent("datacontainerevent");
e.initEvent(aName, aProps.bubbles, aProps.cancelable);
return e;
},
},
DeviceLightEvent: { create: function (aName, aProps) {
return new DeviceLightEvent(aName, aProps);
},
},
DeviceMotionEvent: { create: function (aName, aProps) {
var e = document.createEvent("devicemotionevent");
e.initDeviceMotionEvent(aName, aProps.bubbles, aProps.cancelable, aProps.acceleration,
aProps.accelerationIncludingGravity, aProps.rotationRate,
aProps.interval || 0.0);
return e;
},
},
DeviceOrientationEvent: { create: function (aName, aProps) {
return new DeviceOrientationEvent(aName, aProps);
},
},
DeviceProximityEvent: { create: function (aName, aProps) {
return new DeviceProximityEvent(aName, aProps);
},
},
DeviceStorageAreaChangedEvent: { create: function (aName, aProps) {
return new DeviceStorageAreaChangedEvent(aName, aProps);
},
},
DeviceStorageChangeEvent: { create: function (aName, aProps) {
return new DeviceStorageChangeEvent(aName, aProps);
},
},
DownloadEvent: { create: function (aName, aProps) {
return new DownloadEvent(aName, aProps);
},
},
DOMTransactionEvent: { create: function (aName, aProps) {
return new DOMTransactionEvent(aName, aProps);
},
},
DragEvent: { create: function (aName, aProps) {
var e = document.createEvent("dragevent");
e.initDragEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.view, aProps.detail,
aProps.screenX, aProps.screenY,
aProps.clientX, aProps.clientY,
aProps.ctrlKey, aProps.altKey, aProps.shiftKey, aProps.metaKey,
aProps.button, aProps.relatedTarget, aProps.dataTransfer);
return e;
},
},
ErrorEvent: { create: function (aName, aProps) {
return new ErrorEvent(aName, aProps);
},
},
FlyWebFetchEvent: { create: null, // Cannot create untrusted event from JS.
},
FlyWebWebSocketEvent: { create: null, // Cannot create untrusted event from JS.
},
FocusEvent: { create: function (aName, aProps) {
return new FocusEvent(aName, aProps);
},
},
FontFaceSetLoadEvent: { create: function (aName, aProps) {
return new FontFaceSetLoadEvent(aName, aProps);
},
},
GamepadEvent: { create: function (aName, aProps) {
return new GamepadEvent(aName, aProps);
},
},
GamepadAxisMoveEvent: { create: function (aName, aProps) {
return new GamepadAxisMoveEvent(aName, aProps);
},
},
GamepadButtonEvent: { create: function (aName, aProps) {
return new GamepadButtonEvent(aName, aProps);
},
},
HashChangeEvent: { create: function (aName, aProps) {
return new HashChangeEvent(aName, aProps);
},
},
IccChangeEvent: { create: function (aName, aProps) {
return new IccChangeEvent(aName, aProps);
},
},
IDBVersionChangeEvent: { create: function (aName, aProps) {
return new IDBVersionChangeEvent(aName, aProps);
},
},
ImageCaptureErrorEvent: { create: function (aName, aProps) {
return new ImageCaptureErrorEvent(aName, aProps);
},
},
InputEvent: { create: function (aName, aProps) {
return new InputEvent(aName, aProps);
},
},
KeyEvent: { create: function (aName, aProps) {
return new KeyboardEvent(aName, aProps);
},
},
KeyboardEvent: { create: function (aName, aProps) {
return new KeyboardEvent(aName, aProps);
},
},
MediaEncryptedEvent: { create: function (aName, aProps) {
return new MediaEncryptedEvent(aName, aProps);
},
},
MediaKeyMessageEvent: { create: function (aName, aProps) {
return new MediaKeyMessageEvent(aName, aProps);
},
},
MediaStreamEvent: { create: function (aName, aProps) {
return new MediaStreamEvent(aName, aProps);
},
},
MediaStreamTrackEvent: { create: function (aName, aProps) {
return new MediaStreamTrackEvent(aName, aProps);
},
},
MessageEvent: { create: function (aName, aProps) {
var e = new MessageEvent("messageevent", { bubbles: aProps.bubbles,
cancelable: aProps.cancelable, data: aProps.data, origin: aProps.origin,
lastEventId: aProps.lastEventId, source: aProps.source });
return e;
},
},
MouseEvent: { create: function (aName, aProps) {
return new MouseEvent(aName, aProps);
},
},
MouseScrollEvent: { create: function (aName, aProps) {
var e = document.createEvent("mousescrollevents");
e.initMouseScrollEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.view, aProps.detail,
aProps.screenX, aProps.screenY,
aProps.clientX, aProps.clientY,
aProps.ctrlKey, aProps.altKey, aProps.shiftKey, aProps.metaKey,
aProps.button, aProps.relatedTarget, aProps.axis);
return e;
},
},
MozApplicationEvent: { create: function (aName, aProps) {
return new MozApplicationEvent(aName, aProps);
},
},
MozCellBroadcastEvent: { create: function (aName, aProps) {
return new MozCellBroadcastEvent(aName, aProps);
},
},
MozClirModeEvent: { create: function (aName, aProps) {
return new MozClirModeEvent(aName, aProps);
},
},
MozContactChangeEvent: { create: function (aName, aProps) {
return new MozContactChangeEvent(aName, aProps);
},
},
MozEmergencyCbModeEvent: { create: function (aName, aProps) {
return new MozEmergencyCbModeEvent(aName, aProps);
},
},
MozMessageDeletedEvent: { create: function (aName, aProps) {
return new MozMessageDeletedEvent(aName, aProps);
},
},
MozMmsEvent: { create: function (aName, aProps) {
return new MozMmsEvent(aName, aProps);
},
},
MozNFCPeerEvent: { create: function (aName, aProps) {
return new MozNFCPeerEvent(aName, aProps);
},
},
MozNFCTagEvent: { create: function (aName, aProps) {
return new MozNFCTagEvent(aName, aProps);
},
},
MozOtaStatusEvent: { create: function (aName, aProps) {
return new MozOtaStatusEvent(aName, aProps);
},
},
MozSettingsEvent: { create: function (aName, aProps) {
return new MozSettingsEvent(aName, aProps);
},
},
MozSettingsTransactionEvent: { create: function (aName, aProps) {
return new MozSettingsTransactionEvent(aName, aProps);
},
},
MozSmsEvent: { create: function (aName, aProps) {
return new MozSmsEvent(aName, aProps);
},
},
MozStkCommandEvent: { create: function (aName, aProps) {
return new MozStkCommandEvent(aName, aProps);
},
},
MozVoicemailEvent: { create: function (aName, aProps) {
return new MozVoicemailEvent(aName, aProps);
},
},
MozWifiConnectionInfoEvent: { create: function (aName, aProps) {
return new MozWifiConnectionInfoEvent(aName, aProps);
},
},
MozWifiStatusChangeEvent: { create: function (aName, aProps) {
return new MozWifiStatusChangeEvent(aName, aProps);
},
},
MozWifiStationInfoEvent: { create: function (aName, aProps) {
return new MozWifiStationInfoEvent(aName, aProps);
},
},
MutationEvent: { create: function (aName, aProps) {
var e = document.createEvent("mutationevent");
e.initMutationEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.relatedNode, aProps.prevValue, aProps.newValue,
aProps.attrName, aProps.attrChange);
return e;
},
},
NotifyPaintEvent: { create: function (aName, aProps) {
var e = document.createEvent("notifypaintevent");
e.initEvent(aName, aProps.bubbles, aProps.cancelable);
return e;
},
},
OfflineAudioCompletionEvent: { create: null, // Cannot create untrusted event from JS.
},
PageTransitionEvent: { create: function (aName, aProps) {
return new PageTransitionEvent(aName, aProps);
},
},
PointerEvent: { create: function (aName, aProps) {
return new PointerEvent(aName, aProps);
},
},
PopStateEvent: { create: function (aName, aProps) {
return new PopStateEvent(aName, aProps);
},
},
PopupBlockedEvent: { create: function (aName, aProps) {
return new PopupBlockedEvent(aName, aProps);
},
},
ProgressEvent: { create: function (aName, aProps) {
return new ProgressEvent(aName, aProps);
},
},
RecordErrorEvent: { create: function (aName, aProps) {
return new RecordErrorEvent(aName, aProps);
},
},
RTCDataChannelEvent: { create: function (aName, aProps) {
return new RTCDataChannelEvent(aName, aProps);
},
},
RTCPeerConnectionIceEvent: { create: function (aName, aProps) {
return new RTCPeerConnectionIceEvent(aName, aProps);
},
},
RTCTrackEvent: {
// Difficult to test required arguments.
},
ScrollAreaEvent: { create: function (aName, aProps) {
var e = document.createEvent("scrollareaevent");
e.initScrollAreaEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.view, aProps.details,
aProps.x || 0.0, aProps.y || 0.0,
aProps.width || 0.0, aProps.height || 0.0);
return e;
},
},
ServiceWorkerMessageEvent: { create: function (aName, aProps) {
var e = new ServiceWorkerMessageEvent("serviceworkermessageevent", { bubbles: aProps.bubbles,
cancelable: aProps.cancelable, data: aProps.data, origin: aProps.origin,
lastEventId: aProps.lastEventId, source: aProps.source });
return e;
},
},
SimpleGestureEvent: { create: function (aName, aProps) {
var e = document.createEvent("simplegestureevent");
e.initSimpleGestureEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.view, aProps.detail,
aProps.screenX, aProps.screenY,
aProps.clientX, aProps.clientY,
aProps.ctrlKey, aProps.altKey, aProps.shiftKey, aProps.metaKey,
aProps.button, aProps.relatedTarget,
aProps.allowedDirections, aProps.direction, aProps.delta || 0.0,
aProps.clickCount);
return e;
},
},
SpeechRecognitionError: { create: function (aName, aProps) {
return new SpeechRecognitionError(aName, aProps);
},
},
SpeechRecognitionEvent: { create: function (aName, aProps) {
return new SpeechRecognitionEvent(aName, aProps);
},
},
SpeechSynthesisErrorEvent: { create: function (aName, aProps) {
aProps.error = "synthesis-unavailable";
aProps.utterance = new SpeechSynthesisUtterance("Hello World");
return new SpeechSynthesisErrorEvent(aName, aProps);
},
},
SpeechSynthesisEvent: { create: function (aName, aProps) {
aProps.utterance = new SpeechSynthesisUtterance("Hello World");
return new SpeechSynthesisEvent(aName, aProps);
},
},
StorageEvent: { create: function (aName, aProps) {
return new StorageEvent(aName, aProps);
},
},
StyleRuleChangeEvent: { create: function (aName, aProps) {
return new StyleRuleChangeEvent(aName, aProps);
},
chromeOnly: true,
},
StyleSheetApplicableStateChangeEvent: { create: function (aName, aProps) {
return new StyleSheetApplicableStateChangeEvent(aName, aProps);
},
chromeOnly: true,
},
StyleSheetChangeEvent: { create: function (aName, aProps) {
return new StyleSheetChangeEvent(aName, aProps);
},
chromeOnly: true,
},
SVGZoomEvent: { create: function (aName, aProps) {
var e = document.createEvent("svgzoomevent");
e.initUIEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.view, aProps.detail);
return e;
},
},
TCPSocketErrorEvent: { create: function(aName, aProps) {
return new TCPSocketErrorEvent(aName, aProps);
},
},
TCPSocketEvent: { create: function(aName, aProps) {
return new TCPSocketEvent(aName, aProps);
},
},
TCPServerSocketEvent: { create: function(aName, aProps) {
return new TCPServerSocketEvent(aName, aProps);
},
},
TimeEvent: { create: function (aName, aProps) {
var e = document.createEvent("timeevent");
e.initTimeEvent(aName, aProps.view, aProps.detail);
return e;
},
},
TouchEvent: { create: function (aName, aProps) {
var e = document.createEvent("touchevent");
e.initTouchEvent(aName, aProps.bubbles, aProps.cancelable,
aProps.view, aProps.detail,
aProps.ctrlKey, aProps.altKey, aProps.shiftKey, aProps.metaKey,
aProps.touches, aProps.targetTouches, aProps.changedTouches);
return e;
},
},
TrackEvent: { create: function (aName, aProps) {
return new TrackEvent(aName, aProps);
},
},
TransitionEvent: { create: function (aName, aProps) {
return new TransitionEvent(aName, aProps);
},
},
TVCurrentChannelChangedEvent: { create: function (aName, aProps) {
return new TVCurrentChannelChangedEvent(aName, aProps);
},
},
TVCurrentProgramChangedEvent: { create: function (aName, aProps) {
return new TVCurrentProgramChangedEvent(aName, aProps);
},
},
TVCurrentSourceChangedEvent: { create: function (aName, aProps) {
return new TVCurrentSourceChangedEvent(aName, aProps);
},
},
TVEITBroadcastedEvent: { create: function (aName, aProps) {
return new TVEITBroadcastedEvent(aName, aProps);
},
},
TVParentalControlChangedEvent: { create: function (aName, aProps) {
return new TVParentalControlChangedEvent(aName, aProps);
},
},
TVProtectionStateChangedEvent: { create: function (aName, aProps) {
return new TVProtectionStateChangedEvent(aName, aProps);
},
},
TVScanningStateChangedEvent: { create: function (aName, aProps) {
return new TVScanningStateChangedEvent(aName, aProps);
},
},
TVTunerChangedEvent: { create: function (aName, aProps) {
return new TVTunerChangedEvent(aName, aProps);
},
},
UIEvent: { create: function (aName, aProps) {
return new UIEvent(aName, aProps);
},
},
UserProximityEvent: { create: function (aName, aProps) {
return new UserProximityEvent(aName, aProps);
},
},
USSDReceivedEvent: { create: function (aName, aProps) {
return new USSDReceivedEvent(aName, aProps);
},
},
WheelEvent: { create: function (aName, aProps) {
return new WheelEvent(aName, aProps);
},
},
WebGLContextEvent: { create: function (aName, aProps) {
return new WebGLContextEvent(aName, aProps);
},
},
};
for (var name of Object.keys(kEventConstructors)) {
if (!kEventConstructors[name].chromeOnly) {
continue;
}
if (window[name]) {
ok(false, name + " should be chrome only.");
}
window[name] = SpecialPowers.unwrap(SpecialPowers.wrap(window)[name]);
}
var props = Object.getOwnPropertyNames(window);
for (var i = 0; i < props.length; i++) {
// Assume that event object must be named as "FooBarEvent".
if (!props[i].match(/^([A-Z][a-zA-Z]+)?Event$/)) {
continue;
}
if (!kEventConstructors[props[i]]) {
ok(false, "Unknown event found: " + props[i]);
continue;
}
if (!kEventConstructors[props[i]].create) {
todo(false, "Cannot create untrusted event of " + props[i]);
continue;
}
ok(true, "Creating " + props[i] + "...");
var event = kEventConstructors[props[i]].create("foo", {});
if (!event) {
ok(false, "Failed to create untrusted event: " + props[i]);
continue;
}
if (typeof(event.getModifierState) == "function") {
const kModifiers = [ "Shift", "Control", "Alt", "AltGr", "Meta", "CapsLock", "ScrollLock", "NumLock", "OS", "Fn", "FnLock", "Symbol", "SymbolLock" ];
for (var j = 0; j < kModifiers.length; j++) {
ok(true, "Calling " + props[i] + ".getModifierState(" + kModifiers[j] + ")...");
var modifierState = event.getModifierState(kModifiers[j]);
ok(true, props[i] + ".getModifierState(" + kModifiers[j] + ") = " + modifierState);
}
}
}
</script>
</pre>
</body>
</html>