| 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..cb17b9383746a9c90a4ff1fc930f4759a9bbd2e8 100644
|
| --- a/Source/WebCore/bindings/dart/DartDOMWrapper.h
|
| +++ b/Source/WebCore/bindings/dart/DartDOMWrapper.h
|
| @@ -317,7 +317,7 @@ public:
|
| static Dart_Handle newWrapper(const char* className, WebkitClass* domObject)
|
| {
|
| Dart_Handle wrapper = instantiateWrapper(className);
|
| - installNativePointers(domObject, wrapper);
|
| + writeNativePointer(wrapper, kNativeImplementationIndex, domObject);
|
| return wrapper;
|
| }
|
|
|
| @@ -350,10 +350,9 @@ public:
|
| {
|
| 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,8 +373,6 @@ 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)
|
| {
|
| @@ -412,7 +409,6 @@ public:
|
| private:
|
| enum NativeFieldIndices {
|
| kNativeImplementationIndex = 0,
|
| - kDerefObjectFunctionIndex,
|
| 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>
|
|
|