1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/events/test/test_all_synthetic_events.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,472 @@ 1.4 +<!DOCTYPE html> 1.5 +<html> 1.6 +<head> 1.7 + <title>Test all synthetic events</title> 1.8 + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.9 + <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script> 1.10 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 1.11 +</head> 1.12 +<body> 1.13 +<p id="display"></p> 1.14 +<div id="content" style="display: none"> 1.15 +</div> 1.16 +<pre id="test"> 1.17 +<script type="application/javascript"> 1.18 + 1.19 +/** 1.20 + * kEventConstructors is a helper and database of all events. 1.21 + * The sort order of the definition is by A to Z (ignore the Event postfix). 1.22 + * 1.23 + * XXX: should we move this into EventUtils.js? 1.24 + * 1.25 + * create: function or null. If this is null, it's impossible to create untrusted event for it. 1.26 + * Otherwise, create(aName, aProps) returns an instance of the event initialized with aProps. 1.27 + * aName specifies the event's type name. See each create() code for the detail of aProps. 1.28 + */ 1.29 +const kEventConstructors = { 1.30 + Event: { create: function (aName, aProps) { 1.31 + return new Event(aName, aProps); 1.32 + }, 1.33 + }, 1.34 + AnimationEvent: { create: function (aName, aProps) { 1.35 + return new AnimationEvent(aName, aProps); 1.36 + }, 1.37 + }, 1.38 + AudioProcessingEvent: { create: null, // Cannot create untrusted event from JS. 1.39 + }, 1.40 + BeforeUnloadEvent: { create: function (aName, aProps) { 1.41 + var e = document.createEvent("beforeunloadevent"); 1.42 + e.initEvent(aName, aProps.bubbles, aProps.cancelable); 1.43 + return e; 1.44 + }, 1.45 + }, 1.46 + BlobEvent: { create: function (aName, aProps) { 1.47 + return new BlobEvent(aName, aProps); 1.48 + }, 1.49 + }, 1.50 + BluetoothDeviceEvent: { create: function (aName, aProps) { 1.51 + return new BluetoothDeviceEvent(aName, aProps); 1.52 + }, 1.53 + }, 1.54 + BluetoothStatusChangedEvent: { create: function (aName, aProps) { 1.55 + return new BluetoothStatusChangedEvent(aName, aProps); 1.56 + }, 1.57 + }, 1.58 + CallEvent: { create: function (aName, aProps) { 1.59 + return new CallEvent(aName, aProps); 1.60 + }, 1.61 + }, 1.62 + CallGroupErrorEvent: { create: function (aName, aProps) { 1.63 + return new CallGroupErrorEvent(aName, aProps); 1.64 + }, 1.65 + }, 1.66 + CFStateChangeEvent: { create: function (aName, aProps) { 1.67 + return new CFStateChangeEvent(aName, aProps); 1.68 + }, 1.69 + }, 1.70 + CloseEvent: { create: function (aName, aProps) { 1.71 + return new CloseEvent(aName, aProps); 1.72 + }, 1.73 + }, 1.74 + ClipboardEvent: { create: function (aName, aProps) { 1.75 + return new ClipboardEvent(aName, aProps); 1.76 + }, 1.77 + }, 1.78 + CommandEvent: { create: function (aName, aProps) { 1.79 + var e = document.createEvent("commandevent"); 1.80 + e.initCommandEvent(aName, aProps.bubbles, aProps.cancelable, 1.81 + aProps.command); 1.82 + return e; 1.83 + }, 1.84 + }, 1.85 + CompositionEvent: { create: function (aName, aProps) { 1.86 + var e = document.createEvent("compositionevent"); 1.87 + e.initCompositionEvent(aName, aProps.bubbles, aProps.cancelable, 1.88 + aProps.view, aProps.data, aProps.locale); 1.89 + return e; 1.90 + }, 1.91 + }, 1.92 + CustomEvent: { create: function (aName, aProps) { 1.93 + return new CustomEvent(aName, aProps); 1.94 + }, 1.95 + }, 1.96 + DataErrorEvent: { create: function (aName, aProps) { 1.97 + return new DataErrorEvent(aName, aProps); 1.98 + }, 1.99 + }, 1.100 + DataContainerEvent: { create: function (aName, aProps) { 1.101 + var e = document.createEvent("datacontainerevent"); 1.102 + e.initEvent(aName, aProps.bubbles, aProps.cancelable); 1.103 + return e; 1.104 + }, 1.105 + }, 1.106 + DataStoreChangeEvent: { create: function (aName, aProps) { 1.107 + return new DataStoreChangeEvent(aProps); 1.108 + }, 1.109 + }, 1.110 + DeviceLightEvent: { create: function (aName, aProps) { 1.111 + return new DeviceLightEvent(aName, aProps); 1.112 + }, 1.113 + }, 1.114 + DeviceMotionEvent: { create: function (aName, aProps) { 1.115 + var e = document.createEvent("devicemotionevent"); 1.116 + e.initDeviceMotionEvent(aName, aProps.bubbles, aProps.cancelable, aProps.acceleration, 1.117 + aProps.accelerationIncludingGravity, aProps.rotationRate, 1.118 + aProps.interval || 0.0); 1.119 + return e; 1.120 + }, 1.121 + }, 1.122 + DeviceOrientationEvent: { create: function (aName, aProps) { 1.123 + return new DeviceOrientationEvent(aName, aProps); 1.124 + }, 1.125 + }, 1.126 + DeviceProximityEvent: { create: function (aName, aProps) { 1.127 + return new DeviceProximityEvent(aName, aProps); 1.128 + }, 1.129 + }, 1.130 + DeviceStorageChangeEvent: { create: function (aName, aProps) { 1.131 + return new DeviceStorageChangeEvent(aName, aProps); 1.132 + }, 1.133 + }, 1.134 + DownloadEvent: { create: function (aName, aProps) { 1.135 + return new DownloadEvent(aName, aProps); 1.136 + }, 1.137 + }, 1.138 + DOMTransactionEvent: { create: function (aName, aProps) { 1.139 + return new DOMTransactionEvent(aName, aProps); 1.140 + }, 1.141 + }, 1.142 + DragEvent: { create: function (aName, aProps) { 1.143 + var e = document.createEvent("dragevent"); 1.144 + e.initDragEvent(aName, aProps.bubbles, aProps.cancelable, 1.145 + aProps.view, aProps.detail, 1.146 + aProps.screenX, aProps.screenY, 1.147 + aProps.clientX, aProps.clientY, 1.148 + aProps.ctrlKey, aProps.altKey, aProps.shiftKey, aProps.metaKey, 1.149 + aProps.button, aProps.relatedTarget, aProps.dataTransfer); 1.150 + return e; 1.151 + }, 1.152 + }, 1.153 + ErrorEvent: { create: function (aName, aProps) { 1.154 + return new ErrorEvent(aName, aProps); 1.155 + }, 1.156 + }, 1.157 + ElementReplaceEvent: { create: function (aName, aProps) { 1.158 + return new ElementReplaceEvent(aName, aProps); 1.159 + }, 1.160 + }, 1.161 + FocusEvent: { create: function (aName, aProps) { 1.162 + return new FocusEvent(aName, aProps); 1.163 + }, 1.164 + }, 1.165 + GamepadEvent: { create: function (aName, aProps) { 1.166 + return new GamepadEvent(aName, aProps); 1.167 + }, 1.168 + }, 1.169 + GamepadAxisMoveEvent: { create: function (aName, aProps) { 1.170 + return new GamepadAxisMoveEvent(aName, aProps); 1.171 + }, 1.172 + }, 1.173 + GamepadButtonEvent: { create: function (aName, aProps) { 1.174 + return new GamepadButtonEvent(aName, aProps); 1.175 + }, 1.176 + }, 1.177 + HashChangeEvent: { create: function (aName, aProps) { 1.178 + return new HashChangeEvent(aName, aProps); 1.179 + }, 1.180 + }, 1.181 + IccChangeEvent: { create: function (aName, aProps) { 1.182 + return new IccChangeEvent(aName, aProps); 1.183 + }, 1.184 + }, 1.185 + IDBVersionChangeEvent: { create: function (aName, aProps) { 1.186 + return new IDBVersionChangeEvent(aName, aProps); 1.187 + }, 1.188 + }, 1.189 + InputEvent: { create: function (aName, aProps) { 1.190 + return new InputEvent(aName, aProps); 1.191 + }, 1.192 + }, 1.193 + KeyEvent: { create: function (aName, aProps) { 1.194 + return new KeyboardEvent(aName, aProps); 1.195 + }, 1.196 + }, 1.197 + KeyboardEvent: { create: function (aName, aProps) { 1.198 + return new KeyboardEvent(aName, aProps); 1.199 + }, 1.200 + }, 1.201 + MediaStreamEvent: { create: function (aName, aProps) { 1.202 + return new MediaStreamEvent(aName, aProps); 1.203 + }, 1.204 + }, 1.205 + MessageEvent: { create: function (aName, aProps) { 1.206 + var e = new MessageEvent("messageevent", { bubbles: aProps.bubbles, 1.207 + cancelable: aProps.cancelable, data: aProps.data, origin: aProps.origin, 1.208 + lastEventId: aProps.lastEventId, source: aProps.source }); 1.209 + return e; 1.210 + }, 1.211 + }, 1.212 + MouseEvent: { create: function (aName, aProps) { 1.213 + return new MouseEvent(aName, aProps); 1.214 + }, 1.215 + }, 1.216 + MouseScrollEvent: { create: function (aName, aProps) { 1.217 + var e = document.createEvent("mousescrollevents"); 1.218 + e.initMouseScrollEvent(aName, aProps.bubbles, aProps.cancelable, 1.219 + aProps.view, aProps.detail, 1.220 + aProps.screenX, aProps.screenY, 1.221 + aProps.clientX, aProps.clientY, 1.222 + aProps.ctrlKey, aProps.altKey, aProps.shiftKey, aProps.metaKey, 1.223 + aProps.button, aProps.relatedTarget, aProps.axis); 1.224 + return e; 1.225 + }, 1.226 + }, 1.227 + MozApplicationEvent: { create: function (aName, aProps) { 1.228 + return new MozApplicationEvent(aName, aProps); 1.229 + }, 1.230 + }, 1.231 + MozCellBroadcastEvent: { create: function (aName, aProps) { 1.232 + return new MozCellBroadcastEvent(aName, aProps); 1.233 + }, 1.234 + }, 1.235 + MozContactChangeEvent: { create: function (aName, aProps) { 1.236 + return new MozContactChangeEvent(aName, aProps); 1.237 + }, 1.238 + }, 1.239 + MozEmergencyCbModeEvent: { create: function (aName, aProps) { 1.240 + return new MozEmergencyCbModeEvent(aName, aProps); 1.241 + }, 1.242 + }, 1.243 + MozMmsEvent: { create: function (aName, aProps) { 1.244 + return new MozMmsEvent(aName, aProps); 1.245 + }, 1.246 + }, 1.247 + MozOtaStatusEvent: { create: function (aName, aProps) { 1.248 + return new MozOtaStatusEvent(aName, aProps); 1.249 + }, 1.250 + }, 1.251 + MozSettingsEvent: { create: function (aName, aProps) { 1.252 + return new MozSettingsEvent(aName, aProps); 1.253 + }, 1.254 + }, 1.255 + MozSmsEvent: { create: function (aName, aProps) { 1.256 + return new MozSmsEvent(aName, aProps); 1.257 + }, 1.258 + }, 1.259 + MozStkCommandEvent: { create: function (aName, aProps) { 1.260 + return new MozStkCommandEvent(aName, aProps); 1.261 + }, 1.262 + }, 1.263 + MozVoicemailEvent: { create: function (aName, aProps) { 1.264 + return new MozVoicemailEvent(aName, aProps); 1.265 + }, 1.266 + }, 1.267 + MozWifiConnectionInfoEvent: { create: function (aName, aProps) { 1.268 + return new MozWifiConnectionInfoEvent(aName, aProps); 1.269 + }, 1.270 + }, 1.271 + MozWifiStatusChangeEvent: { create: function (aName, aProps) { 1.272 + return new MozWifiStatusChangeEvent(aName, aProps); 1.273 + }, 1.274 + }, 1.275 + MutationEvent: { create: function (aName, aProps) { 1.276 + var e = document.createEvent("mutationevent"); 1.277 + e.initMutationEvent(aName, aProps.bubbles, aProps.cancelable, 1.278 + aProps.relatedNode, aProps.prevValue, aProps.newValue, 1.279 + aProps.attrName, aProps.attrChange); 1.280 + return e; 1.281 + }, 1.282 + }, 1.283 + NotifyPaintEvent: { create: function (aName, aProps) { 1.284 + var e = document.createEvent("notifypaintevent"); 1.285 + e.initEvent(aName, aProps.bubbles, aProps.cancelable); 1.286 + return e; 1.287 + }, 1.288 + }, 1.289 + OfflineAudioCompletionEvent: { create: null, // Cannot create untrusted event from JS. 1.290 + }, 1.291 + PageTransitionEvent: { create: function (aName, aProps) { 1.292 + return new PageTransitionEvent(aName, aProps); 1.293 + }, 1.294 + }, 1.295 + PointerEvent: { create: function (aName, aProps) { 1.296 + return new PointerEvent(aName, aProps); 1.297 + }, 1.298 + }, 1.299 + PopStateEvent: { create: function (aName, aProps) { 1.300 + return new PopStateEvent(aName, aProps); 1.301 + }, 1.302 + }, 1.303 + PopupBlockedEvent: { create: function (aName, aProps) { 1.304 + return new PopupBlockedEvent(aName, aProps); 1.305 + }, 1.306 + }, 1.307 + ProgressEvent: { create: function (aName, aProps) { 1.308 + return new ProgressEvent(aName, aProps); 1.309 + }, 1.310 + }, 1.311 + RecordErrorEvent: { create: function (aName, aProps) { 1.312 + return new RecordErrorEvent(aName, aProps); 1.313 + }, 1.314 + }, 1.315 + RTCDataChannelEvent: { create: function (aName, aProps) { 1.316 + return new RTCDataChannelEvent(aName, aProps); 1.317 + }, 1.318 + }, 1.319 + RTCPeerConnectionIceEvent: { create: function (aName, aProps) { 1.320 + return new RTCPeerConnectionIceEvent(aName, aProps); 1.321 + }, 1.322 + }, 1.323 + RTCPeerConnectionIdentityEvent: { create: function (aName, aProps) { 1.324 + return new RTCPeerConnectionIdentityEvent(aName, aProps); 1.325 + }, 1.326 + }, 1.327 + RTCPeerConnectionIdentityErrorEvent: { create: function (aName, aProps) { 1.328 + return new RTCPeerConnectionIdentityErrorEvent(aName, aProps); 1.329 + }, 1.330 + }, 1.331 + ScrollAreaEvent: { create: function (aName, aProps) { 1.332 + var e = document.createEvent("scrollareaevent"); 1.333 + e.initScrollAreaEvent(aName, aProps.bubbles, aProps.cancelable, 1.334 + aProps.view, aProps.details, 1.335 + aProps.x || 0.0, aProps.y || 0.0, 1.336 + aProps.width || 0.0, aProps.height || 0.0); 1.337 + return e; 1.338 + }, 1.339 + }, 1.340 + SimpleGestureEvent: { create: function (aName, aProps) { 1.341 + var e = document.createEvent("simplegestureevent"); 1.342 + e.initSimpleGestureEvent(aName, aProps.bubbles, aProps.cancelable, 1.343 + aProps.view, aProps.detail, 1.344 + aProps.screenX, aProps.screenY, 1.345 + aProps.clientX, aProps.clientY, 1.346 + aProps.ctrlKey, aProps.altKey, aProps.shiftKey, aProps.metaKey, 1.347 + aProps.button, aProps.relatedTarget, 1.348 + aProps.allowedDirections, aProps.direction, aProps.delta || 0.0, 1.349 + aProps.clickCount); 1.350 + return e; 1.351 + }, 1.352 + }, 1.353 + SmartCardEvent: { create: function (aName, aProps) { 1.354 + return new SmartCardEvent(aName, aProps); 1.355 + }, 1.356 + }, 1.357 + SpeechRecognitionEvent: { create: function (aName, aProps) { 1.358 + return new SpeechRecognitionEvent(aName, aProps); 1.359 + }, 1.360 + }, 1.361 + SpeechSynthesisEvent: { create: function (aName, aProps) { 1.362 + return new SpeechSynthesisEvent(aName, aProps); 1.363 + }, 1.364 + }, 1.365 + StorageEvent: { create: function (aName, aProps) { 1.366 + return new StorageEvent(aName, aProps); 1.367 + }, 1.368 + }, 1.369 + StyleRuleChangeEvent: { create: function (aName, aProps) { 1.370 + return new StyleRuleChangeEvent(aName, aProps); 1.371 + }, 1.372 + chromeOnly: true, 1.373 + }, 1.374 + StyleSheetApplicableStateChangeEvent: { create: function (aName, aProps) { 1.375 + return new StyleSheetApplicableStateChangeEvent(aName, aProps); 1.376 + }, 1.377 + chromeOnly: true, 1.378 + }, 1.379 + StyleSheetChangeEvent: { create: function (aName, aProps) { 1.380 + return new StyleSheetChangeEvent(aName, aProps); 1.381 + }, 1.382 + chromeOnly: true, 1.383 + }, 1.384 + SVGZoomEvent: { create: function (aName, aProps) { 1.385 + var e = document.createEvent("svgzoomevent"); 1.386 + e.initUIEvent(aName, aProps.bubbles, aProps.cancelable, 1.387 + aProps.view, aProps.detail); 1.388 + return e; 1.389 + }, 1.390 + }, 1.391 + TimeEvent: { create: function (aName, aProps) { 1.392 + var e = document.createEvent("timeevent"); 1.393 + e.initTimeEvent(aName, aProps.view, aProps.detail); 1.394 + return e; 1.395 + }, 1.396 + }, 1.397 + TouchEvent: { create: function (aName, aProps) { 1.398 + var e = document.createEvent("touchevent"); 1.399 + e.initTouchEvent(aName, aProps.bubbles, aProps.cancelable, 1.400 + aProps.view, aProps.detail, 1.401 + aProps.ctrlKey, aProps.altKey, aProps.shiftKey, aProps.metaKey, 1.402 + aProps.touches, aProps.targetTouches, aProps.changedTouches); 1.403 + return e; 1.404 + }, 1.405 + }, 1.406 + TrackEvent: { create: function (aName, aProps) { 1.407 + return new TrackEvent(aName, aProps); 1.408 + }, 1.409 + }, 1.410 + TransitionEvent: { create: function (aName, aProps) { 1.411 + return new TransitionEvent(aName, aProps); 1.412 + }, 1.413 + }, 1.414 + UIEvent: { create: function (aName, aProps) { 1.415 + return new UIEvent(aName, aProps); 1.416 + }, 1.417 + }, 1.418 + UserProximityEvent: { create: function (aName, aProps) { 1.419 + return new UserProximityEvent(aName, aProps); 1.420 + }, 1.421 + }, 1.422 + USSDReceivedEvent: { create: function (aName, aProps) { 1.423 + return new USSDReceivedEvent(aName, aProps); 1.424 + }, 1.425 + }, 1.426 + WheelEvent: { create: function (aName, aProps) { 1.427 + return new WheelEvent(aName, aProps); 1.428 + }, 1.429 + }, 1.430 +}; 1.431 + 1.432 +for (var name of Object.keys(kEventConstructors)) { 1.433 + if (!kEventConstructors[name].chromeOnly) { 1.434 + continue; 1.435 + } 1.436 + if (window[name]) { 1.437 + ok(false, name + " should be chrome only."); 1.438 + } 1.439 + window[name] = SpecialPowers.unwrap(SpecialPowers.wrap(window)[name]); 1.440 +} 1.441 + 1.442 +var props = Object.getOwnPropertyNames(window); 1.443 +for (var i = 0; i < props.length; i++) { 1.444 + // Assume that event object must be named as "FooBarEvent". 1.445 + if (!props[i].match(/^([A-Z][a-zA-Z]+)?Event$/)) { 1.446 + continue; 1.447 + } 1.448 + if (!kEventConstructors[props[i]]) { 1.449 + ok(false, "Unknown event found: " + props[i]); 1.450 + continue; 1.451 + } 1.452 + if (!kEventConstructors[props[i]].create) { 1.453 + todo(false, "Cannot create untrusted event of " + props[i]); 1.454 + continue; 1.455 + } 1.456 + ok(true, "Creating " + props[i] + "..."); 1.457 + var event = kEventConstructors[props[i]].create("foo", {}); 1.458 + if (!event) { 1.459 + ok(false, "Failed to create untrusted event: " + props[i]); 1.460 + continue; 1.461 + } 1.462 + if (typeof(event.getModifierState) == "function") { 1.463 + const kModifiers = [ "Shift", "Control", "Alt", "AltGr", "Meta", "CapsLock", "ScrollLock", "NumLock", "OS", "Fn", "SymbolLock" ]; 1.464 + for (var j = 0; j < kModifiers.length; j++) { 1.465 + ok(true, "Calling " + props[i] + ".getModifierState(" + kModifiers[j] + ")..."); 1.466 + var modifierState = event.getModifierState(kModifiers[j]); 1.467 + ok(true, props[i] + ".getModifierState(" + kModifiers[j] + ") = " + modifierState); 1.468 + } 1.469 + } 1.470 +} 1.471 + 1.472 +</script> 1.473 +</pre> 1.474 +</body> 1.475 +</html>