Chromium Code Reviews| Index: Source/core/dom/EventTarget.cpp |
| diff --git a/Source/core/dom/EventTarget.cpp b/Source/core/dom/EventTarget.cpp |
| index c1ae36707aff494c2b79fe8117f9e86ac912a458..17eaaa93e214ebd61da5ba29eb2062d21147fc1c 100644 |
| --- a/Source/core/dom/EventTarget.cpp |
| +++ b/Source/core/dom/EventTarget.cpp |
| @@ -32,6 +32,7 @@ |
| #include "config.h" |
| #include "core/dom/EventTarget.h" |
| +#include "bindings/v8/DOMWrapperWorld.h" |
| #include "bindings/v8/ScriptController.h" |
| #include "core/dom/Event.h" |
| #include "core/dom/ExceptionCode.h" |
| @@ -103,27 +104,33 @@ bool EventTarget::removeEventListener(const AtomicString& eventType, EventListen |
| return true; |
| } |
| -bool EventTarget::setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener) |
| +bool EventTarget::setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, DOMWrapperWorld* world) |
| { |
| - clearAttributeEventListener(eventType); |
| + clearAttributeEventListener(eventType, world); |
| if (!listener) |
| return false; |
| + ASSERT(listener->world() == world); |
| return addEventListener(eventType, listener, false); |
| } |
| -EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventType) |
| +EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventType, DOMWrapperWorld* world) |
| { |
| const EventListenerVector& entry = getEventListeners(eventType); |
| for (size_t i = 0; i < entry.size(); ++i) { |
| - if (entry[i].listener->isAttribute()) |
| - return entry[i].listener.get(); |
| + if (entry[i].listener->isAttribute()) { |
| + DOMWrapperWorld* listenerWorld = entry[i].listener->world(); |
| + if ((listenerWorld && listenerWorld->isMainWorld() && !world) |
|
adamk
2013/06/13 00:18:09
This is the really ugly part of the current change
abarth-chromium
2013/06/13 00:30:44
We talked a bit about this in person, and we reali
adamk
2013/06/13 18:55:07
Updated the logic somewhat, though not exactly as
|
| + || (listenerWorld == world)) { |
| + return entry[i].listener.get(); |
| + } |
| + } |
| } |
| return 0; |
| } |
| -bool EventTarget::clearAttributeEventListener(const AtomicString& eventType) |
| +bool EventTarget::clearAttributeEventListener(const AtomicString& eventType, DOMWrapperWorld* world) |
| { |
| - EventListener* listener = getAttributeEventListener(eventType); |
| + EventListener* listener = getAttributeEventListener(eventType, world); |
| if (!listener) |
| return false; |
| return removeEventListener(eventType, listener, false); |