87
WorkerContext* EventTarget::toWorkerContext()
94
void forbidEventDispatch()
96
++gEventDispatchForbidden;
99
void allowEventDispatch()
101
if (gEventDispatchForbidden > 0)
102
--gEventDispatchForbidden;
105
bool eventDispatchForbidden()
107
return gEventDispatchForbidden > 0;
132
DedicatedWorkerContext* EventTarget::toDedicatedWorkerContext()
138
#if ENABLE(SHARED_WORKERS)
139
SharedWorker* EventTarget::toSharedWorker()
143
SharedWorkerContext* EventTarget::toSharedWorkerContext()
149
#if ENABLE(NOTIFICATIONS)
150
Notification* EventTarget::toNotification()
156
bool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
158
EventTargetData* d = ensureEventTargetData();
160
pair<EventListenerMap::iterator, bool> result = d->eventListenerMap.add(eventType, EventListenerVector());
161
EventListenerVector& entry = result.first->second;
163
RegisteredEventListener registeredListener(listener, useCapture);
164
if (!result.second) { // pre-existing entry
165
if (entry.find(registeredListener) != notFound) // duplicate listener
169
entry.append(registeredListener);
173
bool EventTarget::removeEventListener(const AtomicString& eventType, EventListener* listener, bool useCapture)
175
EventTargetData* d = eventTargetData();
179
EventListenerMap::iterator result = d->eventListenerMap.find(eventType);
180
if (result == d->eventListenerMap.end())
182
EventListenerVector& entry = result->second;
184
RegisteredEventListener registeredListener(listener, useCapture);
185
size_t index = entry.find(registeredListener);
186
if (index == notFound)
191
d->eventListenerMap.remove(result);
193
// Notify firing events planning to invoke the listener at 'index' that
194
// they have one less listener to invoke.
195
for (size_t i = 0; i < d->firingEventEndIterators.size(); ++i) {
196
if (eventType == *d->firingEventEndIterators[i].eventType && index < *d->firingEventEndIterators[i].value)
197
--*d->firingEventEndIterators[i].value;
203
bool EventTarget::setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener)
205
clearAttributeEventListener(eventType);
208
return addEventListener(eventType, listener, false);
211
EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventType)
213
const EventListenerVector& entry = getEventListeners(eventType);
214
for (size_t i = 0; i < entry.size(); ++i) {
215
if (entry[i].listener->isAttribute())
216
return entry[i].listener.get();
221
bool EventTarget::clearAttributeEventListener(const AtomicString& eventType)
223
EventListener* listener = getAttributeEventListener(eventType);
226
return removeEventListener(eventType, listener, false);
229
bool EventTarget::dispatchEvent(PassRefPtr<Event> event, ExceptionCode& ec)
231
if (!event || event->type().isEmpty()) {
232
ec = EventException::UNSPECIFIED_EVENT_TYPE_ERR;
235
return dispatchEvent(event);
238
bool EventTarget::dispatchEvent(PassRefPtr<Event> event)
240
event->setTarget(this);
241
event->setCurrentTarget(this);
242
event->setEventPhase(Event::AT_TARGET);
243
return fireEventListeners(event.get());
246
bool EventTarget::fireEventListeners(Event* event)
248
ASSERT(!eventDispatchForbidden());
249
ASSERT(event && !event->type().isEmpty());
251
EventTargetData* d = eventTargetData();
255
EventListenerMap::iterator result = d->eventListenerMap.find(event->type());
256
if (result == d->eventListenerMap.end())
258
EventListenerVector& entry = result->second;
260
RefPtr<EventTarget> protect = this;
262
size_t end = entry.size();
263
d->firingEventEndIterators.append(FiringEventEndIterator(&event->type(), &end));
264
for (size_t i = 0; i < end; ++i) {
265
RegisteredEventListener& registeredListener = entry[i];
266
if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener.useCapture)
268
if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.useCapture)
270
// To match Mozilla, the AT_TARGET phase fires both capturing and bubbling
271
// event listeners, even though that violates some versions of the DOM spec.
272
registeredListener.listener->handleEvent(scriptExecutionContext(), event);
274
d->firingEventEndIterators.removeLast();
276
return !event->defaultPrevented();
279
const EventListenerVector& EventTarget::getEventListeners(const AtomicString& eventType)
281
DEFINE_STATIC_LOCAL(EventListenerVector, emptyVector, ());
283
EventTargetData* d = eventTargetData();
286
EventListenerMap::iterator it = d->eventListenerMap.find(eventType);
287
if (it == d->eventListenerMap.end())
292
void EventTarget::removeAllEventListeners()
294
EventTargetData* d = eventTargetData();
297
d->eventListenerMap.clear();
299
// Notify firing events planning to invoke the listener at 'index' that
300
// they have one less listener to invoke.
301
for (size_t i = 0; i < d->firingEventEndIterators.size(); ++i)
302
*d->firingEventEndIterators[i].value = 0;
305
} // namespace WebCore