| OLD | NEW |
| 1 // Copyright 2011, Google Inc. | 1 // Copyright 2011, Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 DartDOMData* domData = DartIsolate::currentDOMData(); | 76 DartDOMData* domData = DartIsolate::currentDOMData(); |
| 77 Dart_Handle wrapper = Traits::MapTraits::domMap(domData)->get(domObject)
; | 77 Dart_Handle wrapper = Traits::MapTraits::domMap(domData)->get(domObject)
; |
| 78 if (wrapper) | 78 if (wrapper) |
| 79 return wrapper; | 79 return wrapper; |
| 80 | 80 |
| 81 wrapper = instantiateWrapper(className); | 81 wrapper = instantiateWrapper(className); |
| 82 writeNativePointer(wrapper, kNativeImplementationIndex, domObject); | 82 writeNativePointer(wrapper, kNativeImplementationIndex, domObject); |
| 83 Dart_Handle persistentWrapperHandle = DartUtilities::createPrologueWeakP
ersistentHandle(wrapper, domObject, &wrapperWeakCallback<BindingsClass>); | 83 Dart_Handle persistentWrapperHandle = DartUtilities::createPrologueWeakP
ersistentHandle(wrapper, domObject, &wrapperWeakCallback<BindingsClass>); |
| 84 Traits::MapTraits::domMap(domData)->set(domObject, persistentWrapperHand
le); | 84 Traits::MapTraits::domMap(domData)->set(domObject, persistentWrapperHand
le); |
| 85 Traits::ActiveTraits::setWrapper(domData, domObject, persistentWrapperHa
ndle); | 85 Traits::ActiveTraits::setWrapper(domData, domObject, persistentWrapperHa
ndle); |
| 86 Traits::EventTargetTraits::setWrapper(domData, domObject, persistentWrap
perHandle); |
| 86 domObject->ref(); | 87 domObject->ref(); |
| 87 return wrapper; | 88 return wrapper; |
| 88 } | 89 } |
| 89 | 90 |
| 90 template<class BindingsClass> | 91 template<class BindingsClass> |
| 91 static Dart_Handle vectorToDart(const Vector< RefPtr<typename BindingsClass:
:NativeType> >& vector) | 92 static Dart_Handle vectorToDart(const Vector< RefPtr<typename BindingsClass:
:NativeType> >& vector) |
| 92 { | 93 { |
| 93 Dart_Handle list = Dart_NewList(vector.size()); | 94 Dart_Handle list = Dart_NewList(vector.size()); |
| 94 if (Dart_IsError(list)) | 95 if (Dart_IsError(list)) |
| 95 return list; | 96 return list; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 | 182 |
| 182 template <class BindingsClass> | 183 template <class BindingsClass> |
| 183 static void wrapperWeakCallback(Dart_Handle, void* peer) | 184 static void wrapperWeakCallback(Dart_Handle, void* peer) |
| 184 { | 185 { |
| 185 typedef DartDOMWrapperTraits<BindingsClass> Traits; | 186 typedef DartDOMWrapperTraits<BindingsClass> Traits; |
| 186 DartDOMData* domData = DartIsolate::currentDOMData(); | 187 DartDOMData* domData = DartIsolate::currentDOMData(); |
| 187 typename BindingsClass::NativeType* domObject = static_cast<typename Bin
dingsClass::NativeType*>(peer); | 188 typename BindingsClass::NativeType* domObject = static_cast<typename Bin
dingsClass::NativeType*>(peer); |
| 188 ASSERT(DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->
contains(domObject)); | 189 ASSERT(DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->
contains(domObject)); |
| 189 Traits::MapTraits::domMap(domData)->remove(domObject); | 190 Traits::MapTraits::domMap(domData)->remove(domObject); |
| 190 Traits::ActiveTraits::removeWrapper(domData, domObject); | 191 Traits::ActiveTraits::removeWrapper(domData, domObject); |
| 192 Traits::EventTargetTraits::removeWrapper(domData, domObject); |
| 191 domObject->deref(); | 193 domObject->deref(); |
| 192 } | 194 } |
| 193 }; | 195 }; |
| 194 | 196 |
| 195 template<bool isNode> | 197 template<bool isNode> |
| 196 struct DartDOMWrapperMapTraits {}; | 198 struct DartDOMWrapperMapTraits {}; |
| 197 | 199 |
| 198 template<> | 200 template<> |
| 199 struct DartDOMWrapperMapTraits<false> { | 201 struct DartDOMWrapperMapTraits<false> { |
| 200 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje
ctMap(); } | 202 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje
ctMap(); } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 220 { | 222 { |
| 221 domData->activeObjectMap()->set(domObject, wrapper); | 223 domData->activeObjectMap()->set(domObject, wrapper); |
| 222 } | 224 } |
| 223 | 225 |
| 224 static void removeWrapper(DartDOMData* domData, typename BindingsClass::Nati
veType* domObject) | 226 static void removeWrapper(DartDOMData* domData, typename BindingsClass::Nati
veType* domObject) |
| 225 { | 227 { |
| 226 domData->activeObjectMap()->remove(domObject); | 228 domData->activeObjectMap()->remove(domObject); |
| 227 } | 229 } |
| 228 }; | 230 }; |
| 229 | 231 |
| 232 template<class BindingsClass, bool isEventTarget> |
| 233 struct DartDOMWrapperEventTargetTraits {}; |
| 234 |
| 235 template<class BindingsClass> |
| 236 struct DartDOMWrapperEventTargetTraits<BindingsClass, false> { |
| 237 static void setWrapper(DartDOMData*, typename BindingsClass::NativeType*, Da
rt_Handle) {} |
| 238 static void removeWrapper(DartDOMData*, typename BindingsClass::NativeType*)
{} |
| 239 }; |
| 240 |
| 241 template<class BindingsClass> |
| 242 struct DartDOMWrapperEventTargetTraits<BindingsClass, true> { |
| 243 static void setWrapper(DartDOMData* domData, typename BindingsClass::NativeT
ype* domObject, Dart_Handle wrapper) |
| 244 { |
| 245 domData->eventTargetMap()->set(domObject, wrapper); |
| 246 } |
| 247 |
| 248 static void removeWrapper(DartDOMData* domData, typename BindingsClass::Nati
veType* domObject) |
| 249 { |
| 250 domData->eventTargetMap()->remove(domObject); |
| 251 } |
| 252 }; |
| 253 |
| 230 template<class BindingsClass> | 254 template<class BindingsClass> |
| 231 struct DartDOMWrapperTraits { | 255 struct DartDOMWrapperTraits { |
| 232 typedef DartDOMWrapperMapTraits<BindingsClass::isNode> MapTraits; | 256 typedef DartDOMWrapperMapTraits<BindingsClass::isNode> MapTraits; |
| 233 typedef DartDOMWrapperActiveTraits<BindingsClass, BindingsClass::isActive> A
ctiveTraits; | 257 typedef DartDOMWrapperActiveTraits<BindingsClass, BindingsClass::isActive> A
ctiveTraits; |
| 258 // Putting all the nodes into additional map is expensive. Instead, we have |
| 259 // special treatment of node event listeners in GC prologue. |
| 260 typedef DartDOMWrapperEventTargetTraits<BindingsClass, BindingsClass::isEven
tTarget && !BindingsClass::isNode> EventTargetTraits; |
| 234 }; | 261 }; |
| 235 | 262 |
| 236 struct DartMessagePort; | 263 struct DartMessagePort; |
| 237 | 264 |
| 238 template<> | 265 template<> |
| 239 struct DartDOMWrapperTraits<DartMessagePort> { | 266 struct DartDOMWrapperTraits<DartMessagePort> { |
| 240 struct MessagePortMapTraits { | 267 struct MessagePortMapTraits { |
| 241 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData
->messagePortMap(); } | 268 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData
->messagePortMap(); } |
| 242 }; | 269 }; |
| 243 typedef MessagePortMapTraits MapTraits; | 270 typedef MessagePortMapTraits MapTraits; |
| 244 typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits; | 271 typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits; |
| 272 typedef DartDOMWrapperEventTargetTraits<DartMessagePort, true> EventTargetTr
aits; |
| 245 }; | 273 }; |
| 246 | 274 |
| 247 } | 275 } |
| 248 | 276 |
| 249 #endif // DartDOMWrapper_h | 277 #endif // DartDOMWrapper_h |
| OLD | NEW |