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

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: 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 3ef436593b0d28a69822cef612c944e3a254f885..d57c8d0dc445ceee3525fb2e413c841d3494cbc6 100644
--- a/Source/WebCore/bindings/dart/DartDOMWrapper.h
+++ b/Source/WebCore/bindings/dart/DartDOMWrapper.h
@@ -31,6 +31,7 @@
#define DartDOMWrapper_h
#include "DOMStringList.h"
+#include "DartIsolate.h"
#include "DartUtilities.h"
#include "EventListener.h"
#include "EventTarget.h"
@@ -312,8 +313,8 @@ 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>
+ static Dart_Handle newWrapper(const char* className, WebKitClass* domObject)
{
Dart_Handle wrapper = instantiateWrapper(className);
installNativePointers(domObject, wrapper);
@@ -326,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;
@@ -344,15 +345,15 @@ 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);
- // FIXME: make persistent handle weak and deref domObject in weak callback.
- Dart_Handle persistentWrapperHandle = Dart_NewPersistentHandle(wrapper);
+ RefPtr<DartIsolate> isolate = DartIsolate::current();
+ Dart_Handle persistentWrapperHandle = isolate->createWeakPersistentHandle(wrapper, domObject, &wrapperWeakCallback<WebKitClass>);
DartDOMMap* domMap = DartUtilities::domMapForCurrentIsolate();
ASSERT(!domMap->contains(domObject));
@@ -373,14 +374,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;
}
@@ -411,7 +410,6 @@ public:
private:
enum NativeFieldIndices {
kNativeImplementationIndex = 0,
- kDerefObjectFunctionIndex,
kNativeFieldCount
};
@@ -436,30 +434,23 @@ private:
return reinterpret_cast<void*>(value);
}
- template <class WebkitClass>
- static void installNativePointers(WebkitClass* domObject, Dart_Handle wrapper)
+ 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