| Index: tools/dom/templates/html/impl/impl_SVGElement.darttemplate
|
| diff --git a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
|
| index 9e87d5b7e98f6254b790b9249ee2504ca977223c..576854b83edfc1a55fec97ac398676ca4961742a 100644
|
| --- a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
|
| +++ b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
|
| @@ -31,10 +31,28 @@ class _AttributeClassSet extends CssClassSetImpl {
|
| }
|
|
|
| $(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
|
| + static final _START_TAG_REGEXP = new RegExp('<(\\w+)');
|
| +
|
| factory $CLASSNAME.tag(String tag) =>
|
| - _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_tag(tag);
|
| - factory $CLASSNAME.svg(String svg) =>
|
| - _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_svg(svg);
|
| + document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
|
| + factory $CLASSNAME.svg(String svg,
|
| + {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
|
| +
|
| + if (validator == null && treeSanitizer == null) {
|
| + validator = new NodeValidatorBuilder.common()..allowSvg();
|
| + }
|
| +
|
| + final match = _START_TAG_REGEXP.firstMatch(svg);
|
| + var parentElement;
|
| + if (match != null && match.group(1).toLowerCase() == 'svg') {
|
| + parentElement = document.body;
|
| + } else {
|
| + parentElement = new SvgSvgElement();
|
| + }
|
| + var fragment = parentElement.createFragment(svg, validator: validator,
|
| + treeSanitizer: treeSanitizer);
|
| + return fragment.nodes.where((e) => e is SvgElement).single;
|
| + }
|
|
|
| _AttributeClassSet _cssClassSet;
|
| CssClassSet get classes {
|
| @@ -66,12 +84,33 @@ $(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
|
| return container.innerHtml;
|
| }
|
|
|
| - void set innerHtml(String svg) {
|
| - final container = new Element.tag("div");
|
| - // Wrap the SVG string in <svg> so that SvgElements are created, rather than
|
| - // HTMLElements.
|
| - container.innerHtml = '<svg version="1.1">$svg</svg>';
|
| - this.children = container.children[0].children;
|
| + void set innerHtml(String value) {
|
| + this.setInnerHtml(value);
|
| + }
|
| +
|
| + DocumentFragment createFragment(String svg,
|
| + {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
|
| +
|
| + if (treeSanitizer == null) {
|
| + if (validator == null) {
|
| + validator = new NodeValidatorBuilder.common()
|
| + ..allowSvg();
|
| + }
|
| + treeSanitizer = new NodeTreeSanitizer(validator);
|
| + }
|
| +
|
| + // We create a fragment which will parse in the HTML parser
|
| + var html = '<svg version="1.1">$svg</svg>';
|
| + var fragment = document.body.createFragment(html,
|
| + treeSanitizer: treeSanitizer);
|
| +
|
| + var svgFragment = new DocumentFragment();
|
| + // The root is the <svg/> element, need to pull out the contents.
|
| + var root = fragment.nodes.single;
|
| + while (root.firstChild != null) {
|
| + svgFragment.append(root.firstChild);
|
| + }
|
| + return svgFragment;
|
| }
|
|
|
| // Unsupported methods inherited from Element.
|
|
|