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

Unified Diff: Source/WebCore/bindings/dart/DartDOMWrapper.h

Issue 9837116: DOM wrappers that are not retained from Dart should be collected. (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: Rebased with proper shutdown semantics. Created 8 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: Source/WebCore/bindings/dart/DartDOMWrapper.h
diff --git a/Source/WebCore/bindings/dart/DartDOMWrapper.h b/Source/WebCore/bindings/dart/DartDOMWrapper.h
index 180c433d4ab042c5f48ca49c7ce3099d7651828d..0006f17edba235714dc626216d5215d4b6a4b726 100644
--- a/Source/WebCore/bindings/dart/DartDOMWrapper.h
+++ b/Source/WebCore/bindings/dart/DartDOMWrapper.h
@@ -313,11 +313,11 @@ inline void dartListToVector(Dart_Handle list, Vector<Element>& array, Dart_Hand
class DartDOMWrapper {
public:
- template <class WebkitClass>
- static Dart_Handle newWrapper(const char* className, WebkitClass* domObject)
+ template <class WebKitClass>
Anton Muhin 2012/03/29 19:18:45 if you please, do not rename as a part of another
podivilov 2012/03/30 10:36:28 Done.
+ static Dart_Handle newWrapper(const char* className, WebKitClass* domObject)
{
Dart_Handle wrapper = instantiateWrapper(className);
- installNativePointers(domObject, wrapper);
+ writeNativePointer(wrapper, kNativeImplementationIndex, domObject);
return wrapper;
}
@@ -327,8 +327,8 @@ public:
return toDart(instance, BindingsClass::dartImplementationClassName);
}
- template <class WebkitClass>
- static Dart_Handle toDart(WebkitClass* instance, const char* className)
+ template <class WebKitClass>
+ static Dart_Handle toDart(WebKitClass* instance, const char* className)
{
if (!instance)
return 0;
@@ -345,15 +345,14 @@ public:
return wrapper;
}
- template <class WebkitClass>
- static void bindDOMObjectToDartWrapper(WebkitClass* domObject, Dart_Handle wrapper)
+ template <class WebKitClass>
+ static void bindDOMObjectToDartWrapper(WebKitClass* domObject, Dart_Handle wrapper)
{
ASSERT(domObject);
domObject->ref();
- installNativePointers(domObject, wrapper);
+ writeNativePointer(wrapper, kNativeImplementationIndex, domObject);
- // FIXME: make persistent handle weak and deref domObject in weak callback.
- Dart_Handle persistentWrapperHandle = Dart_NewPersistentHandle(wrapper);
+ Dart_Handle persistentWrapperHandle = DartUtilities::createWeakPersistentHandle(wrapper, domObject, &wrapperWeakCallback<WebKitClass>);
DartDOMMap* domMap = DartUtilities::domMapForCurrentIsolate();
ASSERT(!domMap->contains(domObject));
@@ -374,14 +373,12 @@ public:
return reinterpret_cast<typename BindingsClass::NativeType*>(nativePointer);
}
- static void derefDOMObject(Dart_Handle wrapper, void* domObject);
-
- template <class WebkitClass>
- static WebkitClass* receiver(Dart_NativeArguments args)
+ template <class WebKitClass>
+ static WebKitClass* receiver(Dart_NativeArguments args)
{
// Type of receiver is ensured by Dart VM runtime, so bypass additional checks.
void* nativePointer = readNativePointer(Dart_GetNativeArgument(args, 0), kNativeImplementationIndex);
- WebkitClass* const recv = static_cast<WebkitClass*>(nativePointer);
+ WebKitClass* const recv = static_cast<WebKitClass*>(nativePointer);
ASSERT(recv); // Never should return 0.
return recv;
}
@@ -412,7 +409,6 @@ public:
private:
enum NativeFieldIndices {
kNativeImplementationIndex = 0,
- kDerefObjectFunctionIndex,
Anton Muhin 2012/03/29 19:18:45 please, do not forget to change pure Dart implemen
podivilov 2012/03/30 10:36:28 https://chromiumcodereview.appspot.com/9968004
kNativeFieldCount
};
@@ -437,30 +433,16 @@ private:
return reinterpret_cast<void*>(value);
}
- template <class WebkitClass>
- static void installNativePointers(WebkitClass* domObject, Dart_Handle wrapper)
- {
- ASSERT(domObject);
- DerefObjectFunction derefObjectFunction = &DartDOMWrapper::derefObject<WebkitClass>;
- writeNativePointer(wrapper, kNativeImplementationIndex, domObject);
- writeNativePointer(wrapper, kDerefObjectFunctionIndex, reinterpret_cast<void*>(derefObjectFunction));
- }
-
- typedef void (*DerefObjectFunction)(void*);
-
template<typename T>
- static void derefObject(void* pointer)
+ static void wrapperWeakCallback(Dart_Handle, void* domObject)
{
- static_cast<T*>(pointer)->deref();
+ DartDOMMap* domMap = DartUtilities::domMapForCurrentIsolate();
+ ASSERT(domMap->contains(domObject));
+ domMap->remove(domObject);
+ static_cast<T*>(domObject)->deref();
}
};
-template<>
-inline void DartDOMWrapper::derefObject<NPObject>(void*)
-{
- // FIXME: proper deref.
-}
-
// ParameterAdapter.
template <typename Value>

Powered by Google App Engine
This is Rietveld 408576698