Chromium Code Reviews| 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; |
| }; |
| } |