<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="test-to-html.xsl" type="text/xml"?>
<!--

Copyright (c) 2001 World Wide Web Consortium, 
(Massachusetts Institute of Technology, Institut National de
Recherche en Informatique et en Automatique, Keio University).  All 
Rights Reserved.  This program is distributed under the W3C's Software
Intellectual Property License.  This program is distributed in the 
hope that it will be useful, but WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.  

See W3C License http://www.w3.org/Consortium/Legal/ for more details.

-->
<!DOCTYPE test SYSTEM "dom2.dtd">
<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="dispatchEvent13">
<metadata>
<title>dispatchEvent13</title>
<creator>Curt Arnold</creator>
<description>
Two listeners are registered on the same target, each of which will remove both itself and 
the other on the first event.  Only one should see the event since event listeners
can never be invoked after being removed.
</description>
<date qualifier="created">2002-05-30</date>
<subject resource="http://www.w3.org/TR/DOM-Level-2-Events/events#Events-EventTarget-dispatchEvent"/>
<subject resource="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'])"/>
</metadata>
<var name="doc" type="Document"/>
<var name="target" type="EventTarget"/>
<var name="evt" type="Event"/>
<var name="preventDefault" type="boolean"/>
<var name="listeners" type="List"/>
<var name="events" type="List"/>
<!--  definition of private class instance that implements EventListener   -->
<var name="listener1" type="EventListener">
    <!--   instance scope variables, 
           value attributes are passed via constructor   -->
    <var name="events" type="List" value="events"/>
    <var name="listeners" type="List" value="listeners"/>
    <!--    implementation of handleEvent method
                any parameters (in this case 'evt') are
                predefined   -->
    <handleEvent>
        <!--  method scope variables   -->
        <var name="target" type="EventTarget"/>
        <var name="listener" type="EventListener"/>
        <!--  add event to the collection   -->
        <append collection="events" item="evt"/>
        <!--  remove this and the other listener    -->
        <currentTarget var="target" obj="evt"/>
        <for-each collection="listeners" member="listener">
            <removeEventListener obj="target" type='"foo"' listener="listener" useCapture="false"/>
        </for-each> 
    </handleEvent>
</var>
<!--   identical implementation of EventListener    -->
<var name="listener2" type="EventListener">
    <var name="events" type="List" value="events"/>
    <var name="listeners" type="List" value="listeners"/>
    <handleEvent>
        <var name="target" type="EventTarget"/>
        <var name="listener" type="EventListener"/>
        <!--  add event to the collection   -->
        <append collection="events" item="evt"/>
        <!--  remove this and the other listener    -->
        <currentTarget var="target" obj="evt"/>
        <for-each collection="listeners" member="listener">
            <removeEventListener obj="target" type='"foo"' listener="listener" useCapture="false"/>
        </for-each> 
    </handleEvent>
</var>
<load var="doc" href="hc_staff" willBeModified="true"/>
<append collection="listeners" item="listener1"/>
<append collection="listeners" item="listener2"/>
<addEventListener obj="doc" type='"foo"' listener="listener1" useCapture="false"/>
<addEventListener obj="doc" type='"foo"' listener="listener2" useCapture="false"/>
<createEvent var="evt" obj="doc" eventType='"Events"'/>
<initEvent obj="evt" eventTypeArg='"foo"' canBubbleArg="true" cancelableArg="false"/>
<dispatchEvent var="preventDefault" obj="doc" evt="evt"/>
<assertSize id="eventCount" collection="events" size="1"/>
</test>
