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