1356b8defb51adf939e0e8c114c189d95d923f754Steve Block 2356b8defb51adf939e0e8c114c189d95d923f754Steve Block/* 3356b8defb51adf939e0e8c114c189d95d923f754Steve BlockCopyright © 2001-2004 World Wide Web Consortium, 4356b8defb51adf939e0e8c114c189d95d923f754Steve Block(Massachusetts Institute of Technology, European Research Consortium 5356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfor Informatics and Mathematics, Keio University). All 6356b8defb51adf939e0e8c114c189d95d923f754Steve BlockRights Reserved. This work is distributed under the W3C® Software License [1] in the 7356b8defb51adf939e0e8c114c189d95d923f754Steve Blockhope that it will be useful, but WITHOUT ANY WARRANTY; without even 8356b8defb51adf939e0e8c114c189d95d923f754Steve Blockthe implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 9356b8defb51adf939e0e8c114c189d95d923f754Steve Block 10356b8defb51adf939e0e8c114c189d95d923f754Steve Block[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 11356b8defb51adf939e0e8c114c189d95d923f754Steve Block*/ 12356b8defb51adf939e0e8c114c189d95d923f754Steve Block 13356b8defb51adf939e0e8c114c189d95d923f754Steve Block 14356b8defb51adf939e0e8c114c189d95d923f754Steve Block 15356b8defb51adf939e0e8c114c189d95d923f754Steve Block /** 16356b8defb51adf939e0e8c114c189d95d923f754Steve Block * Gets URI that identifies the test. 17356b8defb51adf939e0e8c114c189d95d923f754Steve Block * @return uri identifier of test 18356b8defb51adf939e0e8c114c189d95d923f754Steve Block */ 19356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction getTargetURI() { 20356b8defb51adf939e0e8c114c189d95d923f754Steve Block return "http://www.w3.org/2001/DOM-Test-Suite/level2/events/dispatchEvent13"; 21356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 22356b8defb51adf939e0e8c114c189d95d923f754Steve Block 23356b8defb51adf939e0e8c114c189d95d923f754Steve Blockvar docsLoaded = -1000000; 24356b8defb51adf939e0e8c114c189d95d923f754Steve Blockvar builder = null; 25356b8defb51adf939e0e8c114c189d95d923f754Steve Block 26356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 27356b8defb51adf939e0e8c114c189d95d923f754Steve Block// This function is called by the testing framework before 28356b8defb51adf939e0e8c114c189d95d923f754Steve Block// running the test suite. 29356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 30356b8defb51adf939e0e8c114c189d95d923f754Steve Block// If there are no configuration exceptions, asynchronous 31356b8defb51adf939e0e8c114c189d95d923f754Steve Block// document loading is started. Otherwise, the status 32356b8defb51adf939e0e8c114c189d95d923f754Steve Block// is set to complete and the exception is immediately 33356b8defb51adf939e0e8c114c189d95d923f754Steve Block// raised when entering the body of the test. 34356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 35356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction setUpPage() { 36356b8defb51adf939e0e8c114c189d95d923f754Steve Block setUpPageStatus = 'running'; 37356b8defb51adf939e0e8c114c189d95d923f754Steve Block try { 38356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 39356b8defb51adf939e0e8c114c189d95d923f754Steve Block // creates test document builder, may throw exception 40356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 41356b8defb51adf939e0e8c114c189d95d923f754Steve Block builder = createConfiguredBuilder(); 42356b8defb51adf939e0e8c114c189d95d923f754Steve Block 43356b8defb51adf939e0e8c114c189d95d923f754Steve Block docsLoaded = 0; 44356b8defb51adf939e0e8c114c189d95d923f754Steve Block 45356b8defb51adf939e0e8c114c189d95d923f754Steve Block var docRef = null; 46356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (typeof(this.doc) != 'undefined') { 47356b8defb51adf939e0e8c114c189d95d923f754Steve Block docRef = this.doc; 48356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 49356b8defb51adf939e0e8c114c189d95d923f754Steve Block docsLoaded += preload(docRef, "doc", "hc_staff"); 50356b8defb51adf939e0e8c114c189d95d923f754Steve Block 51356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (docsLoaded == 1) { 52356b8defb51adf939e0e8c114c189d95d923f754Steve Block setUpPageStatus = 'complete'; 53356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 54356b8defb51adf939e0e8c114c189d95d923f754Steve Block } catch(ex) { 55356b8defb51adf939e0e8c114c189d95d923f754Steve Block catchInitializationError(builder, ex); 56356b8defb51adf939e0e8c114c189d95d923f754Steve Block setUpPageStatus = 'complete'; 57356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 58356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 59356b8defb51adf939e0e8c114c189d95d923f754Steve Block 60356b8defb51adf939e0e8c114c189d95d923f754Steve Block 61356b8defb51adf939e0e8c114c189d95d923f754Steve Block 62356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 63356b8defb51adf939e0e8c114c189d95d923f754Steve Block// This method is called on the completion of 64356b8defb51adf939e0e8c114c189d95d923f754Steve Block// each asychronous load started in setUpTests. 65356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 66356b8defb51adf939e0e8c114c189d95d923f754Steve Block// When every synchronous loaded document has completed, 67356b8defb51adf939e0e8c114c189d95d923f754Steve Block// the page status is changed which allows the 68356b8defb51adf939e0e8c114c189d95d923f754Steve Block// body of the test to be executed. 69356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction loadComplete() { 70356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (++docsLoaded == 1) { 71356b8defb51adf939e0e8c114c189d95d923f754Steve Block setUpPageStatus = 'complete'; 72356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 73356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 74356b8defb51adf939e0e8c114c189d95d923f754Steve Block 75356b8defb51adf939e0e8c114c189d95d923f754Steve Block 76356b8defb51adf939e0e8c114c189d95d923f754Steve Block /** 77356b8defb51adf939e0e8c114c189d95d923f754Steve Block * Inner class implementation for variable listener1 78356b8defb51adf939e0e8c114c189d95d923f754Steve Block */ 79356b8defb51adf939e0e8c114c189d95d923f754Steve Blockvar listener1; 80356b8defb51adf939e0e8c114c189d95d923f754Steve Block 81356b8defb51adf939e0e8c114c189d95d923f754Steve Block/** 82356b8defb51adf939e0e8c114c189d95d923f754Steve Block * Constructor 83356b8defb51adf939e0e8c114c189d95d923f754Steve Block 84356b8defb51adf939e0e8c114c189d95d923f754Steve Block * @param events Value from value attribute of nested var element 85356b8defb51adf939e0e8c114c189d95d923f754Steve Block * @param listeners Value from value attribute of nested var element 86356b8defb51adf939e0e8c114c189d95d923f754Steve Block */ 87356b8defb51adf939e0e8c114c189d95d923f754Steve Block 88356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction EventListenerN1003B(events, listeners) { 89356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.events = events; 90356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.listeners = listeners; 91356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 92356b8defb51adf939e0e8c114c189d95d923f754Steve Block 93356b8defb51adf939e0e8c114c189d95d923f754Steve Block /** 94356b8defb51adf939e0e8c114c189d95d923f754Steve Block * 95356b8defb51adf939e0e8c114c189d95d923f754Steve BlockThis method is called whenever an event occurs of the type for which theEventListenerinterface was registered. 96356b8defb51adf939e0e8c114c189d95d923f754Steve Block 97356b8defb51adf939e0e8c114c189d95d923f754Steve Block * @param evt 98356b8defb51adf939e0e8c114c189d95d923f754Steve BlockTheEventcontains contextual information about the event. It also contains thestopPropagationand preventDefaultmethods which are used in determining the event's flow and default action. 99356b8defb51adf939e0e8c114c189d95d923f754Steve Block 100356b8defb51adf939e0e8c114c189d95d923f754Steve Block */ 101356b8defb51adf939e0e8c114c189d95d923f754Steve BlockEventListenerN1003B.prototype.handleEvent = function(evt) { 102356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 103356b8defb51adf939e0e8c114c189d95d923f754Steve Block // bring class variables into function scope 104356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 105356b8defb51adf939e0e8c114c189d95d923f754Steve Block var events = listener1.events; 106356b8defb51adf939e0e8c114c189d95d923f754Steve Block var listeners = listener1.listeners; 107356b8defb51adf939e0e8c114c189d95d923f754Steve Block var target; 108356b8defb51adf939e0e8c114c189d95d923f754Steve Block var listener; 109356b8defb51adf939e0e8c114c189d95d923f754Steve Block events[events.length] = evt; 110356b8defb51adf939e0e8c114c189d95d923f754Steve Blocktarget = evt.currentTarget; 111356b8defb51adf939e0e8c114c189d95d923f754Steve Block 112356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(var indexN10065 = 0;indexN10065 < listeners.length; indexN10065++) { 113356b8defb51adf939e0e8c114c189d95d923f754Steve Block listener = listeners[indexN10065]; 114356b8defb51adf939e0e8c114c189d95d923f754Steve Block target.removeEventListener("foo", listener.handleEvent, false); 115356b8defb51adf939e0e8c114c189d95d923f754Steve Block 116356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 117356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 118356b8defb51adf939e0e8c114c189d95d923f754Steve Block 119356b8defb51adf939e0e8c114c189d95d923f754Steve Block /** 120356b8defb51adf939e0e8c114c189d95d923f754Steve Block * Inner class implementation for variable listener2 121356b8defb51adf939e0e8c114c189d95d923f754Steve Block */ 122356b8defb51adf939e0e8c114c189d95d923f754Steve Blockvar listener2; 123356b8defb51adf939e0e8c114c189d95d923f754Steve Block 124356b8defb51adf939e0e8c114c189d95d923f754Steve Block/** 125356b8defb51adf939e0e8c114c189d95d923f754Steve Block * Constructor 126356b8defb51adf939e0e8c114c189d95d923f754Steve Block 127356b8defb51adf939e0e8c114c189d95d923f754Steve Block * @param events Value from value attribute of nested var element 128356b8defb51adf939e0e8c114c189d95d923f754Steve Block * @param listeners Value from value attribute of nested var element 129356b8defb51adf939e0e8c114c189d95d923f754Steve Block */ 130356b8defb51adf939e0e8c114c189d95d923f754Steve Block 131356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction EventListenerN10074(events, listeners) { 132356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.events = events; 133356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.listeners = listeners; 134356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 135356b8defb51adf939e0e8c114c189d95d923f754Steve Block 136356b8defb51adf939e0e8c114c189d95d923f754Steve Block /** 137356b8defb51adf939e0e8c114c189d95d923f754Steve Block * 138356b8defb51adf939e0e8c114c189d95d923f754Steve BlockThis method is called whenever an event occurs of the type for which theEventListenerinterface was registered. 139356b8defb51adf939e0e8c114c189d95d923f754Steve Block 140356b8defb51adf939e0e8c114c189d95d923f754Steve Block * @param evt 141356b8defb51adf939e0e8c114c189d95d923f754Steve BlockTheEventcontains contextual information about the event. It also contains thestopPropagationand preventDefaultmethods which are used in determining the event's flow and default action. 142356b8defb51adf939e0e8c114c189d95d923f754Steve Block 143356b8defb51adf939e0e8c114c189d95d923f754Steve Block */ 144356b8defb51adf939e0e8c114c189d95d923f754Steve BlockEventListenerN10074.prototype.handleEvent = function(evt) { 145356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 146356b8defb51adf939e0e8c114c189d95d923f754Steve Block // bring class variables into function scope 147356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 148356b8defb51adf939e0e8c114c189d95d923f754Steve Block var events = listener2.events; 149356b8defb51adf939e0e8c114c189d95d923f754Steve Block var listeners = listener2.listeners; 150356b8defb51adf939e0e8c114c189d95d923f754Steve Block var target; 151356b8defb51adf939e0e8c114c189d95d923f754Steve Block var listener; 152356b8defb51adf939e0e8c114c189d95d923f754Steve Block events[events.length] = evt; 153356b8defb51adf939e0e8c114c189d95d923f754Steve Blocktarget = evt.currentTarget; 154356b8defb51adf939e0e8c114c189d95d923f754Steve Block 155356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(var indexN10098 = 0;indexN10098 < listeners.length; indexN10098++) { 156356b8defb51adf939e0e8c114c189d95d923f754Steve Block listener = listeners[indexN10098]; 157356b8defb51adf939e0e8c114c189d95d923f754Steve Block target.removeEventListener("foo", listener.handleEvent, false); 158356b8defb51adf939e0e8c114c189d95d923f754Steve Block 159356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 160356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 161356b8defb51adf939e0e8c114c189d95d923f754Steve Block 162356b8defb51adf939e0e8c114c189d95d923f754Steve Block/** 163356b8defb51adf939e0e8c114c189d95d923f754Steve Block* 164356b8defb51adf939e0e8c114c189d95d923f754Steve BlockTwo listeners are registered on the same target, each of which will remove both itself and 165356b8defb51adf939e0e8c114c189d95d923f754Steve Blockthe other on the first event. Only one should see the event since event listeners 166356b8defb51adf939e0e8c114c189d95d923f754Steve Blockcan never be invoked after being removed. 167356b8defb51adf939e0e8c114c189d95d923f754Steve Block 168356b8defb51adf939e0e8c114c189d95d923f754Steve Block* @author Curt Arnold 169356b8defb51adf939e0e8c114c189d95d923f754Steve Block* @see http://www.w3.org/TR/DOM-Level-2-Events/events#Events-EventTarget-dispatchEvent 170356b8defb51adf939e0e8c114c189d95d923f754Steve Block* @see http://www.w3.org/TR/DOM-Level-2-Events/events#xpointer(id('Events-EventTarget-dispatchEvent')/raises/exception[@name='EventException']/descr/p[substring-before(.,':')='UNSPECIFIED_EVENT_TYPE_ERR']) 171356b8defb51adf939e0e8c114c189d95d923f754Steve Block*/ 172356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction dispatchEvent13() { 173356b8defb51adf939e0e8c114c189d95d923f754Steve Block var success; 174356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(checkInitialization(builder, "dispatchEvent13") != null) return; 175356b8defb51adf939e0e8c114c189d95d923f754Steve Block var doc; 176356b8defb51adf939e0e8c114c189d95d923f754Steve Block var target; 177356b8defb51adf939e0e8c114c189d95d923f754Steve Block var evt; 178356b8defb51adf939e0e8c114c189d95d923f754Steve Block var preventDefault; 179356b8defb51adf939e0e8c114c189d95d923f754Steve Block var listeners = new Array(); 180356b8defb51adf939e0e8c114c189d95d923f754Steve Block 181356b8defb51adf939e0e8c114c189d95d923f754Steve Block var events = new Array(); 182356b8defb51adf939e0e8c114c189d95d923f754Steve Block 183356b8defb51adf939e0e8c114c189d95d923f754Steve Block listener1 = new EventListenerN1003B(events, listeners); 184356b8defb51adf939e0e8c114c189d95d923f754Steve Block 185356b8defb51adf939e0e8c114c189d95d923f754Steve Block listener2 = new EventListenerN10074(events, listeners); 186356b8defb51adf939e0e8c114c189d95d923f754Steve Block 187356b8defb51adf939e0e8c114c189d95d923f754Steve Block 188356b8defb51adf939e0e8c114c189d95d923f754Steve Block var docRef = null; 189356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (typeof(this.doc) != 'undefined') { 190356b8defb51adf939e0e8c114c189d95d923f754Steve Block docRef = this.doc; 191356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 192356b8defb51adf939e0e8c114c189d95d923f754Steve Block doc = load(docRef, "doc", "hc_staff"); 193356b8defb51adf939e0e8c114c189d95d923f754Steve Block listeners[listeners.length] = listener1; 194356b8defb51adf939e0e8c114c189d95d923f754Steve Blocklisteners[listeners.length] = listener2; 195356b8defb51adf939e0e8c114c189d95d923f754Steve Blockdoc.addEventListener("foo", listener1.handleEvent, false); 196356b8defb51adf939e0e8c114c189d95d923f754Steve Block doc.addEventListener("foo", listener2.handleEvent, false); 197356b8defb51adf939e0e8c114c189d95d923f754Steve Block evt = doc.createEvent("Events"); 198356b8defb51adf939e0e8c114c189d95d923f754Steve Block evt.initEvent("foo",true,false); 199356b8defb51adf939e0e8c114c189d95d923f754Steve Block preventDefault = doc.dispatchEvent(evt); 200356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertSize("eventCount",1,events); 201356b8defb51adf939e0e8c114c189d95d923f754Steve Block 202356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 203356b8defb51adf939e0e8c114c189d95d923f754Steve Block 204356b8defb51adf939e0e8c114c189d95d923f754Steve Block 205356b8defb51adf939e0e8c114c189d95d923f754Steve Block 206356b8defb51adf939e0e8c114c189d95d923f754Steve Block 207356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction runTest() { 208356b8defb51adf939e0e8c114c189d95d923f754Steve Block dispatchEvent13(); 209356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 210