Index: Source/bindings/dart/DartDOMWrapper.h |
diff --git a/Source/bindings/dart/DartDOMWrapper.h b/Source/bindings/dart/DartDOMWrapper.h |
index ce7b9dd0877ad4ffd0c6cca14afc54deffe9326e..c74f6f65cda84dc4ab160f8e52af953d1235745b 100644 |
--- a/Source/bindings/dart/DartDOMWrapper.h |
+++ b/Source/bindings/dart/DartDOMWrapper.h |
@@ -272,11 +272,17 @@ private: |
} |
template <class BindingsClass> |
- static void wrapperWeakCallback(Dart_WeakPersistentHandle, void* peer) |
+ static void wrapperWeakCallback(Dart_WeakPersistentHandle wrapper, void* peer) |
{ |
typedef DartDOMWrapperTraits<BindingsClass> Traits; |
DartDOMData* domData = DartDOMData::current(); |
typename BindingsClass::NativeType* domObject = static_cast<typename BindingsClass::NativeType*>(peer); |
+ Dart_WeakPersistentHandle currentWrapper = Traits::MapTraits::domMap(domData)->get(domObject); |
+ // This could be an old wrapper which has been replaced with a custom element. |
+ if (!Dart_IdentityEquals(Dart_HandleFromWeakPersistent(currentWrapper), Dart_HandleFromWeakPersistent(wrapper))) { |
blois
2013/10/31 18:43:07
Changing the check to:
if (currentWrapper != wrapp
siva
2013/10/31 19:42:40
if (currentWrapper != wrapper) {} is preferable fo
blois
2013/10/31 20:24:18
Done.
|
+ return; |
+ } |
+ |
if (DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->contains(domObject)) { |
Traits::MapTraits::domMap(domData)->remove(domObject); |
Traits::ActiveTraits::removeWrapper(domData, domObject); |