Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(230)

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW
« 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