5746bc7f31571625ef9121c0ff317663e6421de8
[WebKit-https.git] / LayoutTests / fast / dom / event-handler-attributes.html
1 <!DOCTYPE html>
2 <html>
3 <body>
4 <script src="../../resources/js-test-pre.js"></script>
5 <script>
6 description("Test which event listeners are set up by event handler attributes (the ones with names like onclick).");
7
8 const unusualEventNames = {
9     "webkitanimationend": "webkitAnimationEnd",
10     "webkitanimationiteration": "webkitAnimationIteration",
11     "webkitanimationstart": "webkitAnimationStart",
12     "webkittransitionend": "webkitTransitionEnd",
13 };
14
15 const windowEvents = [
16     "abort",
17     "animationend",
18     "animationiteration",
19     "animationstart",
20     "beforeunload",
21     "blur",
22     "canplay",
23     "canplaythrough",
24     "change",
25     "click",
26     "contextmenu",
27     "dblclick",
28     "drag",
29     "dragend",
30     "dragenter",
31     "dragleave",
32     "dragover",
33     "dragstart",
34     "drop",
35     "durationchange",
36     "emptied",
37     "ended",
38     "error",
39     "focus",
40     "hashchange",
41     "input",
42     "invalid",
43     "keydown",
44     "keypress",
45     "keyup",
46     "load",
47     "loadeddata",
48     "loadedmetadata",
49     "loadstart",
50     "message",
51     "mousedown",
52     "mouseenter",
53     "mouseleave",
54     "mousemove",
55     "mouseout",
56     "mouseover",
57     "mouseup",
58     "mousewheel",
59     "offline",
60     "online",
61     "pagehide",
62     "pageshow",
63     "pause",
64     "play",
65     "playing",
66     "popstate",
67     "progress",
68     "ratechange",
69     "reset",
70     "resize",
71     "scroll",
72     "search",
73     "seeked",
74     "seeking",
75     "select",
76     "stalled",
77     "storage",
78     "submit",
79     "suspend",
80     "timeupdate",
81     "transitionend",
82     "unload",
83     "volumechange",
84     "waiting",
85     "webkitanimationend",
86     "webkitanimationiteration",
87     "webkitanimationstart",
88     "webkittransitionend",
89     "wheel",
90 ];
91
92 const documentEvents = [
93     "abort",
94     "beforecopy",
95     "beforecut",
96     "beforepaste",
97     "blur",
98     "change",
99     "click",
100     "contextmenu",
101     "copy",
102     "cut",
103     "dblclick",
104     "drag",
105     "dragend",
106     "dragenter",
107     "dragleave",
108     "dragover",
109     "dragstart",
110     "drop",
111     "error",
112     "focus",
113     "input",
114     "invalid",
115     "keydown",
116     "keypress",
117     "keyup",
118     "load",
119     "mousedown",
120     "mouseenter",
121     "mouseleave",
122     "mousemove",
123     "mouseout",
124     "mouseover",
125     "mouseup",
126     "mousewheel",
127     "paste",
128     "readystatechange",
129     "reset",
130     "scroll",
131     "search",
132     "select",
133     "selectionchange",
134     "selectstart",
135     "submit",
136     "wheel",
137 ];
138
139 const elementEvents = [
140     "abort",
141     "animationend",
142     "animationiteration",
143     "animationstart",
144     "beforecopy",
145     "beforecut",
146     "beforepaste",
147     "blur",
148     "canplay",
149     "canplaythrough",
150     "change",
151     "click",
152     "contextmenu",
153     "copy",
154     "cut",
155     "dblclick",
156     "drag",
157     "dragend",
158     "dragenter",
159     "dragleave",
160     "dragover",
161     "dragstart",
162     "drop",
163     "durationchange",
164     "emptied",
165     "ended",
166     "error",
167     "focus",
168     "focusin",
169     "focusout",
170     "input",
171     "invalid",
172     "keydown",
173     "keypress",
174     "keyup",
175     "load",
176     "loadeddata",
177     "loadedmetadata",
178     "loadstart",
179     "mousedown",
180     "mouseenter",
181     "mouseleave",
182     "mousemove",
183     "mouseout",
184     "mouseover",
185     "mouseup",
186     "mousewheel",
187     "paste",
188     "pause",
189     "play",
190     "playing",
191     "progress",
192     "ratechange",
193     "reset",
194     "scroll",
195     "search",
196     "seeked",
197     "seeking",
198     "select",
199     "selectstart",
200     "stalled",
201     "submit",
202     "suspend",
203     "timeupdate",
204     "touchcancel",
205     "touchend",
206     "touchmove",
207     "touchstart",
208     "transitionend",
209     "volumechange",
210     "waiting",
211     "webkitanimationend",
212     "webkitanimationiteration",
213     "webkitanimationstart",
214     "webkitpresentationmodechanged",
215     "webkittransitionend",
216     "wheel",
217 ];
218
219 const bodyElementWindowForwardedEvents = [
220     "beforeunload",
221     "blur",
222     "error",
223     "focus",
224     "hashchange",
225     "load",
226     "message",
227     "offline",
228     "online",
229     "pagehide",
230     "pageshow",
231     "popstate",
232     "resize",
233     "storage",
234     "unload",
235 ];
236
237 const bodyElementDocumentForwardedEvents = [
238     "selectionchange",
239 ];
240
241 const nonEventNames = [
242     "noneventname",
243 ];
244
245 var magicNumber = 2;
246 var sideEffect;
247
248 function testHandler(object, install, remove, eventName)
249 {
250     const capturedMagicNumber = ++magicNumber;
251     install(capturedMagicNumber);
252
253     if (unusualEventNames[eventName])
254         eventName = unusualEventNames[eventName];
255
256     sideEffect = capturedMagicNumber - 1;
257     if (object !== window && object !== document)
258         object.dispatchEvent(new Event(eventName));
259     const handlerOnTarget = sideEffect === capturedMagicNumber;
260     sideEffect = capturedMagicNumber - 1;
261     window.dispatchEvent(new Event(eventName));
262     const handlerOnWindow = sideEffect === capturedMagicNumber;
263     sideEffect = capturedMagicNumber - 1;
264     document.dispatchEvent(new Event(eventName));
265     const handlerOnDocument = sideEffect === capturedMagicNumber;
266
267     remove();
268
269     sideEffect = capturedMagicNumber - 1;
270
271     object.dispatchEvent(new Event(eventName));
272     window.dispatchEvent(new Event(eventName));
273     document.dispatchEvent(new Event(eventName));
274
275     const misfire = sideEffect === capturedMagicNumber;
276
277     var result;
278
279     if (!handlerOnTarget && !handlerOnWindow && !handlerOnDocument)
280         result = "none";
281     else
282         result = ((handlerOnTarget ? ", target" : "") + (handlerOnWindow ? ", window" : "") + (handlerOnDocument ? ", document" : "")).substring(2);
283
284     if (misfire)
285         result += ", remove failed";
286
287     return result;
288 }
289
290 function testScriptAttribute(object, eventName)
291 {
292     const attributeName = "on" + eventName;
293     return testHandler(object, function(capturedMagicNumber) {
294         object[attributeName] = function() { sideEffect = capturedMagicNumber };
295     }, function() {
296         object[attributeName] = null;
297     }, eventName);
298 }
299
300 function testContentAttribute(element, eventName)
301 {
302     const attributeName = "on" + eventName;
303     return testHandler(element, function(capturedMagicNumber) {
304         element.setAttribute(attributeName, "sideEffect = " + capturedMagicNumber);
305     }, function() {
306         element.removeAttribute(attributeName);
307     }, eventName);
308 }
309
310 function testElementAttribute(object, eventName)
311 {
312     const scriptAttributeResult = testScriptAttribute(object, eventName);
313     const contentAttributeResult = testContentAttribute(object, eventName);
314     if (scriptAttributeResult === contentAttributeResult)
315         return scriptAttributeResult;
316     return "script: " + scriptAttributeResult + "; content: " + contentAttributeResult;
317 }
318
319 function sortUnique(array)
320 {
321     return array.sort().filter(function(item, i) {
322         return i === 0 || item !== array[i - 1];
323     });
324 }
325
326 function arrayUnion()
327 {
328     var combined = [];
329     for (var i = 0; i < arguments.length; ++i)
330         combined = combined.concat(arguments[i]);
331     return sortUnique(combined);
332 }
333
334 function arrayDifference(a, b)
335 {
336     return a.filter(function(item) {
337         return b.indexOf(item) < 0;
338     });
339 }
340
341 const allEventNames = arrayUnion(windowEvents, documentEvents, elementEvents, bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents, nonEventNames);
342
343 var sectionOpen = false;
344
345 function endSection()
346 {
347     if (sectionOpen) {
348         debug("");
349         sectionOpen = false;
350     }
351 }
352
353 function section(title)
354 {
355     endSection();
356     debug(title);
357     debug("");
358     sectionOpen = true;
359 }
360
361 function testArray(array, prefix, expected, sectionName)
362 {
363     section(sectionName);
364     for (var i = 0; i < array.length; ++i) {
365         shouldBeEqualToString(prefix + ", \"" + array[i] + "\")", expected);
366     }
367 }
368
369 const element = document.documentElement;
370 const bodyElement = document.body;
371 const audioElement = document.createElement("video");
372 const framesetElement = document.createElement("frameset");
373 const inputElement = document.createElement("input");
374 const videoElement = document.createElement("video");
375
376 testArray(windowEvents, "testScriptAttribute(window", "window", "Event names we expect to be able to set on the window object");
377 testArray(arrayDifference(allEventNames, windowEvents), "testScriptAttribute(window", "none", "Event names we expect not to be able to set on the window object");
378
379 testArray(documentEvents, "testScriptAttribute(document", "document", "Event names we expect to be able to set on the document");
380 testArray(arrayDifference(allEventNames, documentEvents), "testScriptAttribute(document", "none", "Event names we expect not to be able to set on the document");
381
382 testArray(elementEvents, "testElementAttribute(element", "target", "Event names we expect to be able to set on an element (tested on the &lt;html> element)");
383 testArray(arrayDifference(allEventNames, elementEvents), "testElementAttribute(element", "none", "Event names we expect not to be able to set on an element (tested on the &lt;html> element)");
384
385 testArray(elementEvents, "testElementAttribute(inputElement", "target", "Event names we expect to be able to set on an element (tested on the &lt;input> element)");
386 testArray(arrayDifference(allEventNames, elementEvents), "testElementAttribute(inputElement", "none", "Event names we expect not to be able to set on an element (tested on the &lt;input> element)");
387
388 testArray(elementEvents, "testElementAttribute(audioElement", "target", "Event names we expect to be able to set on an element (tested on the &lt;audio> element)");
389 testArray(arrayDifference(allEventNames, elementEvents), "testElementAttribute(audioElement", "none", "Event names we expect not to be able to set on an element (tested on the &lt;audio> element)");
390
391 testArray(elementEvents, "testElementAttribute(videoElement", "target", "Event names we expect to be able to set on an element (tested on the &lt;video> element)");
392 testArray(arrayDifference(allEventNames, elementEvents), "testElementAttribute(videoElement", "none", "Event names we expect not to be able to set on an element (tested on the &lt;video> element)");
393
394 testArray(bodyElementWindowForwardedEvents, "testElementAttribute(bodyElement", "window", "Event names we expect to be forwarded from &lt;body> element to window object)");
395 testArray(bodyElementDocumentForwardedEvents, "testElementAttribute(bodyElement", "document", "Event names we expect to be forwarded from &lt;body> element to document)");
396 testArray(arrayDifference(elementEvents, arrayUnion(bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents)), "testElementAttribute(bodyElement", "target", "Non-forwarded event names on &lt;body> element");
397 testArray(arrayDifference(allEventNames, arrayUnion(elementEvents, bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents)), "testElementAttribute(bodyElement", "none", "Event names we expect to not be able to set on &lt;body> element");
398
399 testArray(bodyElementWindowForwardedEvents, "testElementAttribute(framesetElement", "window", "Event names we expect to be forwarded from &lt;frameset> element to window object)");
400 testArray(bodyElementDocumentForwardedEvents, "testElementAttribute(framesetElement", "document", "Event names we expect to be forwarded from &lt;frameset> element to document)");
401 testArray(arrayDifference(elementEvents, arrayUnion(bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents)), "testElementAttribute(framesetElement", "target", "Non-forwarded event names on &lt;frameset> element");
402 testArray(arrayDifference(allEventNames, arrayUnion(elementEvents, bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents)), "testElementAttribute(framesetElement", "none", "Event names we expect to not be able to set on &lt;frameset> element");
403
404 endSection();
405
406 /*
407
408 ----------------
409
410 To make the results of this test platform independent, there is no testing here for conditional events.
411 An alternative would be to always make these event handler attributes work even if the feature
412 that sends the events is turned off. See list here of IDL files that indicate these conditional events.
413
414 page/DOMWindow.idl:#if defined(ENABLE_ORIENTATION_EVENTS) && ENABLE_ORIENTATION_EVENTS
415 page/DOMWindow.idl:    attribute EventListener onorientationchange;
416 page/DOMWindow.idl:#endif
417 page/DOMWindow.idl:    [Conditional=TOUCH_EVENTS] attribute EventListener ontouchstart;
418 page/DOMWindow.idl:    [Conditional=TOUCH_EVENTS] attribute EventListener ontouchmove;
419 page/DOMWindow.idl:    [Conditional=TOUCH_EVENTS] attribute EventListener ontouchend;
420 page/DOMWindow.idl:    [Conditional=TOUCH_EVENTS] attribute EventListener ontouchcancel;
421 page/DOMWindow.idl:    [Conditional=IOS_GESTURE_EVENTS] attribute EventListener ongesturestart;
422 page/DOMWindow.idl:    [Conditional=IOS_GESTURE_EVENTS] attribute EventListener ongesturechange;
423 page/DOMWindow.idl:    [Conditional=IOS_GESTURE_EVENTS] attribute EventListener ongestureend;
424 page/DOMWindow.idl:    [Conditional=DEVICE_ORIENTATION] attribute EventListener ondevicemotion;
425 page/DOMWindow.idl:    [Conditional=DEVICE_ORIENTATION] attribute EventListener ondeviceorientation;
426 page/DOMWindow.idl:    [Conditional=PROXIMITY_EVENTS] attribute EventListener onwebkitdeviceproximity;
427 page/DOMWindow.idl:    [Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealbottom;
428 page/DOMWindow.idl:    [Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealleft;
429 page/DOMWindow.idl:    [Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealright;
430 page/DOMWindow.idl:    [Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealtop;
431
432 dom/Document.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchstart;
433 dom/Document.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchmove;
434 dom/Document.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchend;
435 dom/Document.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchcancel;
436 dom/Document.idl:    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenchange;
437 dom/Document.idl:    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenerror;
438 dom/Document.idl:    [NotEnumerable, Conditional=POINTER_LOCK] attribute EventListener onpointerlockchange;
439 dom/Document.idl:    [NotEnumerable, Conditional=POINTER_LOCK] attribute EventListener onpointerlockerror;
440 dom/Document.idl:    [NotEnumerable, Conditional=CSP_NEXT] attribute EventListener onsecuritypolicyviolation;
441 dom/Document.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealbottom;
442 dom/Document.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealleft;
443 dom/Document.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealright;
444 dom/Document.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealtop;
445
446 dom/Element.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchstart;
447 dom/Element.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchmove;
448 dom/Element.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchend;
449 dom/Element.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchcancel;
450 dom/Element.idl:    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenchange;
451 dom/Element.idl:    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenerror;
452 dom/Element.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealbottom;
453 dom/Element.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealleft;
454 dom/Element.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealright;
455 dom/Element.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealtop;
456
457 html/HTMLBodyElement.idl:    [Conditional=ORIENTATION_EVENTS, NotEnumerable, JSWindowEventListener] attribute EventListener onorientationchange;
458
459 html/HTMLFrameSetElement.idl:    [Conditional=ORIENTATION_EVENTS, NotEnumerable, JSWindowEventListener] attribute EventListener onorientationchange;
460
461 html/HTMLFormElement.idl:    [Conditional=REQUEST_AUTOCOMPLETE, NotEnumerable] attribute EventListener onautocomplete;
462 html/HTMLFormElement.idl:    [Conditional=REQUEST_AUTOCOMPLETE, NotEnumerable] attribute EventListener onautocompleteerror;
463
464 html/HTMLMediaElement.idl:    attribute EventListener onwebkitkeyadded;
465 html/HTMLMediaElement.idl:    attribute EventListener onwebkitkeyerror;
466 html/HTMLMediaElement.idl:    attribute EventListener onwebkitkeymessage;
467 html/HTMLMediaElement.idl:    [Conditional=ENCRYPTED_MEDIA|ENCRYPTED_MEDIA_V2] attribute EventListener onwebkitneedkey;
468 html/HTMLMediaElement.idl:    [Conditional=WIRELESS_PLAYBACK_TARGET] attribute EventListener onwebkitcurrentplaybacktargetiswirelesschanged;
469 html/HTMLMediaElement.idl:    [Conditional=WIRELESS_PLAYBACK_TARGET] attribute EventListener onwebkitplaybacktargetavailabilitychanged;
470
471 ----------------
472
473 It would be good to extend this test to cover more objects.
474 See list below of IDL files that indicate objects have these attributes as of the writing of this test.
475
476 Modules/battery/BatteryManager.idl:    attribute EventListener onchargingchange;
477 Modules/battery/BatteryManager.idl:    attribute EventListener onchargingtimechange;
478 Modules/battery/BatteryManager.idl:    attribute EventListener ondischargingtimechange;
479 Modules/battery/BatteryManager.idl:    attribute EventListener onlevelchange;
480
481 Modules/encryptedmedia/MediaKeySession.idl:    attribute EventListener onwebkitkeyadded;
482 Modules/encryptedmedia/MediaKeySession.idl:    attribute EventListener onwebkitkeyerror;
483 Modules/encryptedmedia/MediaKeySession.idl:    attribute EventListener onwebkitkeymessage;
484
485 Modules/indexeddb/IDBDatabase.idl:    attribute EventListener onabort;
486 Modules/indexeddb/IDBDatabase.idl:    attribute EventListener onerror;
487 Modules/indexeddb/IDBDatabase.idl:    attribute EventListener onversionchange;
488
489 Modules/indexeddb/IDBOpenDBRequest.idl:    attribute EventListener onblocked;
490 Modules/indexeddb/IDBOpenDBRequest.idl:    attribute EventListener onupgradeneeded;
491
492 Modules/indexeddb/IDBRequest.idl:    attribute EventListener onsuccess;
493 Modules/indexeddb/IDBRequest.idl:    attribute EventListener onerror;
494
495 Modules/indexeddb/IDBTransaction.idl:    attribute EventListener onabort;
496 Modules/indexeddb/IDBTransaction.idl:    attribute EventListener oncomplete;
497 Modules/indexeddb/IDBTransaction.idl:    attribute EventListener onerror;
498
499 Modules/mediastream/MediaStream.idl:    attribute EventListener onactive;
500 Modules/mediastream/MediaStream.idl:    attribute EventListener oninactive;
501 Modules/mediastream/MediaStream.idl:    attribute EventListener onaddtrack;
502 Modules/mediastream/MediaStream.idl:    attribute EventListener onremovetrack;
503 Modules/mediastream/MediaStreamTrack.idl:    attribute EventListener onmute;
504 Modules/mediastream/MediaStreamTrack.idl:    attribute EventListener onunmute;
505 Modules/mediastream/MediaStreamTrack.idl:    attribute EventListener onstarted;
506 Modules/mediastream/MediaStreamTrack.idl:    attribute EventListener onended;
507 Modules/mediastream/MediaStreamTrack.idl:    attribute EventListener onoverconstrained;
508 Modules/mediastream/RTCDTMFSender.idl:    attribute EventListener ontonechange;
509 Modules/mediastream/RTCDataChannel.idl:    attribute EventListener onopen;
510 Modules/mediastream/RTCDataChannel.idl:    attribute EventListener onerror;
511 Modules/mediastream/RTCDataChannel.idl:    attribute EventListener onclose;
512 Modules/mediastream/RTCDataChannel.idl:    attribute EventListener onmessage;
513 Modules/mediastream/RTCPeerConnection.idl:    attribute EventListener onnegotiationneeded;
514 Modules/mediastream/RTCPeerConnection.idl:    attribute EventListener onicecandidate;
515 Modules/mediastream/RTCPeerConnection.idl:    attribute EventListener onsignalingstatechange;
516 Modules/mediastream/RTCPeerConnection.idl:    attribute EventListener onaddstream;
517 Modules/mediastream/RTCPeerConnection.idl:    attribute EventListener onremovestream;
518 Modules/mediastream/RTCPeerConnection.idl:    attribute EventListener oniceconnectionstatechange;
519 Modules/mediastream/RTCPeerConnection.idl:    attribute EventListener ondatachannel;
520
521 Modules/notifications/Notification.idl:    attribute EventListener onshow;
522 Modules/notifications/Notification.idl:    attribute EventListener ondisplay;
523 Modules/notifications/Notification.idl:    attribute EventListener onerror;
524 Modules/notifications/Notification.idl:    attribute EventListener onclose;
525 Modules/notifications/Notification.idl:    attribute EventListener onclick;
526
527 Modules/speech/SpeechSynthesisUtterance.idl:    attribute EventListener onstart;
528 Modules/speech/SpeechSynthesisUtterance.idl:    attribute EventListener onend;
529 Modules/speech/SpeechSynthesisUtterance.idl:    attribute EventListener onerror;
530 Modules/speech/SpeechSynthesisUtterance.idl:    attribute EventListener onpause;
531 Modules/speech/SpeechSynthesisUtterance.idl:    attribute EventListener onresume;
532 Modules/speech/SpeechSynthesisUtterance.idl:    attribute EventListener onmark;
533 Modules/speech/SpeechSynthesisUtterance.idl:    attribute EventListener onboundary;
534
535 Modules/webaudio/AudioBufferSourceNode.idl:    attribute EventListener onended;
536 Modules/webaudio/AudioContext.idl:    attribute EventListener oncomplete;
537 Modules/webaudio/OscillatorNode.idl:    attribute EventListener onended;
538 Modules/webaudio/ScriptProcessorNode.idl:    attribute EventListener onaudioprocess;
539
540 Modules/websockets/WebSocket.idl:    attribute EventListener onopen;
541 Modules/websockets/WebSocket.idl:    attribute EventListener onmessage;
542 Modules/websockets/WebSocket.idl:    attribute EventListener onerror;
543 Modules/websockets/WebSocket.idl:    attribute EventListener onclose;
544
545 css/FontLoader.idl:    attribute EventListener onloading;
546 css/FontLoader.idl:    attribute EventListener onloadingdone;
547 css/FontLoader.idl:    attribute EventListener onloadstart;
548 css/FontLoader.idl:    attribute EventListener onload;
549 css/FontLoader.idl:    attribute EventListener onerror;
550
551 dom/MessagePort.idl:    attribute EventListener onmessage;
552
553 fileapi/FileReader.idl:    attribute EventListener onloadstart;
554 fileapi/FileReader.idl:    attribute EventListener onprogress;
555 fileapi/FileReader.idl:    attribute EventListener onload;
556 fileapi/FileReader.idl:    attribute EventListener onabort;
557 fileapi/FileReader.idl:    attribute EventListener onerror;
558 fileapi/FileReader.idl:    attribute EventListener onloadend;
559
560 html/track/AudioTrackList.idl:    attribute EventListener onchange;
561 html/track/AudioTrackList.idl:    attribute EventListener onaddtrack;
562 html/track/AudioTrackList.idl:    attribute EventListener onremovetrack;
563
564 html/track/TextTrack.idl:             attribute EventListener oncuechange;
565 html/track/TextTrackCue.idl:    attribute EventListener onenter;
566
567 html/track/TextTrackCue.idl:    attribute EventListener onexit;
568 html/track/TextTrackList.idl:    attribute EventListener onaddtrack;
569 html/track/TextTrackList.idl:    attribute EventListener onchange;
570 html/track/TextTrackList.idl:    attribute EventListener onremovetrack;
571
572 html/track/VideoTrackList.idl:    attribute EventListener onchange;
573 html/track/VideoTrackList.idl:    attribute EventListener onaddtrack;
574 html/track/VideoTrackList.idl:    attribute EventListener onremovetrack;
575
576 loader/appcache/DOMApplicationCache.idl:    attribute EventListener onchecking;
577 loader/appcache/DOMApplicationCache.idl:    attribute EventListener onerror;
578 loader/appcache/DOMApplicationCache.idl:    attribute EventListener onnoupdate;
579 loader/appcache/DOMApplicationCache.idl:    attribute EventListener ondownloading;
580 loader/appcache/DOMApplicationCache.idl:    attribute EventListener onprogress;
581 loader/appcache/DOMApplicationCache.idl:    attribute EventListener onupdateready;
582 loader/appcache/DOMApplicationCache.idl:    attribute EventListener oncached;
583 loader/appcache/DOMApplicationCache.idl:    attribute EventListener onobsolete;
584
585 page/EventSource.idl:    attribute EventListener onopen;
586 page/EventSource.idl:    attribute EventListener onmessage;
587 page/EventSource.idl:    attribute EventListener onerror;
588
589 page/Performance.idl:    attribute EventListener onwebkitresourcetimingbufferfull;
590
591 workers/AbstractWorker.idl:    attribute EventListener onerror;
592
593 workers/DedicatedWorkerGlobalScope.idl:             attribute EventListener onmessage;
594
595 workers/Worker.idl:    attribute EventListener onmessage;
596
597 workers/WorkerGlobalScope.idl:    attribute EventListener onerror;
598 workers/WorkerGlobalScope.idl:    attribute EventListener onoffline;
599 workers/WorkerGlobalScope.idl:    attribute EventListener ononline;
600
601 xml/XMLHttpRequest.idl:    attribute EventListener onabort;
602 xml/XMLHttpRequest.idl:    attribute EventListener onerror;
603 xml/XMLHttpRequest.idl:    attribute EventListener onload;
604 xml/XMLHttpRequest.idl:    attribute EventListener onloadend;
605 xml/XMLHttpRequest.idl:    attribute EventListener onloadstart;
606 xml/XMLHttpRequest.idl:    attribute EventListener onprogress;
607 xml/XMLHttpRequest.idl:    [Conditional=XHR_TIMEOUT] attribute EventListener ontimeout;
608 xml/XMLHttpRequest.idl:    attribute EventListener onreadystatechange;
609
610 xml/XMLHttpRequestUpload.idl:    attribute EventListener onabort;
611 xml/XMLHttpRequestUpload.idl:    attribute EventListener onerror;
612 xml/XMLHttpRequestUpload.idl:    attribute EventListener onload;
613 xml/XMLHttpRequestUpload.idl:    attribute EventListener onloadend;
614 xml/XMLHttpRequestUpload.idl:    attribute EventListener onloadstart;
615 xml/XMLHttpRequestUpload.idl:    attribute EventListener onprogress;
616
617 ----------------
618
619 */
620
621 </script>
622 <script src="../../resources/js-test-post.js"></script>
623 </body>
624 </html>