+2006-06-01 Anders Carlsson <acarlsson@apple.com>
+
+ Reviewed by Maciej.
+
+ http://bugzilla.opendarwin.org/show_bug.cgi?id=9212
+ dispatchEvent13.html crashes under GuardMalloc
+
+ * dom/EventTargetNode.cpp:
+ (WebCore::EventTargetNode::addEventListener):
+ (WebCore::EventTargetNode::removeEventListener):
+ (WebCore::EventTargetNode::handleLocalEvents):
+
+ (WebCore::EventTargetNode::removeHTMLEventListener):
+ (WebCore::EventTargetNode::getHTMLEventListener):
+ * dom/EventTargetNode.h:
+ Make the list of registered event listeners refcount the listeners
+ by using a value list of RefPtr objects.
+
+ Set removed flag to true in removeEventListener
+ Only invoke event listeners if they don't have the removed flag.
+
+ * dom/dom2_eventsimpl.cpp:
+ (WebCore::RegisteredEventListener::RegisteredEventListener):
+ * dom/dom2_eventsimpl.h:
+ Make RegisteredEventListener refcounted.
+
+ (WebCore::RegisteredEventListener::removed):
+ (WebCore::RegisteredEventListener::setRemoved):
+ Add removed flag and getter and setter
+
2006-06-01 Justin Garcia <justin.garcia@apple.com>
Reviewed by harrison
if (type)
document()->addListenerType(type);
- if (!m_regdListeners) {
- m_regdListeners = new DeprecatedPtrList<RegisteredEventListener>;
- m_regdListeners->setAutoDelete(true);
- }
+ if (!m_regdListeners)
+ m_regdListeners = new RegisteredEventListenerList;
// Remove existing identical listener set with identical arguments.
// The DOM2 spec says that "duplicate instances are discarded" in this case.
RegisteredEventListener rl(eventType, listener, useCapture);
- DeprecatedPtrListIterator<RegisteredEventListener> it(*m_regdListeners);
- for (; it.current(); ++it)
- if (*(it.current()) == rl) {
- m_regdListeners->removeRef(it.current());
+ RegisteredEventListenerList::Iterator end = m_regdListeners->end();
+ for (RegisteredEventListenerList::Iterator it = m_regdListeners->begin(); it != end; ++it)
+ if (*(*it).get() == rl) {
+ (*it)->setRemoved(true);
+
+ it = m_regdListeners->remove(it);
// removed last
if (m_regdListeners->isEmpty() && !inDocument())
document()->unregisterDisconnectedNodeWithEventListeners(this);
if (disabled() && evt->isMouseEvent())
return;
- DeprecatedPtrList<RegisteredEventListener> listenersCopy = *m_regdListeners;
- DeprecatedPtrListIterator<RegisteredEventListener> it(listenersCopy);
- for (; it.current(); ++it)
- if (it.current()->eventType() == evt->type() && it.current()->useCapture() == useCapture)
- it.current()->listener()->handleEvent(evt, false);
+ RegisteredEventListenerList listenersCopy = *m_regdListeners;
+ RegisteredEventListenerList::Iterator end = listenersCopy.end();
+
+ for (RegisteredEventListenerList::Iterator it = listenersCopy.begin(); it != end; ++it)
+ if ((*it)->eventType() == evt->type() && (*it)->useCapture() == useCapture && !(*it)->removed())
+ (*it)->listener()->handleEvent(evt, false);
}
bool EventTargetNode::dispatchGenericEvent(PassRefPtr<Event> e, ExceptionCode&, bool tempEvent)
if (!m_regdListeners) // nothing to remove
return;
- DeprecatedPtrListIterator<RegisteredEventListener> it(*m_regdListeners);
- for (; it.current(); ++it)
- if (it.current()->eventType() == eventType && it.current()->listener()->isHTMLEventListener()) {
- m_regdListeners->removeRef(it.current());
+ RegisteredEventListenerList::Iterator end = m_regdListeners->end();
+ for (RegisteredEventListenerList::Iterator it = m_regdListeners->begin(); it != end; ++it)
+ if ((*it)->eventType() == eventType && (*it)->listener()->isHTMLEventListener()) {
+ it = m_regdListeners->remove(it);
// removed last
if (m_regdListeners->isEmpty() && !inDocument())
document()->unregisterDisconnectedNodeWithEventListeners(this);
if (!m_regdListeners)
return 0;
- DeprecatedPtrListIterator<RegisteredEventListener> it(*m_regdListeners);
- for (; it.current(); ++it)
- if (it.current()->eventType() == eventType && it.current()->listener()->isHTMLEventListener())
- return it.current()->listener();
+ RegisteredEventListenerList::Iterator end = m_regdListeners->end();
+ for (RegisteredEventListenerList::Iterator it = m_regdListeners->begin(); it != end; ++it)
+ if ((*it)->eventType() == eventType && (*it)->listener()->isHTMLEventListener())
+ return (*it)->listener();
return 0;
}
int m_wheelDelta;
};
-class RegisteredEventListener {
+class RegisteredEventListener : public Shared<RegisteredEventListener> {
public:
RegisteredEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
const AtomicString &eventType() const { return m_eventType; }
EventListener *listener() const { return m_listener.get(); }
bool useCapture() const { return m_useCapture; }
-
+ bool removed() const { return m_removed; }
+ void setRemoved(bool removed) { m_removed = removed; }
+
private:
AtomicString m_eventType;
RefPtr<EventListener> m_listener;
bool m_useCapture;
+ bool m_removed;
};
bool operator==(const RegisteredEventListener&, const RegisteredEventListener&);