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

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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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