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