| Index: Source/WebCore/bindings/dart/DartDOMWrapper.h
|
| diff --git a/Source/WebCore/bindings/dart/DartDOMWrapper.h b/Source/WebCore/bindings/dart/DartDOMWrapper.h
|
| index 763b68ca6106c4df881705d83ee909806e02f066..78168d59724560fde840889d14573965f3e15634 100644
|
| --- a/Source/WebCore/bindings/dart/DartDOMWrapper.h
|
| +++ b/Source/WebCore/bindings/dart/DartDOMWrapper.h
|
| @@ -83,6 +83,7 @@ public:
|
| Dart_Handle persistentWrapperHandle = DartUtilities::createPrologueWeakPersistentHandle(wrapper, domObject, &wrapperWeakCallback<BindingsClass>);
|
| Traits::MapTraits::domMap(domData)->set(domObject, persistentWrapperHandle);
|
| Traits::ActiveTraits::setWrapper(domData, domObject, persistentWrapperHandle);
|
| + Traits::EventTargetTraits::setWrapper(domData, domObject, persistentWrapperHandle);
|
| domObject->ref();
|
| return wrapper;
|
| }
|
| @@ -188,6 +189,7 @@ private:
|
| ASSERT(DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->contains(domObject));
|
| Traits::MapTraits::domMap(domData)->remove(domObject);
|
| Traits::ActiveTraits::removeWrapper(domData, domObject);
|
| + Traits::EventTargetTraits::removeWrapper(domData, domObject);
|
| domObject->deref();
|
| }
|
| };
|
| @@ -227,10 +229,35 @@ struct DartDOMWrapperActiveTraits<BindingsClass, true> {
|
| }
|
| };
|
|
|
| +template<class BindingsClass, bool isEventTarget>
|
| +struct DartDOMWrapperEventTargetTraits {};
|
| +
|
| +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;
|
| };
|
|
|
| struct DartMessagePort;
|
| @@ -242,6 +269,7 @@ struct DartDOMWrapperTraits<DartMessagePort> {
|
| };
|
| typedef MessagePortMapTraits MapTraits;
|
| typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits;
|
| + typedef DartDOMWrapperEventTargetTraits<DartMessagePort, true> EventTargetTraits;
|
| };
|
|
|
| }
|
|
|