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

Side by Side Diff: tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate

Issue 1391143006: Fixed native element extension, custom events, _VMUpgrader, and data binding. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Merged conflicts Created 5 years, 2 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
« no previous file with comments | « tools/dom/templates/html/impl/impl_CustomEvent.darttemplate ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 // WARNING: Do not edit - generated code. 5 // WARNING: Do not edit - generated code.
6 6
7 part of $LIBRARYNAME; 7 part of $LIBRARYNAME;
8 8
9 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS { 9 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
10 $!MEMBERS 10 $!MEMBERS
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 } 216 }
217 } 217 }
218 218
219 classMirror = classMirror.superclass; 219 classMirror = classMirror.superclass;
220 } 220 }
221 221
222 // If we're an element then everything is okay. 222 // If we're an element then everything is okay.
223 return isElement ? jsClassName : null; 223 return isElement ? jsClassName : null;
224 } 224 }
225 225
226 // Get the first class that's a super of a dart.dom library.
227 ClassMirror _getDartHtmlClassName(ClassMirror classMirror) {
228 while (classMirror.superclass != null) {
229 var fullName = classMirror.superclass.qualifiedName;
230 var domLibrary = MirrorSystem.getName(fullName).startsWith('dart.dom.');
231 if (domLibrary) {
232 return classMirror.superclass;
233 }
234
235 classMirror = classMirror.superclass;
236 }
237
238 return null;
239 }
240
226 /** 241 /**
227 * Get the class that immediately derived from a class in dart:html or 242 * Get the class that immediately derived from a class in dart:html or
228 * dart:svg (has an attribute DomName of either HTML* or SVG*). 243 * dart:svg (has an attribute DomName of either HTML* or SVG*).
229 */ 244 */
230 ClassMirror _getDomSuperClass(ClassMirror classMirror) { 245 ClassMirror _getDomSuperClass(ClassMirror classMirror) {
231 var isElement = false; 246 var isElement = false;
247 var foundSuperElement = null;
232 248
233 while (classMirror.superclass != null) { 249 while (classMirror.superclass != null) {
234 var fullName = classMirror.superclass.qualifiedName; 250 var fullName = classMirror.superclass.qualifiedName;
235 isElement = isElement || (fullName == #dart.dom.html.Element || fullName = = #dart.dom.svg.Element); 251 isElement = isElement || (fullName == #dart.dom.html.Element || fullName = = #dart.dom.svg.Element);
236 252
237 var domLibrary = MirrorSystem.getName(fullName).startsWith('dart.dom.'); 253 var domLibrary = MirrorSystem.getName(fullName).startsWith('dart.dom.');
238 if (domLibrary) { 254 if (domLibrary) {
255 if (foundSuperElement == null) {
256 foundSuperElement = classMirror.superclass;
257 }
239 // Lookup JS class (if not found). 258 // Lookup JS class (if not found).
240 var metadatas = classMirror.metadata; 259 var metadatas = classMirror.metadata;
241 for (var metadata in metadatas) { 260 for (var metadata in metadatas) {
242 var metaDataMirror = metadata.reflectee; 261 var metaDataMirror = metadata.reflectee;
243 var metaType = reflectClass(metaDataMirror.runtimeType); 262 var metaType = reflectClass(metaDataMirror.runtimeType);
244 if (MirrorSystem.getName(metaType.simpleName) == 'DomName' && 263 if (MirrorSystem.getName(metaType.simpleName) == 'DomName' &&
245 (metaDataMirror.name.startsWith('HTML') || metaDataMirror.name.sta rtsWith('SVG'))) { 264 (metaDataMirror.name.startsWith('HTML') || metaDataMirror.name.sta rtsWith('SVG'))) {
246 if (isElement) return classMirror; 265 if (isElement) return foundSuperElement;
247 } 266 }
248 } 267 }
249 } 268 }
250 269
251 classMirror = classMirror.superclass; 270 classMirror = classMirror.superclass;
252 } 271 }
253 272
254 return null; 273 return null;
255 } 274 }
256 275
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 if (classMirror.isAbstract) { 381 if (classMirror.isAbstract) {
363 throw new DomException.jsInterop("HierarchyRequestError: Cannot register a n abstract class."); 382 throw new DomException.jsInterop("HierarchyRequestError: Cannot register a n abstract class.");
364 } 383 }
365 384
366 var jsClassName = _getJSClassName(classMirror); 385 var jsClassName = _getJSClassName(classMirror);
367 if (jsClassName == null) { 386 if (jsClassName == null) {
368 // Only components derived from HTML* can be extended. 387 // Only components derived from HTML* can be extended.
369 throw new DomException.jsInterop("HierarchyRequestError: Only HTML element s can be customized."); 388 throw new DomException.jsInterop("HierarchyRequestError: Only HTML element s can be customized.");
370 } 389 }
371 390
391 var customClassType = _getDartHtmlClassName(classMirror);
392
393 if (extendsTag != null) {
394 var nativeElement = document.createElement(extendsTag);
395
396 // Trying to extend a native element is it the Dart class consistent with the
397 // extendsTag?
398 if (nativeElement.runtimeType != customClassType.reflectedType) {
399 var nativeElementClassMirror = reflectClass(nativeElement.runtimeType);
400 var customClassNativeElement = MirrorSystem.getName(customClassType.simp leName);
401 var extendsNativeElement = MirrorSystem.getName(nativeElementClassMirror .simpleName);
402 throw new DomException.jsInterop("HierarchyRequestError: Custom class ty pe ($customClassNativeElement) and extendsTag class ($extendsNativeElement) don' t match .");
403 }
404 } else if (customClassType.reflectedType != HtmlElement && customClassType.r eflectedType != svg.SvgElement) {
405 var customClassName = MirrorSystem.getName(classMirror.simpleName);
406 var customClassElement = MirrorSystem.getName(customClassType.simpleName);
407 throw new DomException.jsInterop("HierarchyRequestError: Custom element $c ustomClassName is a native $customClassElement should be derived from HtmlElemen t or SvgElement.");
408 }
409
372 if (_hasCreatedConstructor(classMirror)) { 410 if (_hasCreatedConstructor(classMirror)) {
373 // Start the hookup the JS way create an <x-foo> element that extends the 411 // Start the hookup the JS way create an <x-foo> element that extends the
374 // <x-base> custom element. Inherit its prototype and signal what tag is 412 // <x-base> custom element. Inherit its prototype and signal what tag is
375 // inherited: 413 // inherited:
376 // 414 //
377 // var myProto = Object.create(HTMLElement.prototype); 415 // var myProto = Object.create(HTMLElement.prototype);
378 // var myElement = document.registerElement('x-foo', {prototype: myPro to}); 416 // var myElement = document.registerElement('x-foo', {prototype: myPro to});
379 var baseElement = js.JsNative.getProperty(js.context, jsClassName); 417 var baseElement = js.JsNative.getProperty(js.context, jsClassName);
380 if (baseElement == null) { 418 if (baseElement == null) {
381 // Couldn't find the HTML element so use a generic one. 419 // Couldn't find the HTML element so use a generic one.
(...skipping 16 matching lines...) Expand all
398 // 436 //
399 // See https://github.com/dart-lang/sdk/issues/23666 437 // See https://github.com/dart-lang/sdk/issues/23666
400 int creating = 0; 438 int creating = 0;
401 // TODO(jacobr): warning: 439 // TODO(jacobr): warning:
402 elemProto['createdCallback'] = js.JsNative.withThis(($this) { 440 elemProto['createdCallback'] = js.JsNative.withThis(($this) {
403 if (_getJSClassName(reflectClass(customElementClass).superclass) != null && creating < 2) { 441 if (_getJSClassName(reflectClass(customElementClass).superclass) != null && creating < 2) {
404 creating++; 442 creating++;
405 443
406 var dartClass; 444 var dartClass;
407 try { 445 try {
446 if (extendsTag != null) {
447 // If we're extending a native element then create that element.
448 // Then upgrade that element to the customElementClass through
449 // normal flow.
450 dartClass = document.createElement(extendsTag);
451 js.setDartHtmlWrapperFor($this, dartClass);
452 dartClass.blink_jsObject = $this;
453 }
454
455 // Upgrade to the CustomElement Dart class.
408 dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this); 456 dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this);
409 } catch (e) { 457 } catch (e) {
458 // Got a problem make it an HtmlElement and rethrow the error.
410 dartClass = HtmlElement.internalCreateHtmlElement(); 459 dartClass = HtmlElement.internalCreateHtmlElement();
460 // We need to remember the JS object (because constructElement faile d
461 // it normally sets up the blink_jsObject.
462 dartClass.blink_jsObject = $this;
463
464 // Mark to only try this once don't try upgrading from HtmlElement
465 // to the user's Dart class - we had a problem.
411 dartClass._badUpgrade(); 466 dartClass._badUpgrade();
412 throw e; 467 throw e;
413 } finally { 468 } finally {
414 // Need to remember the Dart class that was created for this custom so 469 // Need to remember the Dart class that was created for this custom so
415 // return it and setup the blink_jsObject to the $this that we'll be working 470 // return it and setup the blink_jsObject to the $this that we'll be working
416 // with as we talk to blink. 471 // with as we talk to blink.
417 js.setDartHtmlWrapperFor($this, dartClass); 472 js.setDartHtmlWrapperFor($this, dartClass);
418 473
419 creating--; 474 creating--;
420 } 475 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 /// parameter must be provided. 548 /// parameter must be provided.
494 @Experimental() 549 @Experimental()
495 ElementUpgrader createElementUpgrader(Type type, {String extendsTag}) { 550 ElementUpgrader createElementUpgrader(Type type, {String extendsTag}) {
496 $if DART2JS 551 $if DART2JS
497 return new _JSElementUpgrader(this, type, extendsTag); 552 return new _JSElementUpgrader(this, type, extendsTag);
498 $else 553 $else
499 return new _VMElementUpgrader(this, type, extendsTag); 554 return new _VMElementUpgrader(this, type, extendsTag);
500 $endif 555 $endif
501 } 556 }
502 } 557 }
OLDNEW
« no previous file with comments | « tools/dom/templates/html/impl/impl_CustomEvent.darttemplate ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698