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