Some event handler fixes
[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     "beforeload",
147     "beforepaste",
148     "blur",
149     "canplay",
150     "canplaythrough",
151     "change",
152     "click",
153     "contextmenu",
154     "copy",
155     "cut",
156     "dblclick",
157     "drag",
158     "dragend",
159     "dragenter",
160     "dragleave",
161     "dragover",
162     "dragstart",
163     "drop",
164     "durationchange",
165     "emptied",
166     "ended",
167     "error",
168     "focus",
169     "focusin",
170     "focusout",
171     "input",
172     "invalid",
173     "keydown",
174     "keypress",
175     "keyup",
176     "load",
177     "loadeddata",
178     "loadedmetadata",
179     "loadstart",
180     "mousedown",
181     "mouseenter",
182     "mouseleave",
183     "mousemove",
184     "mouseout",
185     "mouseover",
186     "mouseup",
187     "mousewheel",
188     "paste",
189     "pause",
190     "play",
191     "playing",
192     "progress",
193     "ratechange",
194     "reset",
195     "scroll",
196     "search",
197     "seeked",
198     "seeking",
199     "select",
200     "selectstart",
201     "stalled",
202     "submit",
203     "suspend",
204     "timeupdate",
205     "touchcancel",
206     "touchend",
207     "touchmove",
208     "touchstart",
209     "transitionend",
210     "volumechange",
211     "waiting",
212     "webkitanimationend",
213     "webkitanimationiteration",
214     "webkitanimationstart",
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 nonHTMLElement = document.createElementNS("foo", "foo");
370 const element = document.documentElement;
371 const bodyElement = document.body;
372 const audioElement = document.createElement("video");
373 const framesetElement = document.createElement("frameset");
374 const inputElement = document.createElement("input");
375 const videoElement = document.createElement("video");
376 const rectElement = document.createElementNS("http://www.w3.org/2000/svg", "rect");
377
378 testArray(windowEvents, "testScriptAttribute(window", "window", "Event names we expect to be able to set on the window object");
379 testArray(arrayDifference(allEventNames, windowEvents), "testScriptAttribute(window", "none", "Event names we expect not to be able to set on the window object");
380
381 testArray(documentEvents, "testScriptAttribute(document", "document", "Event names we expect to be able to set on the document");
382 testArray(arrayDifference(allEventNames, documentEvents), "testScriptAttribute(document", "none", "Event names we expect not to be able to set on the document");
383
384 testArray(elementEvents, "testElementAttribute(element", "target", "Event names we expect to be able to set on an element (tested on the &lt;html> element)");
385 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)");
386
387 testArray(elementEvents, "testElementAttribute(inputElement", "target", "Event names we expect to be able to set on an element (tested on the &lt;input> element)");
388 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)");
389
390 testArray(elementEvents, "testElementAttribute(audioElement", "target", "Event names we expect to be able to set on an element (tested on the &lt;audio> element)");
391 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)");
392
393 testArray(elementEvents, "testElementAttribute(videoElement", "target", "Event names we expect to be able to set on an element (tested on the &lt;video> element)");
394 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)");
395
396 testArray(bodyElementWindowForwardedEvents, "testElementAttribute(bodyElement", "window", "Event names we expect to be forwarded from &lt;body> element to window object)");
397 testArray(bodyElementDocumentForwardedEvents, "testElementAttribute(bodyElement", "document", "Event names we expect to be forwarded from &lt;body> element to document)");
398 testArray(arrayDifference(elementEvents, arrayUnion(bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents)), "testElementAttribute(bodyElement", "target", "Non-forwarded event names on &lt;body> element");
399 testArray(arrayDifference(allEventNames, arrayUnion(elementEvents, bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents)), "testElementAttribute(bodyElement", "none", "Event names we expect to not be able to set on &lt;body> element");
400
401 testArray(bodyElementWindowForwardedEvents, "testElementAttribute(framesetElement", "window", "Event names we expect to be forwarded from &lt;frameset> element to window object)");
402 testArray(bodyElementDocumentForwardedEvents, "testElementAttribute(framesetElement", "document", "Event names we expect to be forwarded from &lt;frameset> element to document)");
403 testArray(arrayDifference(elementEvents, arrayUnion(bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents)), "testElementAttribute(framesetElement", "target", "Non-forwarded event names on &lt;frameset> element");
404 testArray(arrayDifference(allEventNames, arrayUnion(elementEvents, bodyElementWindowForwardedEvents, bodyElementDocumentForwardedEvents)), "testElementAttribute(framesetElement", "none", "Event names we expect to not be able to set on &lt;frameset> element");
405
406 testArray(elementEvents, "testElementAttribute(rectElement", "target", "Event names we expect to be able to set on an element (tested on the SVG &lt;rect> element)");
407 testArray(arrayDifference(allEventNames, elementEvents), "testElementAttribute(rectElement", "none", "Event names we expect not to be able to set on an element (tested on the SVG &lt;rect> element)");
408
409 testArray(allEventNames, "testElementAttribute(nonHTMLElement", "none", "Event names on a non-HTML element");
410
411 endSection();
412
413 /*
414
415 ----------------
416
417 To make the results of this test platform independent, there is no testing here for conditional events.
418 An alternative would be to always make these event handler attributes work even if the feature
419 that sends the events is turned off. See list here of IDL files that include these conditional events.
420
421 page/DOMWindow.idl:    [Conditional=ORIENTATION_EVENTS] attribute EventListener onorientationchange;
422 page/DOMWindow.idl:    [Conditional=TOUCH_EVENTS] attribute EventListener ontouchstart;
423 page/DOMWindow.idl:    [Conditional=TOUCH_EVENTS] attribute EventListener ontouchmove;
424 page/DOMWindow.idl:    [Conditional=TOUCH_EVENTS] attribute EventListener ontouchend;
425 page/DOMWindow.idl:    [Conditional=TOUCH_EVENTS] attribute EventListener ontouchcancel;
426 page/DOMWindow.idl:    [Conditional=IOS_GESTURE_EVENTS] attribute EventListener ongesturestart;
427 page/DOMWindow.idl:    [Conditional=IOS_GESTURE_EVENTS] attribute EventListener ongesturechange;
428 page/DOMWindow.idl:    [Conditional=IOS_GESTURE_EVENTS] attribute EventListener ongestureend;
429 page/DOMWindow.idl:    [Conditional=DEVICE_ORIENTATION] attribute EventListener ondevicemotion;
430 page/DOMWindow.idl:    [Conditional=DEVICE_ORIENTATION] attribute EventListener ondeviceorientation;
431 page/DOMWindow.idl:    [Conditional=PROXIMITY_EVENTS] attribute EventListener onwebkitdeviceproximity;
432 page/DOMWindow.idl:    [Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealbottom;
433 page/DOMWindow.idl:    [Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealleft;
434 page/DOMWindow.idl:    [Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealright;
435 page/DOMWindow.idl:    [Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealtop;
436
437 dom/Document.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchstart;
438 dom/Document.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchmove;
439 dom/Document.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchend;
440 dom/Document.idl:    [NotEnumerable, Conditional=TOUCH_EVENTS] attribute EventListener ontouchcancel;
441 dom/Document.idl:    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenchange;
442 dom/Document.idl:    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenerror;
443 dom/Document.idl:    [NotEnumerable, Conditional=POINTER_LOCK] attribute EventListener onpointerlockchange;
444 dom/Document.idl:    [NotEnumerable, Conditional=POINTER_LOCK] attribute EventListener onpointerlockerror;
445 dom/Document.idl:    [NotEnumerable, Conditional=CSP_NEXT] attribute EventListener onsecuritypolicyviolation;
446 dom/Document.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealbottom;
447 dom/Document.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealleft;
448 dom/Document.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealright;
449 dom/Document.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealtop;
450
451 dom/Element.idl:    [NotEnumerable, Conditional=ENCRYPTED_MEDIA] attribute EventListener onwebkitkeyadded;
452 dom/Element.idl:    [NotEnumerable, Conditional=ENCRYPTED_MEDIA] attribute EventListener onwebkitkeyerror;
453 dom/Element.idl:    [NotEnumerable, Conditional=ENCRYPTED_MEDIA] attribute EventListener onwebkitkeymessage;
454 dom/Element.idl:    [NotEnumerable, Conditional=ENCRYPTED_MEDIA|ENCRYPTED_MEDIA_V2] attribute EventListener onwebkitneedkey;
455 dom/Element.idl:    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenchange;
456 dom/Element.idl:    [NotEnumerable, Conditional=FULLSCREEN_API] attribute EventListener onwebkitfullscreenerror;
457 dom/Element.idl:    [NotEnumerable, Conditional=REQUEST_AUTOCOMPLETE] attribute EventListener onautocomplete;
458 dom/Element.idl:    [NotEnumerable, Conditional=REQUEST_AUTOCOMPLETE] attribute EventListener onautocompleteerror;
459 dom/Element.idl:    [NotEnumerable, Conditional=VIDEO_PRESENTATION_MODE] attribute EventListener onwebkitpresentationmodechanged;
460 dom/Element.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealbottom;
461 dom/Element.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealleft;
462 dom/Element.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealright;
463 dom/Element.idl:    [NotEnumerable, Conditional=WILL_REVEAL_EDGE_EVENTS] attribute EventListener onwebkitwillrevealtop;
464 dom/Element.idl:    [NotEnumerable, Conditional=WIRELESS_PLAYBACK_TARGET] attribute EventListener onwebkitcurrentplaybacktargetiswirelesschanged;
465 dom/Element.idl:    [NotEnumerable, Conditional=WIRELESS_PLAYBACK_TARGET] attribute EventListener onwebkitplaybacktargetavailabilitychanged;
466
467 html/HTMLBodyElement.idl:    [Conditional=ORIENTATION_EVENTS, NotEnumerable, JSWindowEventListener] attribute EventListener onorientationchange;
468
469 html/HTMLFrameSetElement.idl:    [Conditional=ORIENTATION_EVENTS, NotEnumerable, JSWindowEventListener] attribute EventListener onorientationchange;
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>