Index: Source/bindings/dart/DartCustomElementWrapper.cpp |
diff --git a/Source/bindings/dart/DartCustomElementWrapper.cpp b/Source/bindings/dart/DartCustomElementWrapper.cpp |
index 1ccec2ee78717cc6cba6c1693904cbd15ecda3b4..eda584d11b85e155471f9f442df483f25b7c825f 100644 |
--- a/Source/bindings/dart/DartCustomElementWrapper.cpp |
+++ b/Source/bindings/dart/DartCustomElementWrapper.cpp |
@@ -94,17 +94,8 @@ Dart_Handle DartCustomElementWrapper<ElementType>::wrap(PassRefPtr<ElementType> |
} |
template<> |
-Dart_Handle DartCustomElementWrapper<HTMLElement>::upgradeDartWrapper(HTMLElement* element, Dart_Handle (*createSpecificWrapper)(DartDOMData*, HTMLElement*)) |
+Dart_Handle DartCustomElementWrapper<HTMLElement>::swapElementWrapper(DartDOMData* domData, HTMLElement* element, Dart_Handle wrapperType, intptr_t nativeClassId) |
{ |
- DartDOMData* domData = DartDOMData::current(); |
- DartCustomElementBinding* binding = domData->customElementBinding( |
- CustomElement::definitionFor(element)); |
- if (!binding) |
- return createUpgradeCandidateWrapper(element, createSpecificWrapper); |
- |
- Dart_PersistentHandle customType = binding->customType(); |
- ASSERT(!Dart_IsError(customType)); |
- |
Dart_WeakPersistentHandle oldInstance = DartDOMWrapper::lookupWrapper<DartHTMLElement>( |
domData, reinterpret_cast<HTMLElement*>(element)); |
Dart_Handle oldWrapper = 0; |
@@ -116,11 +107,11 @@ Dart_Handle DartCustomElementWrapper<HTMLElement>::upgradeDartWrapper(HTMLElemen |
oldWrapper); |
} |
- Dart_Handle newInstance = Dart_Allocate(customType); |
- ASSERT(!Dart_IsError(newInstance)); |
- DartDOMWrapper::writeNativePointer(newInstance, element, binding->nativeClassId()); |
+ Dart_Handle newWrapper = Dart_Allocate(wrapperType); |
+ ASSERT(!Dart_IsError(newWrapper)); |
+ DartDOMWrapper::writeNativePointer(newWrapper, element, nativeClassId); |
- Dart_Handle result = Dart_InvokeConstructor(newInstance, Dart_NewStringFromCString("created"), 0, 0); |
+ Dart_Handle result = Dart_InvokeConstructor(newWrapper, Dart_NewStringFromCString("created"), 0, 0); |
if (Dart_IsError(result)) { |
DartUtilities::reportProblem(domData->scriptExecutionContext(), result); |
@@ -130,7 +121,24 @@ Dart_Handle DartCustomElementWrapper<HTMLElement>::upgradeDartWrapper(HTMLElemen |
DartDOMWrapper::associateWrapper<DartHTMLElement>(domData, element, oldWrapper); |
return oldWrapper; |
} |
+ return result; |
+ } |
+ return newWrapper; |
+} |
+ |
+template<> |
+Dart_Handle DartCustomElementWrapper<HTMLElement>::upgradeDartWrapper(HTMLElement* element, Dart_Handle (*createSpecificWrapper)(DartDOMData*, HTMLElement*)) |
+{ |
+ DartDOMData* domData = DartDOMData::current(); |
+ DartCustomElementBinding* binding = domData->customElementBinding(CustomElement::definitionFor(element)); |
+ if (!binding) |
+ return createUpgradeCandidateWrapper(element, createSpecificWrapper); |
+ Dart_PersistentHandle customType = binding->customType(); |
+ ASSERT(!Dart_IsError(customType)); |
+ |
+ Dart_Handle newWrapper = swapElementWrapper(domData, element, customType, binding->nativeClassId()); |
+ if (Dart_IsError(newWrapper)) { |
// When the upgrade fails the failed wrapper may have been associated, |
// so we need to create a new one and re-associate it. |
Dart_Handle fallbackWrapper = createUpgradeCandidateWrapper(element, createSpecificWrapper); |
@@ -139,7 +147,21 @@ Dart_Handle DartCustomElementWrapper<HTMLElement>::upgradeDartWrapper(HTMLElemen |
DartDOMWrapper::writeNativePointer(fallbackWrapper, element, binding->nativeClassId()); |
return fallbackWrapper; |
} |
- return newInstance; |
+ return newWrapper; |
+} |
+ |
+template<> |
+Dart_Handle DartCustomElementWrapper<HTMLElement>::changeElementWrapper(Dart_Handle element, Dart_Handle wrapperType) |
+{ |
+ DartDOMData* domData = DartDOMData::current(); |
+ |
+ intptr_t nativeClassId = reinterpret_cast<intptr_t>(DartDOMWrapper::readNativePointer(element, DartDOMWrapper::kNativeTypeIndex)); |
+ Dart_Handle exception = 0; |
+ HTMLElement* nativeElement = DartDOMWrapper::unwrapDartWrapper<DartHTMLElement>(domData, element, exception); |
+ if (exception) { |
+ return exception; |
+ } |
+ return swapElementWrapper(domData, nativeElement, wrapperType, nativeClassId); |
} |
template<> |