1255e72915d4cbddceb435e13d81601755714e9fSE Android 2255e72915d4cbddceb435e13d81601755714e9fSE Android/* 3255e72915d4cbddceb435e13d81601755714e9fSE AndroidCopyright © 2001-2004 World Wide Web Consortium, 4255e72915d4cbddceb435e13d81601755714e9fSE Android(Massachusetts Institute of Technology, European Research Consortium 5255e72915d4cbddceb435e13d81601755714e9fSE Androidfor Informatics and Mathematics, Keio University). All 6255e72915d4cbddceb435e13d81601755714e9fSE AndroidRights Reserved. This work is distributed under the W3C® Software License [1] in the 7255e72915d4cbddceb435e13d81601755714e9fSE Androidhope that it will be useful, but WITHOUT ANY WARRANTY; without even 8255e72915d4cbddceb435e13d81601755714e9fSE Androidthe implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 9255e72915d4cbddceb435e13d81601755714e9fSE Android 10255e72915d4cbddceb435e13d81601755714e9fSE Android[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 11255e72915d4cbddceb435e13d81601755714e9fSE Android*/ 12255e72915d4cbddceb435e13d81601755714e9fSE Android 13255e72915d4cbddceb435e13d81601755714e9fSE Android 14255e72915d4cbddceb435e13d81601755714e9fSE Android 15255e72915d4cbddceb435e13d81601755714e9fSE Android /** 16255e72915d4cbddceb435e13d81601755714e9fSE Android * Gets URI that identifies the test. 17255e72915d4cbddceb435e13d81601755714e9fSE Android * @return uri identifier of test 18255e72915d4cbddceb435e13d81601755714e9fSE Android */ 19255e72915d4cbddceb435e13d81601755714e9fSE Androidfunction getTargetURI() { 20255e72915d4cbddceb435e13d81601755714e9fSE Android return "http://www.w3.org/2001/DOM-Test-Suite/level2/events/dispatchEvent13"; 21255e72915d4cbddceb435e13d81601755714e9fSE Android } 22255e72915d4cbddceb435e13d81601755714e9fSE Android 23255e72915d4cbddceb435e13d81601755714e9fSE Androidvar docsLoaded = -1000000; 24255e72915d4cbddceb435e13d81601755714e9fSE Androidvar builder = null; 25255e72915d4cbddceb435e13d81601755714e9fSE Android 26255e72915d4cbddceb435e13d81601755714e9fSE Android// 27255e72915d4cbddceb435e13d81601755714e9fSE Android// This function is called by the testing framework before 28255e72915d4cbddceb435e13d81601755714e9fSE Android// running the test suite. 29255e72915d4cbddceb435e13d81601755714e9fSE Android// 30255e72915d4cbddceb435e13d81601755714e9fSE Android// If there are no configuration exceptions, asynchronous 31255e72915d4cbddceb435e13d81601755714e9fSE Android// document loading is started. Otherwise, the status 32255e72915d4cbddceb435e13d81601755714e9fSE Android// is set to complete and the exception is immediately 33255e72915d4cbddceb435e13d81601755714e9fSE Android// raised when entering the body of the test. 34255e72915d4cbddceb435e13d81601755714e9fSE Android// 35255e72915d4cbddceb435e13d81601755714e9fSE Androidfunction setUpPage() { 36255e72915d4cbddceb435e13d81601755714e9fSE Android setUpPageStatus = 'running'; 37255e72915d4cbddceb435e13d81601755714e9fSE Android try { 38255e72915d4cbddceb435e13d81601755714e9fSE Android // 39255e72915d4cbddceb435e13d81601755714e9fSE Android // creates test document builder, may throw exception 40255e72915d4cbddceb435e13d81601755714e9fSE Android // 41255e72915d4cbddceb435e13d81601755714e9fSE Android builder = createConfiguredBuilder(); 42255e72915d4cbddceb435e13d81601755714e9fSE Android 43255e72915d4cbddceb435e13d81601755714e9fSE Android docsLoaded = 0; 44255e72915d4cbddceb435e13d81601755714e9fSE Android 45255e72915d4cbddceb435e13d81601755714e9fSE Android var docRef = null; 46255e72915d4cbddceb435e13d81601755714e9fSE Android if (typeof(this.doc) != 'undefined') { 47255e72915d4cbddceb435e13d81601755714e9fSE Android docRef = this.doc; 48255e72915d4cbddceb435e13d81601755714e9fSE Android } 49255e72915d4cbddceb435e13d81601755714e9fSE Android docsLoaded += preload(docRef, "doc", "hc_staff"); 50255e72915d4cbddceb435e13d81601755714e9fSE Android 51255e72915d4cbddceb435e13d81601755714e9fSE Android if (docsLoaded == 1) { 52255e72915d4cbddceb435e13d81601755714e9fSE Android setUpPageStatus = 'complete'; 53255e72915d4cbddceb435e13d81601755714e9fSE Android } 54255e72915d4cbddceb435e13d81601755714e9fSE Android } catch(ex) { 55255e72915d4cbddceb435e13d81601755714e9fSE Android catchInitializationError(builder, ex); 56255e72915d4cbddceb435e13d81601755714e9fSE Android setUpPageStatus = 'complete'; 57255e72915d4cbddceb435e13d81601755714e9fSE Android } 58255e72915d4cbddceb435e13d81601755714e9fSE Android} 59255e72915d4cbddceb435e13d81601755714e9fSE Android 60255e72915d4cbddceb435e13d81601755714e9fSE Android 61255e72915d4cbddceb435e13d81601755714e9fSE Android 62255e72915d4cbddceb435e13d81601755714e9fSE Android// 63255e72915d4cbddceb435e13d81601755714e9fSE Android// This method is called on the completion of 64255e72915d4cbddceb435e13d81601755714e9fSE Android// each asychronous load started in setUpTests. 65255e72915d4cbddceb435e13d81601755714e9fSE Android// 66255e72915d4cbddceb435e13d81601755714e9fSE Android// When every synchronous loaded document has completed, 67255e72915d4cbddceb435e13d81601755714e9fSE Android// the page status is changed which allows the 68255e72915d4cbddceb435e13d81601755714e9fSE Android// body of the test to be executed. 69255e72915d4cbddceb435e13d81601755714e9fSE Androidfunction loadComplete() { 70255e72915d4cbddceb435e13d81601755714e9fSE Android if (++docsLoaded == 1) { 71255e72915d4cbddceb435e13d81601755714e9fSE Android setUpPageStatus = 'complete'; 72255e72915d4cbddceb435e13d81601755714e9fSE Android } 73255e72915d4cbddceb435e13d81601755714e9fSE Android} 74255e72915d4cbddceb435e13d81601755714e9fSE Android 75255e72915d4cbddceb435e13d81601755714e9fSE Android 76255e72915d4cbddceb435e13d81601755714e9fSE Android /** 77255e72915d4cbddceb435e13d81601755714e9fSE Android * Inner class implementation for variable listener1 78255e72915d4cbddceb435e13d81601755714e9fSE Android */ 79255e72915d4cbddceb435e13d81601755714e9fSE Androidvar listener1; 80255e72915d4cbddceb435e13d81601755714e9fSE Android 81255e72915d4cbddceb435e13d81601755714e9fSE Android/** 82255e72915d4cbddceb435e13d81601755714e9fSE Android * Constructor 83255e72915d4cbddceb435e13d81601755714e9fSE Android 84255e72915d4cbddceb435e13d81601755714e9fSE Android * @param events Value from value attribute of nested var element 85255e72915d4cbddceb435e13d81601755714e9fSE Android * @param listeners Value from value attribute of nested var element 86255e72915d4cbddceb435e13d81601755714e9fSE Android */ 87255e72915d4cbddceb435e13d81601755714e9fSE Android 88255e72915d4cbddceb435e13d81601755714e9fSE Androidfunction EventListenerN1003B(events, listeners) { 89255e72915d4cbddceb435e13d81601755714e9fSE Android this.events = events; 90255e72915d4cbddceb435e13d81601755714e9fSE Android this.listeners = listeners; 91255e72915d4cbddceb435e13d81601755714e9fSE Android } 92255e72915d4cbddceb435e13d81601755714e9fSE Android 93255e72915d4cbddceb435e13d81601755714e9fSE Android /** 94255e72915d4cbddceb435e13d81601755714e9fSE Android * 95255e72915d4cbddceb435e13d81601755714e9fSE AndroidThis method is called whenever an event occurs of the type for which theEventListenerinterface was registered. 96255e72915d4cbddceb435e13d81601755714e9fSE Android 97255e72915d4cbddceb435e13d81601755714e9fSE Android * @param evt 98255e72915d4cbddceb435e13d81601755714e9fSE AndroidTheEventcontains contextual information about the event. It also contains thestopPropagationand preventDefaultmethods which are used in determining the event's flow and default action. 99255e72915d4cbddceb435e13d81601755714e9fSE Android 100255e72915d4cbddceb435e13d81601755714e9fSE Android */ 101255e72915d4cbddceb435e13d81601755714e9fSE AndroidEventListenerN1003B.prototype.handleEvent = function(evt) { 102255e72915d4cbddceb435e13d81601755714e9fSE Android // 103255e72915d4cbddceb435e13d81601755714e9fSE Android // bring class variables into function scope 104255e72915d4cbddceb435e13d81601755714e9fSE Android // 105255e72915d4cbddceb435e13d81601755714e9fSE Android var events = listener1.events; 106255e72915d4cbddceb435e13d81601755714e9fSE Android var listeners = listener1.listeners; 107255e72915d4cbddceb435e13d81601755714e9fSE Android var target; 108255e72915d4cbddceb435e13d81601755714e9fSE Android var listener; 109255e72915d4cbddceb435e13d81601755714e9fSE Android events[events.length] = evt; 110255e72915d4cbddceb435e13d81601755714e9fSE Androidtarget = evt.currentTarget; 111255e72915d4cbddceb435e13d81601755714e9fSE Android 112255e72915d4cbddceb435e13d81601755714e9fSE Android for(var indexN10065 = 0;indexN10065 < listeners.length; indexN10065++) { 113255e72915d4cbddceb435e13d81601755714e9fSE Android listener = listeners[indexN10065]; 114255e72915d4cbddceb435e13d81601755714e9fSE Android target.removeEventListener("foo", listener.handleEvent, false); 115255e72915d4cbddceb435e13d81601755714e9fSE Android 116255e72915d4cbddceb435e13d81601755714e9fSE Android } 117255e72915d4cbddceb435e13d81601755714e9fSE Android } 118255e72915d4cbddceb435e13d81601755714e9fSE Android 119255e72915d4cbddceb435e13d81601755714e9fSE Android /** 120255e72915d4cbddceb435e13d81601755714e9fSE Android * Inner class implementation for variable listener2 121255e72915d4cbddceb435e13d81601755714e9fSE Android */ 122255e72915d4cbddceb435e13d81601755714e9fSE Androidvar listener2; 123255e72915d4cbddceb435e13d81601755714e9fSE Android 124255e72915d4cbddceb435e13d81601755714e9fSE Android/** 125255e72915d4cbddceb435e13d81601755714e9fSE Android * Constructor 126255e72915d4cbddceb435e13d81601755714e9fSE Android 127255e72915d4cbddceb435e13d81601755714e9fSE Android * @param events Value from value attribute of nested var element 128255e72915d4cbddceb435e13d81601755714e9fSE Android * @param listeners Value from value attribute of nested var element 129255e72915d4cbddceb435e13d81601755714e9fSE Android */ 130255e72915d4cbddceb435e13d81601755714e9fSE Android 131255e72915d4cbddceb435e13d81601755714e9fSE Androidfunction EventListenerN10074(events, listeners) { 132255e72915d4cbddceb435e13d81601755714e9fSE Android this.events = events; 133255e72915d4cbddceb435e13d81601755714e9fSE Android this.listeners = listeners; 134255e72915d4cbddceb435e13d81601755714e9fSE Android } 135255e72915d4cbddceb435e13d81601755714e9fSE Android 136255e72915d4cbddceb435e13d81601755714e9fSE Android /** 137255e72915d4cbddceb435e13d81601755714e9fSE Android * 138255e72915d4cbddceb435e13d81601755714e9fSE AndroidThis method is called whenever an event occurs of the type for which theEventListenerinterface was registered. 139255e72915d4cbddceb435e13d81601755714e9fSE Android 140255e72915d4cbddceb435e13d81601755714e9fSE Android * @param evt 141255e72915d4cbddceb435e13d81601755714e9fSE AndroidTheEventcontains contextual information about the event. It also contains thestopPropagationand preventDefaultmethods which are used in determining the event's flow and default action. 142255e72915d4cbddceb435e13d81601755714e9fSE Android 143255e72915d4cbddceb435e13d81601755714e9fSE Android */ 144255e72915d4cbddceb435e13d81601755714e9fSE AndroidEventListenerN10074.prototype.handleEvent = function(evt) { 145255e72915d4cbddceb435e13d81601755714e9fSE Android // 146255e72915d4cbddceb435e13d81601755714e9fSE Android // bring class variables into function scope 147255e72915d4cbddceb435e13d81601755714e9fSE Android // 148255e72915d4cbddceb435e13d81601755714e9fSE Android var events = listener2.events; 149255e72915d4cbddceb435e13d81601755714e9fSE Android var listeners = listener2.listeners; 150255e72915d4cbddceb435e13d81601755714e9fSE Android var target; 151255e72915d4cbddceb435e13d81601755714e9fSE Android var listener; 152255e72915d4cbddceb435e13d81601755714e9fSE Android events[events.length] = evt; 153255e72915d4cbddceb435e13d81601755714e9fSE Androidtarget = evt.currentTarget; 154255e72915d4cbddceb435e13d81601755714e9fSE Android 155255e72915d4cbddceb435e13d81601755714e9fSE Android for(var indexN10098 = 0;indexN10098 < listeners.length; indexN10098++) { 156255e72915d4cbddceb435e13d81601755714e9fSE Android listener = listeners[indexN10098]; 157255e72915d4cbddceb435e13d81601755714e9fSE Android target.removeEventListener("foo", listener.handleEvent, false); 158255e72915d4cbddceb435e13d81601755714e9fSE Android 159255e72915d4cbddceb435e13d81601755714e9fSE Android } 160255e72915d4cbddceb435e13d81601755714e9fSE Android } 161255e72915d4cbddceb435e13d81601755714e9fSE Android 162255e72915d4cbddceb435e13d81601755714e9fSE Android/** 163255e72915d4cbddceb435e13d81601755714e9fSE Android* 164255e72915d4cbddceb435e13d81601755714e9fSE AndroidTwo listeners are registered on the same target, each of which will remove both itself and 165255e72915d4cbddceb435e13d81601755714e9fSE Androidthe other on the first event. Only one should see the event since event listeners 166255e72915d4cbddceb435e13d81601755714e9fSE Androidcan never be invoked after being removed. 167255e72915d4cbddceb435e13d81601755714e9fSE Android 168255e72915d4cbddceb435e13d81601755714e9fSE Android* @author Curt Arnold 169255e72915d4cbddceb435e13d81601755714e9fSE Android* @see http://www.w3.org/TR/DOM-Level-2-Events/events#Events-EventTarget-dispatchEvent 170255e72915d4cbddceb435e13d81601755714e9fSE Android* @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']) 171255e72915d4cbddceb435e13d81601755714e9fSE Android*/ 172255e72915d4cbddceb435e13d81601755714e9fSE Androidfunction dispatchEvent13() { 173255e72915d4cbddceb435e13d81601755714e9fSE Android var success; 174255e72915d4cbddceb435e13d81601755714e9fSE Android if(checkInitialization(builder, "dispatchEvent13") != null) return; 175255e72915d4cbddceb435e13d81601755714e9fSE Android var doc; 176255e72915d4cbddceb435e13d81601755714e9fSE Android var target; 177255e72915d4cbddceb435e13d81601755714e9fSE Android var evt; 178255e72915d4cbddceb435e13d81601755714e9fSE Android var preventDefault; 179255e72915d4cbddceb435e13d81601755714e9fSE Android var listeners = new Array(); 180255e72915d4cbddceb435e13d81601755714e9fSE Android 181255e72915d4cbddceb435e13d81601755714e9fSE Android var events = new Array(); 182255e72915d4cbddceb435e13d81601755714e9fSE Android 183255e72915d4cbddceb435e13d81601755714e9fSE Android listener1 = new EventListenerN1003B(events, listeners); 184255e72915d4cbddceb435e13d81601755714e9fSE Android 185255e72915d4cbddceb435e13d81601755714e9fSE Android listener2 = new EventListenerN10074(events, listeners); 186255e72915d4cbddceb435e13d81601755714e9fSE Android 187255e72915d4cbddceb435e13d81601755714e9fSE Android 188255e72915d4cbddceb435e13d81601755714e9fSE Android var docRef = null; 189255e72915d4cbddceb435e13d81601755714e9fSE Android if (typeof(this.doc) != 'undefined') { 190255e72915d4cbddceb435e13d81601755714e9fSE Android docRef = this.doc; 191255e72915d4cbddceb435e13d81601755714e9fSE Android } 192255e72915d4cbddceb435e13d81601755714e9fSE Android doc = load(docRef, "doc", "hc_staff"); 193255e72915d4cbddceb435e13d81601755714e9fSE Android listeners[listeners.length] = listener1; 194255e72915d4cbddceb435e13d81601755714e9fSE Androidlisteners[listeners.length] = listener2; 195255e72915d4cbddceb435e13d81601755714e9fSE Androiddoc.addEventListener("foo", listener1.handleEvent, false); 196255e72915d4cbddceb435e13d81601755714e9fSE Android doc.addEventListener("foo", listener2.handleEvent, false); 197255e72915d4cbddceb435e13d81601755714e9fSE Android evt = doc.createEvent("Events"); 198255e72915d4cbddceb435e13d81601755714e9fSE Android evt.initEvent("foo",true,false); 199255e72915d4cbddceb435e13d81601755714e9fSE Android preventDefault = doc.dispatchEvent(evt); 200255e72915d4cbddceb435e13d81601755714e9fSE Android assertSize("eventCount",1,events); 201255e72915d4cbddceb435e13d81601755714e9fSE Android 202255e72915d4cbddceb435e13d81601755714e9fSE Android} 203255e72915d4cbddceb435e13d81601755714e9fSE Android 204255e72915d4cbddceb435e13d81601755714e9fSE Android 205255e72915d4cbddceb435e13d81601755714e9fSE Android 206255e72915d4cbddceb435e13d81601755714e9fSE Android 207255e72915d4cbddceb435e13d81601755714e9fSE Androidfunction runTest() { 208255e72915d4cbddceb435e13d81601755714e9fSE Android dispatchEvent13(); 209255e72915d4cbddceb435e13d81601755714e9fSE Android} 210255e72915d4cbddceb435e13d81601755714e9fSE Android