diff options
Diffstat (limited to 'dom/events/test/test_all_synthetic_events.html')
-rw-r--r-- | dom/events/test/test_all_synthetic_events.html | 515 |
1 files changed, 515 insertions, 0 deletions
diff --git a/dom/events/test/test_all_synthetic_events.html b/dom/events/test/test_all_synthetic_events.html new file mode 100644 index 000000000..90dbe95ee --- /dev/null +++ b/dom/events/test/test_all_synthetic_events.html @@ -0,0 +1,515 @@ +<!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); + }, + }, + CallEvent: { create: function (aName, aProps) { + return new CallEvent(aName, aProps); + }, + }, + CallGroupErrorEvent: { create: function (aName, aProps) { + return new CallGroupErrorEvent(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); + }, + }, + DownloadEvent: { create: function (aName, aProps) { + return new DownloadEvent(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); + }, + }, + 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, { + messageType: "license-request", + message: new ArrayBuffer(0) + }); + }, + }, + MediaStreamEvent: { create: function (aName, aProps) { + return new MediaStreamEvent(aName, aProps); + }, + }, + MediaStreamTrackEvent: { + // Difficult to test required arguments. + }, + 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); + }, + }, + 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); + }, + }, + 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); + }, + }, + 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); + }, + }, + RTCDTMFToneChangeEvent: { create: function (aName, aProps) { + return new RTCDTMFToneChangeEvent(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); + }, + }, + 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> |