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

Side by Side Diff: sdk/lib/html/html_common/conversions_dartium.dart

Issue 1417363003: Fixed improper construction of custom elements. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month 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
OLDNEW
1 part of html_common; 1 part of html_common;
2 2
3 convertDartToNative_PrepareForStructuredClone(value) => 3 convertDartToNative_PrepareForStructuredClone(value) =>
4 new _StructuredCloneDartium().convertDartToNative_PrepareForStructuredClone( value); 4 new _StructuredCloneDartium().convertDartToNative_PrepareForStructuredClone( value);
5 5
6 convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false}) => 6 convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false}) =>
7 new _AcceptStructuredCloneDartium().convertNativeToDart_AcceptStructuredClon e(object, mustCopy: mustCopy); 7 new _AcceptStructuredCloneDartium().convertNativeToDart_AcceptStructuredClon e(object, mustCopy: mustCopy);
8 8
9 class _StructuredCloneDartium extends _StructuredClone { 9 class _StructuredCloneDartium extends _StructuredClone {
10 newJsMap() => new js.JsObject(js.context["Object"]); 10 newJsMap() => new js.JsObject(js.context["Object"]);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 try { 115 try {
116 if (jsObject is! js.JsObject || jsObject == null) { 116 if (jsObject is! js.JsObject || jsObject == null) {
117 // JS Interop converted the object to a Dart class e.g., Uint8ClampedList. 117 // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
118 // or it's a simple type. 118 // or it's a simple type.
119 return jsObject; 119 return jsObject;
120 } 120 }
121 121
122 var wrapper = js.getDartHtmlWrapperFor(jsObject); 122 var wrapper = js.getDartHtmlWrapperFor(jsObject);
123 // if we have a wrapper return the Dart instance. 123 // if we have a wrapper return the Dart instance.
124 if (wrapper != null) { 124 if (wrapper != null) {
125 var customElementClass = getCustomElementType(wrapper.blink_jsObject);
126 if (wrapper.runtimeType != customElementClass && customElementClass != nul l) {
127 if (wrapper.runtimeType == HtmlElement && !wrapper.isBadUpgrade) {
128 // We're a Dart instance if it's HtmlElement and we have a customEleme nt
129 // class then we need to upgrade.
130 if (customElementClass != null) {
131 var dartClass_instance;
132 try {
133 dartClass_instance = _blink.Blink_Utils.constructElement(customEle mentClass, jsObject);
134 } finally {
135 dartClass_instance.blink_jsObject = jsObject;
136 return dartClass_instance;
137 }
138 }
139 }
140 }
141
142 return wrapper; 125 return wrapper;
143 } 126 }
144 127
145 if (jsObject is js.JsArray) { 128 if (jsObject is js.JsArray) {
146 var wrappingList = new DartHtmlWrappingList(jsObject); 129 var wrappingList = new DartHtmlWrappingList(jsObject);
147 js.setDartHtmlWrapperFor(jsObject, wrappingList); 130 js.setDartHtmlWrapperFor(jsObject, wrappingList);
148 return wrappingList; 131 return wrappingList;
149 } 132 }
150 133
151 // Try the most general type conversions on it. 134 // Try the most general type conversions on it.
(...skipping 21 matching lines...) Expand all
173 156
174 var dartClass_instance; 157 var dartClass_instance;
175 var customElementClass = null; 158 var customElementClass = null;
176 var extendsTag = ""; 159 var extendsTag = "";
177 var custom = getCustomElementEntry(jsObject); 160 var custom = getCustomElementEntry(jsObject);
178 if (custom != null) { 161 if (custom != null) {
179 customElementClass = custom['type']; 162 customElementClass = custom['type'];
180 extendsTag = custom['extends']; 163 extendsTag = custom['extends'];
181 } 164 }
182 165
183 // Custom Element to upgrade. 166 // Only allow custom elements to be created in the html or svg default
184 // Only allow custome elements to be created in the html or svg default
185 // namespace. 167 // namespace.
168 var func;
186 var defaultNS = jsObject['namespaceURI'] == 'http://www.w3.org/1999/xhtml' | | 169 var defaultNS = jsObject['namespaceURI'] == 'http://www.w3.org/1999/xhtml' | |
187 jsObject['namespaceURI'] == 'http://www.w3.org/2000/svg'; 170 jsObject['namespaceURI'] == 'http://www.w3.org/2000/svg';
188 if (customElementClass != null && extendsTag == "" && defaultNS) { 171 if (customElementClass != null && extendsTag == "" && defaultNS) {
189 try { 172 // The customElementClass is known but we can't create the real class so
190 dartClass_instance = _blink.Blink_Utils.constructElement(customElementCl ass, jsObject); 173 // create the HtmlElement and it will get upgraded when registerElement's
191 } finally { 174 // createdCallback is called.
192 dartClass_instance.blink_jsObject = jsObject; 175 func = getHtmlCreateFunction('HTMLElement');
193 js.setDartHtmlWrapperFor(jsObject, dartClass_instance);
194 }
195 } else { 176 } else {
196 var func = getHtmlCreateFunction(jsTypeName); 177 func = getHtmlCreateFunction(jsTypeName);
197 if (func == null) { 178 if (func == null) {
198 if (jsTypeName == 'auto-binding') { 179 if (jsTypeName == 'auto-binding') {
199 func = getHtmlCreateFunction("HTMLTemplateElement"); 180 func = getHtmlCreateFunction('HTMLTemplateElement');
200 } else if (jsObject.toString() == "[object HTMLElement]") { 181 } else if (jsObject.toString() == "[object HTMLElement]") {
201 // One last ditch effort could be a JS custom element. 182 // One last ditch effort could be a JS custom element.
202 func = getHtmlCreateFunction("HTMLElement"); 183 func = getHtmlCreateFunction('HTMLElement');
203 } 184 }
204 } 185 }
205 if (func != null) {
206 dartClass_instance = func();
207 dartClass_instance.blink_jsObject = jsObject;
208 js.setDartHtmlWrapperFor(jsObject, dartClass_instance);
209 }
210 } 186 }
211 187
188 // Can we construct a Dart class?
189 if (func != null) {
190 dartClass_instance = func();
191
192 // Wrap our Dart instance in both directions.
193 dartClass_instance.blink_jsObject = jsObject;
194 js.setDartHtmlWrapperFor(jsObject, dartClass_instance);
195 }
196
212 // TODO(jacobr): cache that this is not a dart:html JS class. 197 // TODO(jacobr): cache that this is not a dart:html JS class.
213 return dartClass_instance; 198 return dartClass_instance;
214 } catch(e, stacktrace){ 199 } catch(e, stacktrace){
215 if (interop_checks) { 200 if (interop_checks) {
216 if (e is DebugAssertException) 201 if (e is DebugAssertException)
217 window.console.log("${e.message}\n ${stacktrace}"); 202 window.console.log("${e.message}\n ${stacktrace}");
218 else 203 else
219 window.console.log("${stacktrace}"); 204 window.console.log("${stacktrace}");
220 } 205 }
221 } 206 }
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 372
388 final js.JsArray blink_jsObject; 373 final js.JsArray blink_jsObject;
389 374
390 operator [](int index) => wrap_jso(js.JsNative.getArrayIndex(blink_jsObject, i ndex)); 375 operator [](int index) => wrap_jso(js.JsNative.getArrayIndex(blink_jsObject, i ndex));
391 376
392 operator []=(int index, value) => blink_jsObject[index] = value; 377 operator []=(int index, value) => blink_jsObject[index] = value;
393 378
394 int get length => blink_jsObject.length; 379 int get length => blink_jsObject.length;
395 int set length(int newLength) => blink_jsObject.length = newLength; 380 int set length(int newLength) => blink_jsObject.length = newLength;
396 } 381 }
OLDNEW
« no previous file with comments | « sdk/lib/html/dartium/html_dartium.dart ('k') | tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698