18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2001 Dirk Mueller (mueller@kde.org)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventTarget.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Event.h"
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "EventException.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/StdLibExtras.h>
38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace WTF;
40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int gEventDispatchForbidden = 0;
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid forbidEventDispatch()
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!isMainThread())
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ++gEventDispatchForbidden;
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid allowEventDispatch()
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!isMainThread())
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (gEventDispatchForbidden > 0)
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        --gEventDispatchForbidden;
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool eventDispatchForbidden()
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!isMainThread())
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return gEventDispatchForbidden > 0;
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // NDEBUG
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochEventTargetData::EventTargetData()
70a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
72a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
73643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockEventTargetData::~EventTargetData()
74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    deleteAllValues(eventListenerMap);
76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEventTarget::~EventTarget()
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockEventSource* EventTarget::toEventSource()
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return 0;
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianNode* EventTarget::toNode()
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
925f1ab04193ad0130ca8204aadaceae083aca9881Feng QianDOMWindow* EventTarget::toDOMWindow()
935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return 0;
955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectXMLHttpRequest* EventTarget::toXMLHttpRequest()
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectXMLHttpRequestUpload* EventTarget::toXMLHttpRequestUpload()
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OFFLINE_WEB_APPLICATIONS)
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDOMApplicationCache* EventTarget::toDOMApplicationCache()
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGElementInstance* EventTarget::toSVGElementInstance()
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if ENABLE(WEB_AUDIO)
1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochAudioContext* EventTarget::toAudioContext()
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return 0;
1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerJavaScriptAudioNode* EventTarget::toJavaScriptAudioNode()
1286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
1296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return 0;
1306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
1316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif
1326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WEB_SOCKETS)
134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebSocket* EventTarget::toWebSocket()
135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return 0;
137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMessagePort* EventTarget::toMessagePort()
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WORKERS)
146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWorker* EventTarget::toWorker()
147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return 0;
149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochDedicatedWorkerContext* EventTarget::toDedicatedWorkerContext()
1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(SHARED_WORKERS)
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochSharedWorker* EventTarget::toSharedWorker()
1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochSharedWorkerContext* EventTarget::toSharedWorkerContext()
163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return 0;
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(NOTIFICATIONS)
169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockNotification* EventTarget::toNotification()
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return 0;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
175dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB)
17621939df44de1705786c545cd1bf519d47250322dBen MurdochFileReader* EventTarget::toFileReader()
17721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
17821939df44de1705786c545cd1bf519d47250322dBen Murdoch    return 0;
17921939df44de1705786c545cd1bf519d47250322dBen Murdoch}
18021939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
18168513a70bcd92384395513322f1b801e7bf9c729Steve Block#if ENABLE(FILE_SYSTEM)
182e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockFileWriter* EventTarget::toFileWriter()
183e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
184e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return 0;
185e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
186e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif
18721939df44de1705786c545cd1bf519d47250322dBen Murdoch
1886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if ENABLE(INDEXED_DATABASE)
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockIDBDatabase* EventTarget::toIDBDatabase()
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return 0;
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenIDBRequest* EventTarget::toIDBRequest()
1946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return 0;
1966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
197e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockIDBTransaction* EventTarget::toIDBTransaction()
198e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
199e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return 0;
200e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochIDBVersionChangeRequest* EventTarget::toIDBVersionChangeRequest()
20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
20381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return 0;
20481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
2056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif
2066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventTargetData* d = ensureEventTargetData();
210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    pair<EventListenerMap::iterator, bool> result = d->eventListenerMap.add(eventType, 0);
212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    EventListenerVector*& entry = result.first->second;
213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const bool isNewEntry = result.second;
214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (isNewEntry)
215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        entry = new EventListenerVector();
216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
217231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RegisteredEventListener registeredListener(listener, useCapture);
218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!isNewEntry) {
219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (entry->find(registeredListener) != notFound) // duplicate listener
220231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return false;
221231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    entry->append(registeredListener);
224231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return true;
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool EventTarget::removeEventListener(const AtomicString& eventType, EventListener* listener, bool useCapture)
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventTargetData* d = eventTargetData();
230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!d)
231231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
232231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
233231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventListenerMap::iterator result = d->eventListenerMap.find(eventType);
234231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (result == d->eventListenerMap.end())
235231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    EventListenerVector* entry = result->second;
237231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RegisteredEventListener registeredListener(listener, useCapture);
239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    size_t index = entry->find(registeredListener);
240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (index == notFound)
241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    entry->remove(index);
244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (entry->isEmpty()) {
245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        delete entry;
246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        d->eventListenerMap.remove(result);
247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Notify firing events planning to invoke the listener at 'index' that
250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // they have one less listener to invoke.
251cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    for (size_t i = 0; i < d->firingEventIterators.size(); ++i) {
252cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (eventType != d->firingEventIterators[i].eventType)
253cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            continue;
254cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
255cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (index >= d->firingEventIterators[i].end)
256cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            continue;
257cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
258cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        --d->firingEventIterators[i].end;
259cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (index <= d->firingEventIterators[i].iterator)
260cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            --d->firingEventIterators[i].iterator;
261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return true;
264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool EventTarget::setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener)
267231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    clearAttributeEventListener(eventType);
269231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!listener)
270231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
271231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return addEventListener(eventType, listener, false);
272231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
273231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
274231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockEventListener* EventTarget::getAttributeEventListener(const AtomicString& eventType)
275231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
276231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    const EventListenerVector& entry = getEventListeners(eventType);
277231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    for (size_t i = 0; i < entry.size(); ++i) {
278231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (entry[i].listener->isAttribute())
279231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return entry[i].listener.get();
280231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
281231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return 0;
282231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
283231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
284231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool EventTarget::clearAttributeEventListener(const AtomicString& eventType)
285231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventListener* listener = getAttributeEventListener(eventType);
287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!listener)
288231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return removeEventListener(eventType, listener, false);
290231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool EventTarget::dispatchEvent(PassRefPtr<Event> event, ExceptionCode& ec)
293231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
294231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!event || event->type().isEmpty()) {
295231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ec = EventException::UNSPECIFIED_EVENT_TYPE_ERR;
296231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
297231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
298cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
299cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!scriptExecutionContext())
300cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return false;
301cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
302231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return dispatchEvent(event);
303231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
304231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
305231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool EventTarget::dispatchEvent(PassRefPtr<Event> event)
306231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
307231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event->setTarget(this);
308231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event->setCurrentTarget(this);
309231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event->setEventPhase(Event::AT_TARGET);
310231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return fireEventListeners(event.get());
311231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
312231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
31381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid EventTarget::uncaughtExceptionInEventHandler()
31481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
31581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
31681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
317231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool EventTarget::fireEventListeners(Event* event)
318231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
319231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(!eventDispatchForbidden());
320231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(event && !event->type().isEmpty());
321231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
322231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventTargetData* d = eventTargetData();
323231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!d)
324231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
325231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
326231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventListenerMap::iterator result = d->eventListenerMap.find(event->type());
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (result != d->eventListenerMap.end())
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        fireEventListeners(event, d, *result->second);
32991f41286e33b387859e4841711f3054bcf75c748John Reck
33091f41286e33b387859e4841711f3054bcf75c748John Reck#if ENABLE(TOUCH_EVENTS) && PLATFORM(ANDROID)
33191f41286e33b387859e4841711f3054bcf75c748John Reck    if (event->isTouchEvent() && !event->hitTouchHandler()) {
33291f41286e33b387859e4841711f3054bcf75c748John Reck        // Check for touchmove or touchend to see if we can skip
33391f41286e33b387859e4841711f3054bcf75c748John Reck        // the rest of the stream (we always get touchstart, don't need to check that)
33491f41286e33b387859e4841711f3054bcf75c748John Reck        if (d->eventListenerMap.contains(eventNames().touchmoveEvent)
33591f41286e33b387859e4841711f3054bcf75c748John Reck                || d->eventListenerMap.contains(eventNames().touchendEvent))
33691f41286e33b387859e4841711f3054bcf75c748John Reck            event->setHitTouchHandler();
33791f41286e33b387859e4841711f3054bcf75c748John Reck    }
33891f41286e33b387859e4841711f3054bcf75c748John Reck#endif
339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return !event->defaultPrevented();
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventListenerVector& entry)
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
345231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RefPtr<EventTarget> protect = this;
346231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
34791f41286e33b387859e4841711f3054bcf75c748John Reck#if ENABLE(TOUCH_EVENTS) && PLATFORM(ANDROID)
34891f41286e33b387859e4841711f3054bcf75c748John Reck    if (event->isTouchEvent())
34991f41286e33b387859e4841711f3054bcf75c748John Reck        event->setHitTouchHandler();
35091f41286e33b387859e4841711f3054bcf75c748John Reck#endif
35191f41286e33b387859e4841711f3054bcf75c748John Reck
352cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // Fire all listeners registered for this event. Don't fire listeners removed
353cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // during event dispatch. Also, don't fire event listeners added during event
354cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // dispatch. Conveniently, all new event listeners will be added after 'end',
355cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // so iterating to 'end' naturally excludes new event listeners.
356cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
357cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    size_t i = 0;
358231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    size_t end = entry.size();
359cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    d->firingEventIterators.append(FiringEventIterator(event->type(), i, end));
360cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    for ( ; i < end; ++i) {
361231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        RegisteredEventListener& registeredListener = entry[i];
362231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener.useCapture)
363231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            continue;
364231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.useCapture)
365231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            continue;
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // If stopImmediatePropagation has been called, we just break out immediately, without
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // handling any more events on this target.
369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (event->immediatePropagationStopped())
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
372231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // To match Mozilla, the AT_TARGET phase fires both capturing and bubbling
373231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // event listeners, even though that violates some versions of the DOM spec.
374231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        registeredListener.listener->handleEvent(scriptExecutionContext(), event);
375231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
376cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    d->firingEventIterators.removeLast();
377231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
378231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
379231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockconst EventListenerVector& EventTarget::getEventListeners(const AtomicString& eventType)
380231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
381231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(EventListenerVector, emptyVector, ());
382231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
383231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventTargetData* d = eventTargetData();
384231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!d)
385231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return emptyVector;
386231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventListenerMap::iterator it = d->eventListenerMap.find(eventType);
387231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (it == d->eventListenerMap.end())
388231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return emptyVector;
389643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return *it->second;
390231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
391231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
392231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid EventTarget::removeAllEventListeners()
393231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
394231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventTargetData* d = eventTargetData();
395231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!d)
396231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
397643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    deleteAllValues(d->eventListenerMap);
398231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    d->eventListenerMap.clear();
399231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
400231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Notify firing events planning to invoke the listener at 'index' that
401231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // they have one less listener to invoke.
402cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    for (size_t i = 0; i < d->firingEventIterators.size(); ++i) {
403cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        d->firingEventIterators[i].iterator = 0;
404cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        d->firingEventIterators[i].end = 0;
405cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} // namespace WebCore
409