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

Side by Side Diff: tools/dom/templates/html/dartium/html_dartium.darttemplate

Issue 1409743003: Hide internal methods like wrap_jso from the dart:html public interface (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Review fixes 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
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 // DO NOT EDIT 5 // DO NOT EDIT
6 // Auto-generated dart:html library. 6 // Auto-generated dart:html library.
7 7
8 /** 8 /**
9 * HTML elements and other resources for web-based applications that need to 9 * HTML elements and other resources for web-based applications that need to
10 * interact with the browser and the DOM (Document Object Model). 10 * interact with the browser and the DOM (Document Object Model).
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 return null; 345 return null;
346 } 346 }
347 347
348 348
349 /****************************************************************************** 349 /******************************************************************************
350 ********** ********** 350 ********** **********
351 ********** JS Interop Support ********** 351 ********** JS Interop Support **********
352 ********** ********** 352 ********** **********
353 ******************************************************************************/ 353 ******************************************************************************/
354 354
355 // List of known tagName to DartClass for custom elements, used for upgrade.
356 var _knownCustomElements = new Map<String, Map<Type, String>>();
357
358 void _addCustomElementType(String tagName, Type dartClass, [String extendTag]) {
359 _knownCustomElements[tagName] =
360 {'type': dartClass, 'extends': extendTag != null ? extendTag : "" };
361 }
362
363 Type _getCustomElementType(object) {
364 var entry = _getCustomElementEntry(object);
365 if (entry != null) {
366 return entry['type'];
367 }
368 return null;
369 }
370
371 String _getCustomElementExtends(object) { 355 String _getCustomElementExtends(object) {
372 var entry = _getCustomElementEntry(object); 356 var entry = getCustomElementEntry(object);
373 if (entry != null) { 357 if (entry != null) {
374 return entry['extends']; 358 return entry['extends'];
375 } 359 }
376 return null; 360 return null;
377 } 361 }
378 362
379 _getCustomElementEntry(element) {
380 var hasAttribute = false;
381
382 var jsObject;
383 var tag = "";
384 var runtimeType = element.runtimeType;
385 if (runtimeType == HtmlElement) {
386 tag = element.localName;
387 } else if (runtimeType == TemplateElement) {
388 // Data binding with a Dart class.
389 tag = element.attributes['is'];
390 } else if (runtimeType == js.JsObjectImpl) {
391 // It's a Polymer core element (written in JS).
392 // Make sure it's an element anything else we can ignore.
393 if (element.hasProperty('nodeType') && element['nodeType'] == 1) {
394 if (js.JsNative.callMethod(element, 'hasAttribute', ['is'])) {
395 hasAttribute = true;
396 // It's data binding use the is attribute.
397 tag = js.JsNative.callMethod(element, 'getAttribute', ['is']);
398 } else {
399 // It's a custom element we want the local name.
400 tag = element['localName'];
401 }
402 }
403 } else {
404 throw new UnsupportedError('Element is incorrect type. Got ${runtimeType}, e xpected HtmlElement/HtmlTemplate/JsObjectImpl.');
405 }
406
407 var entry = _knownCustomElements[tag];
408 if (entry != null) {
409 // If there's an 'is' attribute then check if the extends tag registered
410 // matches the tag if so then return the entry that's registered for this
411 // extendsTag or if there's no 'is' tag then return the entry found.
412 if ((hasAttribute && entry['extends'] == tag) || !hasAttribute) {
413 return entry;
414 }
415 }
416
417 return null;
418 }
419
420 // Return the tag name or is attribute of the custom element or data binding. 363 // Return the tag name or is attribute of the custom element or data binding.
421 String _getCustomElementName(element) { 364 String _getCustomElementName(element) {
422 var jsObject; 365 var jsObject;
423 var tag = ""; 366 var tag = "";
424 var runtimeType = element.runtimeType; 367 var runtimeType = element.runtimeType;
425 if (runtimeType == HtmlElement) { 368 if (runtimeType == HtmlElement) {
426 tag = element.localName; 369 tag = element.localName;
427 } else if (runtimeType == TemplateElement) { 370 } else if (runtimeType == TemplateElement) {
428 // Data binding with a Dart class. 371 // Data binding with a Dart class.
429 tag = element.attributes['is']; 372 tag = element.attributes['is'];
(...skipping 18 matching lines...) Expand all
448 391
449 /// An abstract class for all DOM objects we wrap in dart:html and related 392 /// An abstract class for all DOM objects we wrap in dart:html and related
450 /// libraries. 393 /// libraries.
451 class DartHtmlDomObject { 394 class DartHtmlDomObject {
452 395
453 /// The underlying JS DOM object. 396 /// The underlying JS DOM object.
454 js.JsObject blink_jsObject; 397 js.JsObject blink_jsObject;
455 398
456 } 399 }
457 400
458 // Flag to disable JS interop asserts. Setting to false will speed up the 401 /// Upgrade a Dart HtmlElement to the user's Dart custom element class.
459 // wrap_jso calls.
460 bool __interop_checks = false;
461
462 /** Expando for JsObject, used by every Dart class associated with a Javascript
463 * class (e.g., DOM, WebAudio, etc.).
464 */
465
466 /**
467 * Return the JsObject associated with a Dart class [dartClass_instance].
468 */
469 unwrap_jso(dartClass_instance) => js.unwrap_jso(dartClass_instance);
470
471 /**
472 * Create Dart class that maps to the JS Type, add the JsObject as an expando
473 * on the Dart class and return the created Dart class.
474 */
475 wrap_jso(jsObject) {
476 try {
477 if (jsObject is! js.JsObject || jsObject == null) {
478 // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
479 // or it's a simple type.
480 return jsObject;
481 }
482
483 var wrapper = js.getDartHtmlWrapperFor(jsObject);
484 // if we have a wrapper return the Dart instance.
485 if (wrapper != null) {
486 var customElementClass = _getCustomElementType(wrapper.blink_jsObject);
487 if (wrapper.runtimeType != customElementClass && customElementClass != nul l) {
488 if (wrapper.runtimeType == HtmlElement && !wrapper._isBadUpgrade) {
489 // We're a Dart instance if it's HtmlElement and we have a customEleme nt
490 // class then we need to upgrade.
491 if (customElementClass != null) {
492 var dartClass_instance;
493 try {
494 dartClass_instance = _blink.Blink_Utils.constructElement(customEle mentClass, jsObject);
495 } finally {
496 dartClass_instance.blink_jsObject = jsObject;
497 return dartClass_instance;
498 }
499 }
500 }
501 }
502
503 return wrapper;
504 }
505
506 if (jsObject is js.JsArray) {
507 var wrappingList = new _DartHtmlWrappingList(jsObject);
508 js.setDartHtmlWrapperFor(jsObject, wrappingList);
509 return wrappingList;
510 }
511
512 // Try the most general type conversions on it.
513 // TODO(alanknight): We may be able to do better. This maintains identity,
514 // which is useful, but expensive. And if we nest something that only
515 // this conversion handles, how does that work? e.g. a list of maps of eleme nts.
516 var converted = convertNativeToDart_SerializedScriptValue(jsObject);
517 if (!identical(converted, jsObject)) {
518 return converted;
519 }
520
521 var constructor = js.JsNative.getProperty(jsObject, 'constructor');
522 if (constructor == null) {
523 // Perfectly valid case for JavaScript objects where __proto__ has
524 // intentionally been set to null.
525 js.setDartHtmlWrapperFor(jsObject, jsObject);
526 return jsObject;
527 }
528 var jsTypeName = js.JsNative.getProperty(constructor, 'name');
529 if (jsTypeName is! String || jsTypeName.length == 0) {
530 // Not an html type.
531 js.setDartHtmlWrapperFor(jsObject, jsObject);
532 return jsObject;
533 }
534
535 var dartClass_instance;
536 var customElementClass = null;
537 var extendsTag = "";
538 var custom = _getCustomElementEntry(jsObject);
539 if (custom != null) {
540 customElementClass = custom['type'];
541 extendsTag = custom['extends'];
542 }
543
544 // Custom Element to upgrade.
545 // Only allow custome elements to be created in the html or svg default
546 // namespace.
547 var defaultNS = jsObject['namespaceURI'] == 'http://www.w3.org/1999/xhtml' | |
548 jsObject['namespaceURI'] == 'http://www.w3.org/2000/svg';
549 if (customElementClass != null && extendsTag == "" && defaultNS) {
550 try {
551 dartClass_instance = _blink.Blink_Utils.constructElement(customElementCl ass, jsObject);
552 } finally {
553 dartClass_instance.blink_jsObject = jsObject;
554 js.setDartHtmlWrapperFor(jsObject, dartClass_instance);
555 }
556 } else {
557 var func = getHtmlCreateFunction(jsTypeName);
558 if (func == null) {
559 if (jsTypeName == 'auto-binding') {
560 func = getHtmlCreateFunction("HTMLTemplateElement");
561 } else if (jsObject.toString() == "[object HTMLElement]") {
562 // One last ditch effort could be a JS custom element.
563 func = getHtmlCreateFunction("HTMLElement");
564 }
565 }
566 if (func != null) {
567 dartClass_instance = func();
568 dartClass_instance.blink_jsObject = jsObject;
569 js.setDartHtmlWrapperFor(jsObject, dartClass_instance);
570 }
571 }
572
573 // TODO(jacobr): cache that this is not a dart:html JS class.
574 return dartClass_instance;
575 } catch(e, stacktrace){
576 if (__interop_checks) {
577 if (e is DebugAssertException)
578 window.console.log("${e.message}\n ${stacktrace}");
579 else
580 window.console.log("${stacktrace}");
581 }
582 }
583
584 return null;
585 }
586
587 /**
588 * Create Dart class that maps to the JS Type, add the JsObject as an expando
589 * on the Dart class and return the created Dart class.
590 */
591 wrap_jso_no_SerializedScriptvalue(jsObject) {
592 try {
593 if (jsObject is! js.JsObject || jsObject == null) {
594 // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
595 // or it's a simple type.
596 return jsObject;
597 }
598
599 // TODO(alanknight): With upgraded custom elements this causes a failure bec ause
600 // we need a new wrapper after the type changes. We could possibly invalidat e this
601 // if the constructor name didn't match?
602 var wrapper = js.getDartHtmlWrapperFor(jsObject);
603 if (wrapper != null) {
604 return wrapper;
605 }
606
607 if (jsObject is js.JsArray) {
608 var wrappingList = new _DartHtmlWrappingList(jsObject);
609 js.setDartHtmlWrapperFor(jsObject, wrappingList);
610 return wrappingList;
611 }
612
613 var constructor = js.JsNative.getProperty(jsObject, 'constructor');
614 if (constructor == null) {
615 // Perfectly valid case for JavaScript objects where __proto__ has
616 // intentionally been set to null.
617 js.setDartHtmlWrapperFor(jsObject, jsObject);
618 return jsObject;
619 }
620 var jsTypeName = js.JsNative.getProperty(constructor, 'name');
621 if (jsTypeName is! String || jsTypeName.length == 0) {
622 // Not an html type.
623 js.setDartHtmlWrapperFor(jsObject, jsObject);
624 return jsObject;
625 }
626
627 var func = getHtmlCreateFunction(jsTypeName);
628 if (func != null) {
629 var dartClass_instance = func();
630 dartClass_instance.blink_jsObject = jsObject;
631 js.setDartHtmlWrapperFor(jsObject, dartClass_instance);
632 return dartClass_instance;
633 }
634 return jsObject;
635 } catch(e, stacktrace){
636 if (__interop_checks) {
637 if (e is DebugAssertException)
638 window.console.log("${e.message}\n ${stacktrace}");
639 else
640 window.console.log("${stacktrace}");
641 }
642 }
643
644 return null;
645 }
646
647 /**
648 * Create Dart class that maps to the JS Type that is the JS type being
649 * extended using JS interop createCallback (we need the base type of the
650 * custom element) not the Dart created constructor.
651 */
652 wrap_jso_custom_element(jsObject) {
653 try {
654 if (jsObject is! js.JsObject) {
655 // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
656 return jsObject;
657 }
658
659 // Find out what object we're extending.
660 var objectName = jsObject.toString();
661 // Expect to see something like '[object HTMLElement]'.
662 if (!objectName.startsWith('[object ')) {
663 return jsObject;
664 }
665
666 var extendsClass = objectName.substring(8, objectName.length - 1);
667 var func = getHtmlCreateFunction(extendsClass);
668 if (__interop_checks)
669 debug_or_assert("func != null name = ${extendsClass}", func != null);
670 var dartClass_instance = func();
671 dartClass_instance.blink_jsObject = jsObject;
672 return dartClass_instance;
673 } catch(e, stacktrace){
674 if (__interop_checks) {
675 if (e is DebugAssertException)
676 window.console.log("${e.message}\n ${stacktrace}");
677 else
678 window.console.log("${stacktrace}");
679 }
680
681 // Problem?
682 return null;
683 }
684 }
685
686 // Upgrade a Dart HtmlElement to the user's Dart custom element class.
687 _upgradeHtmlElement(dartInstance) { 402 _upgradeHtmlElement(dartInstance) {
688 // Only try upgrading HtmlElement (Dart class) if there is a failure then 403 // Only try upgrading HtmlElement (Dart class) if there is a failure then
689 // don't try it again - one failure is enough. 404 // don't try it again - one failure is enough.
690 if (dartInstance.runtimeType == HtmlElement && !dartInstance._isBadUpgrade) { 405 if (dartInstance.runtimeType == HtmlElement && !dartInstance.isBadUpgrade) {
691 // Must be exactly HtmlElement not something derived from it. 406 // Must be exactly HtmlElement not something derived from it.
692 407
693 var customElementClass = _getCustomElementType(dartInstance); 408 var customElementClass = getCustomElementType(dartInstance);
694 409
695 // Custom Element to upgrade. 410 // Custom Element to upgrade.
696 if (customElementClass != null) { 411 if (customElementClass != null) {
697 var jsObject = dartInstance.blink_jsObject; 412 var jsObject = dartInstance.blink_jsObject;
698 try { 413 try {
699 dartInstance = _blink.Blink_Utils.constructElement(customElementClass, j sObject); 414 dartInstance = _blink.Blink_Utils.constructElement(customElementClass, j sObject);
700 } catch (e) { 415 } catch (e) {
701 dartInstance._badUpgrade(); 416 dartInstance._badUpgrade();
702 } finally { 417 } finally {
703 dartInstance.blink_jsObject = jsObject; 418 dartInstance.blink_jsObject = jsObject;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 454
740 Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) { 455 Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
741 var result = new Map(); 456 var result = new Map();
742 var keys = js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'Object' ), 'keys', [jsObject]); 457 var keys = js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'Object' ), 'keys', [jsObject]);
743 for (var key in keys) { 458 for (var key in keys) {
744 result[key] = wrap_jso(js.JsNative.getProperty(jsObject, key)); 459 result[key] = wrap_jso(js.JsNative.getProperty(jsObject, key));
745 } 460 }
746 return result; 461 return result;
747 } 462 }
748 463
749 // Converts a flat Dart map into a JavaScript object with properties this is
750 // is the Dartium only version it uses dart:js.
751 // TODO(alanknight): This could probably be unified with the dart2js conversions
752 // code in html_common and be more general.
753 convertDartToNative_Dictionary(Map dict) {
754 if (dict == null) return null;
755 var jsObject = new js.JsObject(js.JsNative.getProperty(js.context, 'Object'));
756 dict.forEach((String key, value) {
757 if (value is List) {
758 var jsArray = new js.JsArray();
759 value.forEach((elem) {
760 jsArray.add(elem is Map ? convertDartToNative_Dictionary(elem): elem);
761 });
762 jsObject[key] = jsArray;
763 } else {
764 jsObject[key] = value;
765 }
766 });
767 return jsObject;
768 }
769
770 // Converts a Dart list into a JsArray. For the Dartium version only.
771 convertDartToNative_List(List input) => new js.JsArray()..addAll(input);
772
773 // Conversion function place holder (currently not used in dart2js or dartium).
774 List convertDartToNative_StringArray(List<String> input) => input;
775
776 /**
777 * Wraps a JsArray and will call wrap_jso on its entries.
778 */
779 class _DartHtmlWrappingList extends ListBase implements NativeFieldWrapperClass2 {
780 _DartHtmlWrappingList(this.blink_jsObject);
781
782 final js.JsArray blink_jsObject;
783
784 operator [](int index) => wrap_jso(js.JsNative.getArrayIndex(blink_jsObject, i ndex));
785
786 operator []=(int index, value) => blink_jsObject[index] = value;
787
788 int get length => blink_jsObject.length;
789 int set length(int newLength) => blink_jsObject.length = newLength;
790 }
791
792 /** 464 /**
793 * Upgrade the JS HTMLElement to the Dart class. Used by Dart's Polymer. 465 * Upgrade the JS HTMLElement to the Dart class. Used by Dart's Polymer.
794 */ 466 */
795 createCustomUpgrader(Type customElementClass, $this) { 467 _createCustomUpgrader(Type customElementClass, $this) {
796 var dartClass; 468 var dartClass;
797 try { 469 try {
798 dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this); 470 dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this);
799 } catch (e) { 471 } catch (e) {
800 dartClass._badUpgrade(); 472 dartClass._badUpgrade();
801 throw e; 473 throw e;
802 } finally { 474 } finally {
803 // Need to remember the Dart class that was created for this custom so 475 // Need to remember the Dart class that was created for this custom so
804 // return it and setup the blink_jsObject to the $this that we'll be working 476 // return it and setup the blink_jsObject to the $this that we'll be working
805 // with as we talk to blink. 477 // with as we talk to blink.
806 js.setDartHtmlWrapperFor($this, dartClass); 478 js.setDartHtmlWrapperFor($this, dartClass);
807 } 479 }
808 480
809 return dartClass; 481 return dartClass;
810 } 482 }
811 483
812 $else 484 $else
813 class DartHtmlDomObject extends NativeFieldWrapperClass2 {} 485 class DartHtmlDomObject extends NativeFieldWrapperClass2 {}
814 486
815 unwrap_jso(dartClass_instance) => dartClass_instance; 487 _createCustomUpgrader(Type customElementClass, $this) => $this;
816 wrap_jso(jsObject) => jsObject;
817 convertDartToNative_Dictionary(Map dict) => dict;
818 List convertDartToNative_StringArray(List<String> input) => input;
819 convertDartToNative_List(List input) => input;
820 createCustomUpgrader(Type customElementClass, $this) => $this;
821 488
822 $endif 489 $endif
OLDNEW
« no previous file with comments | « tools/dom/src/dartium_CustomElementSupport.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