Chromium Code Reviews| Index: Source/core/events/EventTarget.cpp |
| diff --git a/Source/core/events/EventTarget.cpp b/Source/core/events/EventTarget.cpp |
| index b03435180c01633c12c9208132be8159a5dc5bf0..7b65c47eb93fc88c3e06aec04ce179c3e41a5e22 100644 |
| --- a/Source/core/events/EventTarget.cpp |
| +++ b/Source/core/events/EventTarget.cpp |
| @@ -57,6 +57,11 @@ EventTargetData::~EventTargetData() |
| { |
| } |
| +DEFINE_TRACE(EventTargetData) |
| +{ |
| + visitor->trace(eventListenerMap); |
| +} |
| + |
| EventTarget::EventTarget() |
| { |
| } |
| @@ -87,7 +92,7 @@ inline LocalDOMWindow* EventTarget::executingWindow() |
| return 0; |
| } |
| -bool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) |
| +bool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, bool useCapture) |
| { |
| if (!listener) |
| return false; |
| @@ -103,7 +108,7 @@ bool EventTarget::addEventListener(const AtomicString& eventType, PassRefPtr<Eve |
| return ensureEventTargetData().eventListenerMap.add(eventType, listener, useCapture); |
| } |
| -bool EventTarget::removeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) |
| +bool EventTarget::removeEventListener(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, bool useCapture) |
| { |
| if (!listener) |
| return false; |
| @@ -141,7 +146,7 @@ bool EventTarget::removeEventListener(const AtomicString& eventType, PassRefPtr< |
| return true; |
| } |
| -bool EventTarget::setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener) |
| +bool EventTarget::setAttributeEventListener(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener) |
| { |
| clearAttributeEventListener(eventType); |
| if (!listener) |
| @@ -151,13 +156,15 @@ bool EventTarget::setAttributeEventListener(const AtomicString& eventType, PassR |
| EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventType) |
| { |
| - const EventListenerVector& entry = getEventListeners(eventType); |
| - for (const auto& eventListener : entry) { |
| + EventListenerVector* listenerVector = getEventListeners(eventType); |
| + if (!listenerVector) |
| + return nullptr; |
| + for (const auto& eventListener : *listenerVector) { |
| EventListener* listener = eventListener.listener.get(); |
| if (listener->isAttribute() && listener->belongsToTheCurrentWorld()) |
| return listener; |
| } |
| - return 0; |
| + return nullptr; |
| } |
| bool EventTarget::clearAttributeEventListener(const AtomicString& eventType) |
| @@ -366,19 +373,12 @@ void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList |
| d->firingEventIterators->removeLast(); |
| } |
| -const EventListenerVector& EventTarget::getEventListeners(const AtomicString& eventType) |
| +EventListenerVector* EventTarget::getEventListeners(const AtomicString& eventType) |
| { |
| - AtomicallyInitializedStaticReference(EventListenerVector, emptyVector, new EventListenerVector); |
|
haraken
2015/07/27 15:07:29
It took me hours to notice this bug... The created
|
| - |
| - EventTargetData* d = eventTargetData(); |
| - if (!d) |
| - return emptyVector; |
| - |
| - EventListenerVector* listenerVector = d->eventListenerMap.find(eventType); |
| - if (!listenerVector) |
| - return emptyVector; |
| - |
| - return *listenerVector; |
| + EventTargetData* data = eventTargetData(); |
| + if (!data) |
| + return nullptr; |
| + return data->eventListenerMap.find(eventType); |
| } |
| Vector<AtomicString> EventTarget::eventTypes() |