Index: tools/dom/src/dartium_CustomElementSupport.dart |
diff --git a/tools/dom/src/dartium_CustomElementSupport.dart b/tools/dom/src/dartium_CustomElementSupport.dart |
index 85ff4d6aca78a57460bc5bff8ee08d3dd4ab552c..c91ab72034051200832e2bb5ca8e29b0265eb8ce 100644 |
--- a/tools/dom/src/dartium_CustomElementSupport.dart |
+++ b/tools/dom/src/dartium_CustomElementSupport.dart |
@@ -8,9 +8,11 @@ part of dart.dom.html; |
class _VMElementUpgrader implements ElementUpgrader { |
final Type _type; |
final Type _nativeType; |
+ final String _extendsTag; |
_VMElementUpgrader(Document document, Type type, String extendsTag) : |
_type = type, |
+ _extendsTag = extendsTag, |
_nativeType = _validateCustomType(type).reflectedType { |
if (extendsTag == null) { |
@@ -28,20 +30,39 @@ class _VMElementUpgrader implements ElementUpgrader { |
Element upgrade(element) { |
var jsObject; |
- var tag = _getCustomElementName(element); |
+ var tag; |
+ var isNativeElementExtension = false; |
+ |
+ try { |
+ tag = _getCustomElementName(element); |
+ } catch (e) { |
+ isNativeElementExtension = element.localName == _extendsTag; |
+ } |
+ |
if (element.runtimeType == HtmlElement || element.runtimeType == TemplateElement) { |
+ if (tag != _extendsTag) { |
+ throw new UnsupportedError('$tag is not registered.'); |
+ } |
jsObject = unwrap_jso(element); |
} else if (element.runtimeType == js.JsObjectImpl) { |
// It's a Polymer core element (written in JS). |
jsObject = element; |
- } else { |
+ } else if (isNativeElementExtension) { |
+ // Extending a native element. |
+ jsObject = element.blink_jsObject; |
+ |
+ // Element to extend is the real tag. |
+ tag = element.localName; |
+ } else if (tag != null && element.localName != tag) { |
+ throw new UnsupportedError('Element is incorrect type. Got ${element.runtimeType}, expected native Html or Svg element to extend.'); |
+ } else if (tag == null) { |
throw new UnsupportedError('Element is incorrect type. Got ${element.runtimeType}, expected HtmlElement/JsObjectImpl.'); |
} |
// Remember Dart class to tagName for any upgrading done in wrap_jso. |
- _addCustomElementType(tag, _type); |
+ _addCustomElementType(tag, _type, _extendsTag); |
- return createCustomUpgrader(_nativeType, jsObject); |
+ return createCustomUpgrader(_type, jsObject); |
} |
} |