diff options
Diffstat (limited to 'WebCore/dom/EventTarget.cpp')
-rw-r--r-- | WebCore/dom/EventTarget.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/WebCore/dom/EventTarget.cpp b/WebCore/dom/EventTarget.cpp index 694e78a..65d751a 100644 --- a/WebCore/dom/EventTarget.cpp +++ b/WebCore/dom/EventTarget.cpp @@ -1,6 +1,4 @@ /* - * This file is part of the DOM implementation for KDE. - * * Copyright (C) 1999 Lars Knoll (knoll@kde.org) * (C) 1999 Antti Koivisto (koivisto@kde.org) * (C) 2001 Dirk Mueller (mueller@kde.org) @@ -68,6 +66,11 @@ bool eventDispatchForbidden() } #endif // NDEBUG +EventTargetData::~EventTargetData() +{ + deleteAllValues(eventListenerMap); +} + EventTarget::~EventTarget() { } @@ -157,16 +160,19 @@ bool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtr<Eve { EventTargetData* d = ensureEventTargetData(); - pair<EventListenerMap::iterator, bool> result = d->eventListenerMap.add(eventType, EventListenerVector()); - EventListenerVector& entry = result.first->second; + pair<EventListenerMap::iterator, bool> result = d->eventListenerMap.add(eventType, 0); + EventListenerVector*& entry = result.first->second; + const bool isNewEntry = result.second; + if (isNewEntry) + entry = new EventListenerVector(); RegisteredEventListener registeredListener(listener, useCapture); - if (!result.second) { // pre-existing entry - if (entry.find(registeredListener) != notFound) // duplicate listener + if (!isNewEntry) { + if (entry->find(registeredListener) != notFound) // duplicate listener return false; } - entry.append(registeredListener); + entry->append(registeredListener); return true; } @@ -179,16 +185,18 @@ bool EventTarget::removeEventListener(const AtomicString& eventType, EventListen EventListenerMap::iterator result = d->eventListenerMap.find(eventType); if (result == d->eventListenerMap.end()) return false; - EventListenerVector& entry = result->second; + EventListenerVector* entry = result->second; RegisteredEventListener registeredListener(listener, useCapture); - size_t index = entry.find(registeredListener); + size_t index = entry->find(registeredListener); if (index == notFound) return false; - entry.remove(index); - if (!entry.size()) + entry->remove(index); + if (entry->isEmpty()) { + delete entry; d->eventListenerMap.remove(result); + } // Notify firing events planning to invoke the listener at 'index' that // they have one less listener to invoke. @@ -266,7 +274,7 @@ bool EventTarget::fireEventListeners(Event* event) EventListenerMap::iterator result = d->eventListenerMap.find(event->type()); if (result == d->eventListenerMap.end()) return false; - EventListenerVector& entry = result->second; + EventListenerVector& entry = *result->second; RefPtr<EventTarget> protect = this; @@ -303,7 +311,7 @@ const EventListenerVector& EventTarget::getEventListeners(const AtomicString& ev EventListenerMap::iterator it = d->eventListenerMap.find(eventType); if (it == d->eventListenerMap.end()) return emptyVector; - return it->second; + return *it->second; } void EventTarget::removeAllEventListeners() @@ -311,6 +319,7 @@ void EventTarget::removeAllEventListeners() EventTargetData* d = eventTargetData(); if (!d) return; + deleteAllValues(d->eventListenerMap); d->eventListenerMap.clear(); // Notify firing events planning to invoke the listener at 'index' that |