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

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: Patch for landing 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
« no previous file with comments | « Source/core/dom/EventTarget.h ('k') | Source/core/dom/MessagePort.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/dom/EventTarget.cpp
diff --git a/Source/core/dom/EventTarget.cpp b/Source/core/dom/EventTarget.cpp
index c1ae36707aff494c2b79fe8117f9e86ac912a458..c06d6dd6787d6a18b59b3f932a0175312c225c04 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,38 @@ 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* isolatedWorld)
{
- clearAttributeEventListener(eventType);
+ clearAttributeEventListener(eventType, isolatedWorld);
if (!listener)
return false;
return addEventListener(eventType, listener, false);
}
-EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventType)
+EventListener* EventTarget::getAttributeEventListener(const AtomicString& eventType, DOMWrapperWorld* isolatedWorld)
{
const EventListenerVector& entry = getEventListeners(eventType);
for (size_t i = 0; i < entry.size(); ++i) {
- if (entry[i].listener->isAttribute())
- return entry[i].listener.get();
+ EventListener* listener = entry[i].listener.get();
+ if (listener->isAttribute()) {
+ DOMWrapperWorld* listenerWorld = listener->world();
+ // Worker listener
+ if (!listenerWorld) {
+ ASSERT(!isolatedWorld);
+ return listener;
+ }
+ if (listenerWorld->isMainWorld() && !isolatedWorld)
+ return listener;
+ if (listenerWorld == isolatedWorld)
+ return listener;
+ }
}
return 0;
}
-bool EventTarget::clearAttributeEventListener(const AtomicString& eventType)
+bool EventTarget::clearAttributeEventListener(const AtomicString& eventType, DOMWrapperWorld* isolatedWorld)
{
- EventListener* listener = getAttributeEventListener(eventType);
+ EventListener* listener = getAttributeEventListener(eventType, isolatedWorld);
if (!listener)
return false;
return removeEventListener(eventType, listener, false);
« no previous file with comments | « Source/core/dom/EventTarget.h ('k') | Source/core/dom/MessagePort.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698