Index: sdk/lib/html/dartium/html_dartium.dart |
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart |
index f262bece629db2d77d216fdc6b13a69d4fbc8834..63d115219c51e157c52002ba2f553273abe571c4 100644 |
--- a/sdk/lib/html/dartium/html_dartium.dart |
+++ b/sdk/lib/html/dartium/html_dartium.dart |
@@ -20148,7 +20148,8 @@ class HtmlDocument extends Document { |
while (classMirror.superclass != null) { |
var fullName = classMirror.superclass.qualifiedName; |
- isElement = isElement || (fullName == #dart.dom.html.Element); |
+ isElement = isElement || |
+ (fullName == #dart.dom.html.Element || fullName == #dart.dom.svg.Element); |
var domLibrary = MirrorSystem.getName(fullName).startsWith('dart.dom.'); |
if (jsClassName == null && domLibrary) { |
@@ -20158,7 +20159,7 @@ class HtmlDocument extends Document { |
var metaDataMirror = metadata.reflectee; |
var metaType = reflectClass(metaDataMirror.runtimeType); |
if (MirrorSystem.getName(metaType.simpleName) == 'DomName' && |
- metaDataMirror.name.startsWith('HTML')) { |
+ (metaDataMirror.name.startsWith('HTML') || metaDataMirror.name.startsWith('SVG'))) { |
jsClassName = metadata.reflectee.name; |
} |
} |
@@ -20172,6 +20173,37 @@ class HtmlDocument extends Document { |
} |
/** |
+ * Get the class that immediately derived from a class in dart:html or |
+ * dart:svg (has an attribute DomName of either HTML* or SVG*). |
+ */ |
+ ClassMirror _getDomSuperClass(ClassMirror classMirror) { |
+ var isElement = false; |
+ |
+ while (classMirror.superclass != null) { |
+ var fullName = classMirror.superclass.qualifiedName; |
+ isElement = isElement || (fullName == #dart.dom.html.Element || fullName == #dart.dom.svg.Element); |
+ |
+ var domLibrary = MirrorSystem.getName(fullName).startsWith('dart.dom.'); |
+ if (domLibrary) { |
+ // Lookup JS class (if not found). |
+ var metadatas = classMirror.metadata; |
+ for (var metadata in metadatas) { |
+ var metaDataMirror = metadata.reflectee; |
+ var metaType = reflectClass(metaDataMirror.runtimeType); |
+ if (MirrorSystem.getName(metaType.simpleName) == 'DomName' && |
+ (metaDataMirror.name.startsWith('HTML') || metaDataMirror.name.startsWith('SVG'))) { |
+ if (isElement) return classMirror; |
+ } |
+ } |
+ } |
+ |
+ classMirror = classMirror.superclass; |
+ } |
+ |
+ return null; |
+ } |
+ |
+ /** |
* Does this CustomElement class have: |
* |
* - a created constructor with no arguments? |
@@ -20179,26 +20211,39 @@ class HtmlDocument extends Document { |
* |
* e.g., MyCustomClass.created() : super.created(); |
*/ |
- bool _hasCreatedConstructor(ClassMirror classMirror) { |
- var createdParametersValid = false; |
- var superCreatedCalled = false; |
- var className = MirrorSystem.getName(classMirror.simpleName); |
- var methodMirror = classMirror.declarations[new Symbol("$className.created")]; |
- if (methodMirror != null) { |
- createdParametersValid = methodMirror.parameters.length == 0; |
- |
- // Get the created constructor source and look at the initializer; |
- // Must call super.created() if not its as an error. |
- var createdSource = methodMirror.source; |
- RegExp regExp = new RegExp(r":(.*?)(;|}|\n)"); |
- var match = regExp.firstMatch(createdSource); |
- superCreatedCalled = match.input.substring(match.start,match.end).contains("super.created()"); |
- } |
- |
- if (!superCreatedCalled) { |
- throw new DomException.jsInterop('created constructor initializer must call super.created()'); |
- } else if (!createdParametersValid) { |
- throw new DomException.jsInterop('created constructor must have no parameters'); |
+ bool _hasCreatedConstructor(ClassMirror classToRegister) { |
+ var htmlClassMirror = _getDomSuperClass(classToRegister); |
+ |
+ var classMirror = classToRegister; |
+ while (classMirror != null && classMirror != htmlClassMirror) { |
+ var createdParametersValid = false; |
+ var superCreatedCalled = false; |
+ var className = MirrorSystem.getName(classMirror.simpleName); |
+ var methodMirror = classMirror.declarations[new Symbol("$className.created")]; |
+ if (methodMirror != null && methodMirror.isConstructor) { |
+ createdParametersValid = true; // Assume no parameters. |
+ if (methodMirror.parameters.length != 0) { |
+ // If any parameters each one must be optional. |
+ methodMirror.parameters.forEach((parameter) { |
+ createdParametersValid = createdParametersValid && parameter.isOptional; |
+ }); |
+ } |
+ |
+ // Get the created constructor source and look at the initializer; |
+ // Must call super.created() if not its as an error. |
+ var createdSource = methodMirror.source.replaceAll('\n', ' '); |
+ RegExp regExp = new RegExp(r":(.*?)(;|}|\n)"); |
+ var match = regExp.firstMatch(createdSource); |
+ superCreatedCalled = match.input.substring(match.start,match.end).contains("super.created("); |
+ } |
+ |
+ if (!superCreatedCalled) { |
+ throw new DomException.jsInterop('created constructor initializer must call super.created()'); |
+ } else if (!createdParametersValid) { |
+ throw new DomException.jsInterop('created constructor must have no parameters'); |
+ } |
+ |
+ classMirror = classMirror.superclass; |
} |
return true; |