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: Source/WebCore/bindings/dart/DartDOMWrapper.h

Issue 10745003: Properly retain non-node event listeners. (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: Created 8 years, 5 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/WebCore/bindings/dart/DartDOMData.h ('k') | Source/WebCore/bindings/dart/DartGCController.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/WebCore/bindings/dart/DartDOMWrapper.h
diff --git a/Source/WebCore/bindings/dart/DartDOMWrapper.h b/Source/WebCore/bindings/dart/DartDOMWrapper.h
index 01d17da9cc3e2cb2fd45865a8c81800c64820e21..e95a36da4639b38552781da3eeda35e172f109b0 100644
--- a/Source/WebCore/bindings/dart/DartDOMWrapper.h
+++ b/Source/WebCore/bindings/dart/DartDOMWrapper.h
@@ -81,6 +81,7 @@ public:
Dart_Handle persistentWrapperHandle = DartUtilities::createPrologueWeakPersistentHandle(wrapper, domObject, &wrapperWeakCallback<BindingsClass>);
DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->set(domObject, persistentWrapperHandle);
DartDOMWrapperTraits<BindingsClass>::ActiveTraits::setWrapper(domData, domObject, persistentWrapperHandle);
+ DartDOMWrapperTraits<BindingsClass>::EventTargetTraits::setWrapper(domData, domObject, persistentWrapperHandle);
domObject->ref();
return wrapper;
}
@@ -185,6 +186,7 @@ private:
ASSERT(DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->contains(domObject));
DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->remove(domObject);
DartDOMWrapperTraits<BindingsClass>::ActiveTraits::removeWrapper(domData, domObject);
+ DartDOMWrapperTraits<BindingsClass>::EventTargetTraits::removeWrapper(domData, domObject);
domObject->deref();
}
};
@@ -224,10 +226,35 @@ struct DartDOMWrapperActiveTraits<BindingsClass, true> {
}
};
+template<class BindingsClass, bool isEventTarget>
+struct DartDOMWrapperEventTargetTraits {};
Anton Muhin 2012/07/09 16:11:08 ditto for too complicated way to customize behavio
podivilov 2012/07/10 08:35:45 I don't know any simpler way to achieve that. Cond
Anton Muhin 2012/07/10 08:39:26 Yes, you're right, sorry. On 2012/07/10 08:35:45,
+
+template<class BindingsClass>
+struct DartDOMWrapperEventTargetTraits<BindingsClass, false> {
+ static void setWrapper(DartDOMData*, typename BindingsClass::NativeType*, Dart_Handle) {}
+ static void removeWrapper(DartDOMData*, typename BindingsClass::NativeType*) {}
+};
+
+template<class BindingsClass>
+struct DartDOMWrapperEventTargetTraits<BindingsClass, true> {
+ static void setWrapper(DartDOMData* domData, typename BindingsClass::NativeType* domObject, Dart_Handle wrapper)
+ {
+ domData->eventTargetMap()->set(domObject, wrapper);
+ }
+
+ static void removeWrapper(DartDOMData* domData, typename BindingsClass::NativeType* domObject)
+ {
+ domData->eventTargetMap()->remove(domObject);
+ }
+};
+
template<class BindingsClass>
struct DartDOMWrapperTraits {
typedef DartDOMWrapperMapTraits<BindingsClass::isNode> MapTraits;
typedef DartDOMWrapperActiveTraits<BindingsClass, BindingsClass::isActive> ActiveTraits;
+ // Putting all the nodes into additional map is expensive. Instead, we have
+ // special treatment of node event listeners in GC prologue.
+ typedef DartDOMWrapperEventTargetTraits<BindingsClass, BindingsClass::isEventTarget && !BindingsClass::isNode> EventTargetTraits;
};
class DartMessagePort;
@@ -239,6 +266,7 @@ struct DartDOMWrapperTraits<DartMessagePort> {
};
typedef MessagePortMapTraits MapTraits;
typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits;
+ typedef DartDOMWrapperEventTargetTraits<DartMessagePort, true> EventTargetTraits;
};
}
« no previous file with comments | « Source/WebCore/bindings/dart/DartDOMData.h ('k') | Source/WebCore/bindings/dart/DartGCController.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698