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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 template<typename ElementType> 87 template<typename ElementType>
88 Dart_Handle DartCustomElementWrapper<ElementType>::wrap(PassRefPtr<ElementType> element, Dart_Handle (*createSpecificWrapper)(DartDOMData* domData, ElementType* )) 88 Dart_Handle DartCustomElementWrapper<ElementType>::wrap(PassRefPtr<ElementType> element, Dart_Handle (*createSpecificWrapper)(DartDOMData* domData, ElementType* ))
89 { 89 {
90 if (!element->isUpgradedCustomElement()) 90 if (!element->isUpgradedCustomElement())
91 return createUpgradeCandidateWrapper(element.get(), createSpecificWrappe r); 91 return createUpgradeCandidateWrapper(element.get(), createSpecificWrappe r);
92 92
93 return upgradeDartWrapper(element.get(), createSpecificWrapper); 93 return upgradeDartWrapper(element.get(), createSpecificWrapper);
94 } 94 }
95 95
96 template<> 96 template<>
97 Dart_Handle DartCustomElementWrapper<HTMLElement>::upgradeDartWrapper(HTMLElemen t* element, Dart_Handle (*createSpecificWrapper)(DartDOMData*, HTMLElement*)) 97 Dart_Handle DartCustomElementWrapper<HTMLElement>::swapElementWrapper(DartDOMDat a* domData, HTMLElement* element, Dart_Handle wrapperType, intptr_t nativeClassI d)
98 { 98 {
99 DartDOMData* domData = DartDOMData::current();
100 DartCustomElementBinding* binding = domData->customElementBinding(
101 CustomElement::definitionFor(element));
102 if (!binding)
103 return createUpgradeCandidateWrapper(element, createSpecificWrapper);
104
105 Dart_PersistentHandle customType = binding->customType();
106 ASSERT(!Dart_IsError(customType));
107
108 Dart_WeakPersistentHandle oldInstance = DartDOMWrapper::lookupWrapper<DartHT MLElement>( 99 Dart_WeakPersistentHandle oldInstance = DartDOMWrapper::lookupWrapper<DartHT MLElement>(
109 domData, reinterpret_cast<HTMLElement*>(element)); 100 domData, reinterpret_cast<HTMLElement*>(element));
110 Dart_Handle oldWrapper = 0; 101 Dart_Handle oldWrapper = 0;
111 if (oldInstance) { 102 if (oldInstance) {
112 oldWrapper = Dart_HandleFromWeakPersistent(oldInstance); 103 oldWrapper = Dart_HandleFromWeakPersistent(oldInstance);
113 DartDOMWrapper::disassociateWrapper<DartHTMLElement>( 104 DartDOMWrapper::disassociateWrapper<DartHTMLElement>(
114 domData, 105 domData,
115 reinterpret_cast<HTMLElement*>(element), 106 reinterpret_cast<HTMLElement*>(element),
116 oldWrapper); 107 oldWrapper);
117 } 108 }
118 109
119 Dart_Handle newInstance = Dart_Allocate(customType); 110 Dart_Handle newWrapper = Dart_Allocate(wrapperType);
120 ASSERT(!Dart_IsError(newInstance)); 111 ASSERT(!Dart_IsError(newWrapper));
121 DartDOMWrapper::writeNativePointer(newInstance, element, binding->nativeClas sId()); 112 DartDOMWrapper::writeNativePointer(newWrapper, element, nativeClassId);
122 113
123 Dart_Handle result = Dart_InvokeConstructor(newInstance, Dart_NewStringFromC String("created"), 0, 0); 114 Dart_Handle result = Dart_InvokeConstructor(newWrapper, Dart_NewStringFromCS tring("created"), 0, 0);
124 115
125 if (Dart_IsError(result)) { 116 if (Dart_IsError(result)) {
126 DartUtilities::reportProblem(domData->scriptExecutionContext(), result); 117 DartUtilities::reportProblem(domData->scriptExecutionContext(), result);
127 118
128 // Fall back to the old wrapper if possible. 119 // Fall back to the old wrapper if possible.
129 if (oldWrapper) { 120 if (oldWrapper) {
130 DartDOMWrapper::associateWrapper<DartHTMLElement>(domData, element, oldWrapper); 121 DartDOMWrapper::associateWrapper<DartHTMLElement>(domData, element, oldWrapper);
131 return oldWrapper; 122 return oldWrapper;
132 } 123 }
124 return result;
125 }
126 return newWrapper;
127 }
133 128
129 template<>
130 Dart_Handle DartCustomElementWrapper<HTMLElement>::upgradeDartWrapper(HTMLElemen t* element, Dart_Handle (*createSpecificWrapper)(DartDOMData*, HTMLElement*))
131 {
132 DartDOMData* domData = DartDOMData::current();
133 DartCustomElementBinding* binding = domData->customElementBinding(CustomElem ent::definitionFor(element));
134 if (!binding)
135 return createUpgradeCandidateWrapper(element, createSpecificWrapper);
136
137 Dart_PersistentHandle customType = binding->customType();
138 ASSERT(!Dart_IsError(customType));
139
140 Dart_Handle newWrapper = swapElementWrapper(domData, element, customType, bi nding->nativeClassId());
141 if (Dart_IsError(newWrapper)) {
134 // When the upgrade fails the failed wrapper may have been associated, 142 // When the upgrade fails the failed wrapper may have been associated,
135 // so we need to create a new one and re-associate it. 143 // so we need to create a new one and re-associate it.
136 Dart_Handle fallbackWrapper = createUpgradeCandidateWrapper(element, cre ateSpecificWrapper); 144 Dart_Handle fallbackWrapper = createUpgradeCandidateWrapper(element, cre ateSpecificWrapper);
137 145
138 DartDOMWrapper::associateWrapper<DartHTMLElement>(domData, element, fall backWrapper); 146 DartDOMWrapper::associateWrapper<DartHTMLElement>(domData, element, fall backWrapper);
139 DartDOMWrapper::writeNativePointer(fallbackWrapper, element, binding->na tiveClassId()); 147 DartDOMWrapper::writeNativePointer(fallbackWrapper, element, binding->na tiveClassId());
140 return fallbackWrapper; 148 return fallbackWrapper;
141 } 149 }
142 return newInstance; 150 return newWrapper;
143 } 151 }
144 152
145 template<> 153 template<>
154 Dart_Handle DartCustomElementWrapper<HTMLElement>::changeElementWrapper(Dart_Han dle element, Dart_Handle wrapperType)
155 {
156 DartDOMData* domData = DartDOMData::current();
157
158 intptr_t nativeClassId = reinterpret_cast<intptr_t>(DartDOMWrapper::readNati vePointer(element, DartDOMWrapper::kNativeTypeIndex));
159 Dart_Handle exception = 0;
160 HTMLElement* nativeElement = DartDOMWrapper::unwrapDartWrapper<DartHTMLEleme nt>(domData, element, exception);
161 if (exception) {
162 return exception;
163 }
164 return swapElementWrapper(domData, nativeElement, wrapperType, nativeClassId );
165 }
166
167 template<>
146 Dart_Handle DartCustomElementWrapper<SVGElement>::upgradeDartWrapper(SVGElement* element, Dart_Handle (*createSpecificWrapper)(DartDOMData*, SVGElement*)) 168 Dart_Handle DartCustomElementWrapper<SVGElement>::upgradeDartWrapper(SVGElement* element, Dart_Handle (*createSpecificWrapper)(DartDOMData*, SVGElement*))
147 { 169 {
148 // TODO: support SVG elements. 170 // TODO: support SVG elements.
149 ASSERT(FALSE); 171 ASSERT(FALSE);
150 return Dart_Handle(); 172 return Dart_Handle();
151 } 173 }
152 174
153 template<> 175 template<>
154 void DartCustomElementWrapper<HTMLElement>::initializeCustomElement(Dart_Handle wrapper, Dart_Handle& exception) 176 void DartCustomElementWrapper<HTMLElement>::initializeCustomElement(Dart_Handle wrapper, Dart_Handle& exception)
155 { 177 {
(...skipping 17 matching lines...) Expand all
173 ASSERT(FALSE); 195 ASSERT(FALSE);
174 } 196 }
175 197
176 template 198 template
177 class DartCustomElementWrapper<HTMLElement>; 199 class DartCustomElementWrapper<HTMLElement>;
178 200
179 template 201 template
180 class DartCustomElementWrapper<SVGElement>; 202 class DartCustomElementWrapper<SVGElement>;
181 203
182 } // namespace WebCore 204 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698