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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp

Issue 1472823002: Couple V8AbstractEventListener's lifetime to the V8 listeners lifetime (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updates Created 5 years, 1 month 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: third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp b/third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp
index a8c1c700380a0fd7413c5298a9c25f9b923ce0f2..524680efb52f1c501fc519072797b339a1023c76 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8AbstractEventListener.cpp
@@ -48,19 +48,17 @@ V8AbstractEventListener::V8AbstractEventListener(bool isAttribute, DOMWrapperWor
, m_isAttribute(isAttribute)
, m_world(world)
, m_isolate(isolate)
+ , m_workerGlobalScope(nullptr)
{
if (isMainThread())
InstanceCounters::incrementCounter(InstanceCounters::JSEventListenerCounter);
+ else
+ m_workerGlobalScope = toWorkerGlobalScope(currentExecutionContext(isolate));
}
V8AbstractEventListener::~V8AbstractEventListener()
{
- if (!m_listener.isEmpty()) {
- v8::HandleScope scope(isolate());
- // We can't use a ScriptState::Scope here as the per-context data might already be gone at this point.
- v8::Context::Scope contextScope(m_scriptStateForListener->context());
- V8EventListenerList::clearWrapper(m_listener.newLocal(isolate()), m_isAttribute, m_scriptStateForListener.get());
- }
+ ASSERT(m_listener.isEmpty());
if (isMainThread())
InstanceCounters::decrementCounter(InstanceCounters::JSEventListenerCounter);
}
@@ -102,11 +100,21 @@ void V8AbstractEventListener::handleEvent(ScriptState* scriptState, Event* event
invokeEventHandler(scriptState, event, v8::Local<v8::Value>::New(isolate(), jsEvent));
}
-void V8AbstractEventListener::setListenerObject(v8::Local<v8::Object> listener, ScriptState* scriptState)
+void V8AbstractEventListener::setListenerObject(v8::Local<v8::Object> listener)
{
+ ASSERT(m_listener.isEmpty());
+ // Balanced in secondWeakCallback xor clearListenerObject.
+ if (m_workerGlobalScope) {
+ m_workerGlobalScope->registerEventListener(this);
+ } else {
+#if ENABLE(OILPAN)
+ m_keepAlive = this;
+#else
+ ref();
+#endif
+ }
m_listener.set(isolate(), listener);
m_listener.setWeak(this, &setWeakCallback);
- m_scriptStateForListener = scriptState;
}
void V8AbstractEventListener::invokeEventHandler(ScriptState* scriptState, Event* event, v8::Local<v8::Value> jsEvent)
@@ -184,10 +192,47 @@ bool V8AbstractEventListener::belongsToTheCurrentWorld() const
return ScriptState::hasCurrentScriptState(isolate()) && &world() == &DOMWrapperWorld::current(isolate());
}
-void V8AbstractEventListener::setWeakCallback(const v8::WeakCallbackInfo<V8AbstractEventListener> &data)
+void V8AbstractEventListener::clearListenerObject()
+{
+ if (!hasExistingListenerObject())
+ return;
+ m_listener.clear();
+ if (m_workerGlobalScope) {
+ m_workerGlobalScope->deregisterEventListener(this);
+ } else {
+#if ENABLE(OILPAN)
+ m_keepAlive.clear();
+#else
+ deref();
+#endif
+ }
+}
+
+void V8AbstractEventListener::setWeakCallback(const v8::WeakCallbackInfo<V8AbstractEventListener>& data)
{
data.GetParameter()->m_listener.clear();
- data.GetParameter()->m_scriptStateForListener.clear();
+ data.SetSecondPassCallback(secondWeakCallback);
+}
+
+void V8AbstractEventListener::secondWeakCallback(const v8::WeakCallbackInfo<V8AbstractEventListener>& data)
+{
+ if (data.GetParameter()->m_workerGlobalScope) {
+ data.GetParameter()->m_workerGlobalScope->deregisterEventListener(data.GetParameter());
+ } else {
+#if ENABLE(OILPAN)
+ data.GetParameter()->m_keepAlive.clear();
+#else
+ data.GetParameter()->deref();
+#endif
+ }
+}
+
+DEFINE_TRACE(V8AbstractEventListener)
+{
+#if ENABLE(OILPAN)
+ visitor->trace(m_workerGlobalScope);
+#endif
+ EventListener::trace(visitor);
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698