Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(683)

Unified Diff: Source/core/dom/EventTarget.cpp

Issue 16904002: Avoid leaking objects between isolated worlds via attribute event listeners (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698