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

Unified Diff: Source/bindings/dart/DartCustomElementWrapper.cpp

Issue 188083002: Dartium support for manual custom element upgrades. (Closed) Base URL: svn://svn.chromium.org/blink/branches/dart/1750
Patch Set: Created 6 years, 8 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
« no previous file with comments | « Source/bindings/dart/DartCustomElementWrapper.h ('k') | Source/bindings/dart/DartNativeUtilities.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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<>
« no previous file with comments | « Source/bindings/dart/DartCustomElementWrapper.h ('k') | Source/bindings/dart/DartNativeUtilities.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698