diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart index fcfeafc96e2..9ceaa5bfb8e 100644 --- a/sdk/lib/html/dart2js/html_dart2js.dart +++ b/sdk/lib/html/dart2js/html_dart2js.dart @@ -32931,7 +32931,18 @@ void _registerCustomElement(context, document, String tag, Type type, if (baseClassName == null) { throw new ArgumentError(type); } - if (baseClassName == 'Element') baseClassName = 'HTMLElement'; + + if (extendsTagName == null) { + if (baseClassName != 'HTMLElement') { + throw new UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HTMLElement'); + } + } else { + if (!JS('bool', '(#.createElement(#) instanceof window[#])', + document, extendsTagName, baseClassName)) { + throw new UnsupportedError('extendsTag does not match base native class'); + } + } var baseConstructor = JS('=Object', '#[#]', context, baseClassName); diff --git a/tests/html/html.status b/tests/html/html.status index d3d7586755f..50984d8478e 100644 --- a/tests/html/html.status +++ b/tests/html/html.status @@ -411,6 +411,3 @@ async_test: Timeout # Issue 13719: Please triage this failure. dromaeo_smoke_test: Fail # Issue 13719: Please triage this failure. element_offset_test/offset: Pass, Fail # Issue 13719, 13296 touchevent_test/supported: Fail # Issue 13719: Please triage this failure. - -[ $compiler == dart2js ] -custom/document_register_type_extensions_test/registration: Fail # Issue 14093 diff --git a/tools/dom/src/dart2js_CustomElementSupport.dart b/tools/dom/src/dart2js_CustomElementSupport.dart index 6f8aedb2e33..00e17b20569 100644 --- a/tools/dom/src/dart2js_CustomElementSupport.dart +++ b/tools/dom/src/dart2js_CustomElementSupport.dart @@ -75,7 +75,18 @@ void _registerCustomElement(context, document, String tag, Type type, if (baseClassName == null) { throw new ArgumentError(type); } - if (baseClassName == 'Element') baseClassName = 'HTMLElement'; + + if (extendsTagName == null) { + if (baseClassName != 'HTMLElement') { + throw new UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HTMLElement'); + } + } else { + if (!JS('bool', '(#.createElement(#) instanceof window[#])', + document, extendsTagName, baseClassName)) { + throw new UnsupportedError('extendsTag does not match base native class'); + } + } var baseConstructor = JS('=Object', '#[#]', context, baseClassName);