Chromium Code Reviews| 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 DartDOMData* domData = DartIsolate::currentDOMData(); | 74 DartDOMData* domData = DartIsolate::currentDOMData(); |
| 75 Dart_Handle wrapper = DartDOMWrapperTraits<BindingsClass>::MapTraits::do mMap(domData)->get(domObject); | 75 Dart_Handle wrapper = DartDOMWrapperTraits<BindingsClass>::MapTraits::do mMap(domData)->get(domObject); |
| 76 if (wrapper) | 76 if (wrapper) |
| 77 return wrapper; | 77 return wrapper; |
| 78 | 78 |
| 79 wrapper = instantiateWrapper(className); | 79 wrapper = instantiateWrapper(className); |
| 80 writeNativePointer(wrapper, kNativeImplementationIndex, domObject); | 80 writeNativePointer(wrapper, kNativeImplementationIndex, domObject); |
| 81 Dart_Handle persistentWrapperHandle = DartUtilities::createPrologueWeakP ersistentHandle(wrapper, domObject, &wrapperWeakCallback<BindingsClass>); | 81 Dart_Handle persistentWrapperHandle = DartUtilities::createPrologueWeakP ersistentHandle(wrapper, domObject, &wrapperWeakCallback<BindingsClass>); |
| 82 DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->set(dom Object, persistentWrapperHandle); | 82 DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->set(dom Object, persistentWrapperHandle); |
| 83 DartDOMWrapperTraits<BindingsClass>::ActiveTraits::setWrapper(domData, d omObject, persistentWrapperHandle); | 83 DartDOMWrapperTraits<BindingsClass>::ActiveTraits::setWrapper(domData, d omObject, persistentWrapperHandle); |
| 84 DartDOMWrapperTraits<BindingsClass>::EventTargetTraits::setWrapper(domDa ta, domObject, persistentWrapperHandle); | |
| 84 domObject->ref(); | 85 domObject->ref(); |
| 85 return wrapper; | 86 return wrapper; |
| 86 } | 87 } |
| 87 | 88 |
| 88 template<class BindingsClass> | 89 template<class BindingsClass> |
| 89 static Dart_Handle vectorToDart(const Vector< RefPtr<typename BindingsClass: :NativeType> >& vector) | 90 static Dart_Handle vectorToDart(const Vector< RefPtr<typename BindingsClass: :NativeType> >& vector) |
| 90 { | 91 { |
| 91 Dart_Handle list = Dart_NewList(vector.size()); | 92 Dart_Handle list = Dart_NewList(vector.size()); |
| 92 if (Dart_IsError(list)) | 93 if (Dart_IsError(list)) |
| 93 return list; | 94 return list; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 178 } | 179 } |
| 179 | 180 |
| 180 template <class BindingsClass> | 181 template <class BindingsClass> |
| 181 static void wrapperWeakCallback(Dart_Handle, void* peer) | 182 static void wrapperWeakCallback(Dart_Handle, void* peer) |
| 182 { | 183 { |
| 183 DartDOMData* domData = DartIsolate::currentDOMData(); | 184 DartDOMData* domData = DartIsolate::currentDOMData(); |
| 184 typename BindingsClass::NativeType* domObject = static_cast<typename Bin dingsClass::NativeType*>(peer); | 185 typename BindingsClass::NativeType* domObject = static_cast<typename Bin dingsClass::NativeType*>(peer); |
| 185 ASSERT(DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)-> contains(domObject)); | 186 ASSERT(DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)-> contains(domObject)); |
| 186 DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->remove( domObject); | 187 DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->remove( domObject); |
| 187 DartDOMWrapperTraits<BindingsClass>::ActiveTraits::removeWrapper(domData , domObject); | 188 DartDOMWrapperTraits<BindingsClass>::ActiveTraits::removeWrapper(domData , domObject); |
| 189 DartDOMWrapperTraits<BindingsClass>::EventTargetTraits::removeWrapper(do mData, domObject); | |
| 188 domObject->deref(); | 190 domObject->deref(); |
| 189 } | 191 } |
| 190 }; | 192 }; |
| 191 | 193 |
| 192 template<bool isNode> | 194 template<bool isNode> |
| 193 struct DartDOMWrapperMapTraits {}; | 195 struct DartDOMWrapperMapTraits {}; |
| 194 | 196 |
| 195 template<> | 197 template<> |
| 196 struct DartDOMWrapperMapTraits<false> { | 198 struct DartDOMWrapperMapTraits<false> { |
| 197 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje ctMap(); } | 199 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje ctMap(); } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 217 { | 219 { |
| 218 domData->activeObjectMap()->set(domObject, wrapper); | 220 domData->activeObjectMap()->set(domObject, wrapper); |
| 219 } | 221 } |
| 220 | 222 |
| 221 static void removeWrapper(DartDOMData* domData, typename BindingsClass::Nati veType* domObject) | 223 static void removeWrapper(DartDOMData* domData, typename BindingsClass::Nati veType* domObject) |
| 222 { | 224 { |
| 223 domData->activeObjectMap()->remove(domObject); | 225 domData->activeObjectMap()->remove(domObject); |
| 224 } | 226 } |
| 225 }; | 227 }; |
| 226 | 228 |
| 229 template<class BindingsClass, bool isEventTarget> | |
| 230 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,
| |
| 231 | |
| 232 template<class BindingsClass> | |
| 233 struct DartDOMWrapperEventTargetTraits<BindingsClass, false> { | |
| 234 static void setWrapper(DartDOMData*, typename BindingsClass::NativeType*, Da rt_Handle) {} | |
| 235 static void removeWrapper(DartDOMData*, typename BindingsClass::NativeType*) {} | |
| 236 }; | |
| 237 | |
| 238 template<class BindingsClass> | |
| 239 struct DartDOMWrapperEventTargetTraits<BindingsClass, true> { | |
| 240 static void setWrapper(DartDOMData* domData, typename BindingsClass::NativeT ype* domObject, Dart_Handle wrapper) | |
| 241 { | |
| 242 domData->eventTargetMap()->set(domObject, wrapper); | |
| 243 } | |
| 244 | |
| 245 static void removeWrapper(DartDOMData* domData, typename BindingsClass::Nati veType* domObject) | |
| 246 { | |
| 247 domData->eventTargetMap()->remove(domObject); | |
| 248 } | |
| 249 }; | |
| 250 | |
| 227 template<class BindingsClass> | 251 template<class BindingsClass> |
| 228 struct DartDOMWrapperTraits { | 252 struct DartDOMWrapperTraits { |
| 229 typedef DartDOMWrapperMapTraits<BindingsClass::isNode> MapTraits; | 253 typedef DartDOMWrapperMapTraits<BindingsClass::isNode> MapTraits; |
| 230 typedef DartDOMWrapperActiveTraits<BindingsClass, BindingsClass::isActive> A ctiveTraits; | 254 typedef DartDOMWrapperActiveTraits<BindingsClass, BindingsClass::isActive> A ctiveTraits; |
| 255 // Putting all the nodes into additional map is expensive. Instead, we have | |
| 256 // special treatment of node event listeners in GC prologue. | |
| 257 typedef DartDOMWrapperEventTargetTraits<BindingsClass, BindingsClass::isEven tTarget && !BindingsClass::isNode> EventTargetTraits; | |
| 231 }; | 258 }; |
| 232 | 259 |
| 233 class DartMessagePort; | 260 class DartMessagePort; |
| 234 | 261 |
| 235 template<> | 262 template<> |
| 236 struct DartDOMWrapperTraits<DartMessagePort> { | 263 struct DartDOMWrapperTraits<DartMessagePort> { |
| 237 struct MessagePortMapTraits { | 264 struct MessagePortMapTraits { |
| 238 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData ->messagePortMap(); } | 265 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData ->messagePortMap(); } |
| 239 }; | 266 }; |
| 240 typedef MessagePortMapTraits MapTraits; | 267 typedef MessagePortMapTraits MapTraits; |
| 241 typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits; | 268 typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits; |
| 269 typedef DartDOMWrapperEventTargetTraits<DartMessagePort, true> EventTargetTr aits; | |
| 242 }; | 270 }; |
| 243 | 271 |
| 244 } | 272 } |
| 245 | 273 |
| 246 #endif // DartDOMWrapper_h | 274 #endif // DartDOMWrapper_h |
| OLD | NEW |