| 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>
|
|
|