Index: lib/src/emitters.dart |
diff --git a/lib/src/emitters.dart b/lib/src/emitters.dart |
index 3fa27a94819cbc41eff4a94ab44043c56b180d3f..270ac6b518eefd8f219ee0247fbfe452ef82f4be 100644 |
--- a/lib/src/emitters.dart |
+++ b/lib/src/emitters.dart |
@@ -614,7 +614,7 @@ class WebComponentEmitter extends RecursiveEmitter { |
elemInfo.node.sourceSpan, |
"new autogenerated.DocumentFragment.html('''" |
"${escapeDartString(elemInfo.node.innerHtml, triple: true)}" |
- "''')"); |
+ "''', treeSanitizer: autogenerated.nullTreeSanitizer)"); |
_context.printer.addLine( |
"__root.nodes.add(__shadowTemplate.clone(true));"); |
} |
@@ -828,30 +828,52 @@ String _emitCreateHtml(Node node, Declarations statics) { |
var isHtml = node.namespace == 'http://www.w3.org/1999/xhtml'; |
var isSvg = node.namespace == 'http://www.w3.org/2000/svg'; |
var isEmpty = node.attributes.length == 0 && node.nodes.length == 0; |
+ var specialTags = const ['body', 'caption', 'col', 'colgroup', 'head', |
+ 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'track']; |
- var constructor; |
+ var expr; |
// Generate precise types like "new ButtonElement()" if we can. |
if (isEmpty && isHtml) { |
- constructor = htmlElementConstructors[node.tagName]; |
+ var constructor = htmlElementConstructors[node.tagName]; |
if (constructor != null) { |
- constructor = '$constructor()'; |
+ expr = 'new autogenerated.$constructor()'; |
} else { |
- constructor = "Element.tag('${node.tagName}')"; |
+ expr = "new autogenerated.Element.tag('${node.tagName}')"; |
} |
} else if (isEmpty && isSvg) { |
- constructor = "_svg.SvgElement.tag('${node.tagName}')"; |
- } else { |
+ expr = "new autogenerated_svg.SvgElement.tag('${node.tagName}')"; |
+ } else if (isSvg || !specialTags.contains(node.tagName)) { |
// TODO(sigmund): does this work for the mathml namespace? |
- var target = isSvg ? '_svg.SvgElement.svg' : 'Element.html'; |
- constructor = "$target('${escapeDartString(node.outerHtml)}')"; |
+ var constructor = isSvg ? 'autogenerated_svg.SvgElement.svg' |
+ : 'autogenerated.Element.html'; |
+ expr = "new $constructor(" |
+ "'${escapeDartString(node.outerHtml)}', " |
+ "treeSanitizer: autogenerated.nullTreeSanitizer)"; |
+ } else { |
+ expr = "autogenerated.createSafeNode('${node.tagName}'," |
+ " ${_attributesAsString(node.attributes)}," |
+ "'${escapeDartString(node.innerHtml)}')"; |
} |
- |
- var expr = 'new autogenerated.$constructor'; |
var varName = '__html${statics.declarations.length}'; |
statics.add('final', varName, node.sourceSpan, expr); |
return '${varName}.clone(true)'; |
} |
+String _attributesAsString(Map attributes) { |
+ var sb = new StringBuffer(); |
+ sb.write('{'); |
+ bool first = true; |
+ for (var key in attributes.keys) { |
+ if (!first) sb.write(','); |
+ first = false; |
+ var sKey = escapeDartString(key); |
+ var sValue = escapeDartString(attributes[key]); |
+ sb.write("'$sKey': '$sValue'"); |
+ } |
+ sb.write('}'); |
+ return sb.toString(); |
+} |
+ |
/** Trim down the html for the main html page. */ |
void transformMainHtml(Document document, FileInfo fileInfo, |
PathMapper pathMapper, bool hasCss, bool rewriteUrls, Messages messages, |