| Index: sdk/lib/svg/dart2js/svg_dart2js.dart
|
| diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
|
| index cf6b778bae5f05523180979cc3e33562fd6383d3..7d4f71b96cdd91a03115a875fa9397df627d68ec 100644
|
| --- a/sdk/lib/svg/dart2js/svg_dart2js.dart
|
| +++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
|
| @@ -21,40 +21,12 @@ import 'dart:_interceptors' show Interceptor;
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
|
|
| -final _START_TAG_REGEXP = new RegExp('<(\\w+)');
|
| -
|
| class _SvgElementFactoryProvider {
|
| static SvgElement createSvgElement_tag(String tag) {
|
| final Element temp =
|
| document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
|
| return temp;
|
| }
|
| -
|
| - static SvgElement createSvgElement_svg(String svg) {
|
| - Element parentTag;
|
| - final match = _START_TAG_REGEXP.firstMatch(svg);
|
| - if (match != null && match.group(1).toLowerCase() == 'svg') {
|
| - parentTag = new Element.tag('div');
|
| - } else {
|
| - parentTag = new SvgSvgElement();
|
| - }
|
| -
|
| - parentTag.innerHtml = svg;
|
| - if (parentTag.children.length == 1) return parentTag.children.removeLast();
|
| -
|
| - throw new ArgumentError(
|
| - 'SVG had ${parentTag.children.length} '
|
| - 'top-level children but 1 expected');
|
| - }
|
| -}
|
| -
|
| -class _SvgSvgElementFactoryProvider {
|
| - static SvgSvgElement createSvgSvgElement() {
|
| - final el = new SvgElement.tag("svg");
|
| - // The SVG spec requires the version attribute to match the spec version
|
| - el.attributes['version'] = "1.1";
|
| - return el;
|
| - }
|
| }
|
| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| @@ -4757,10 +4729,28 @@ class _AttributeClassSet extends CssClassSetImpl {
|
| @DomName('SVGElement')
|
| @Unstable()
|
| class SvgElement extends Element native "SVGElement" {
|
| + static final _START_TAG_REGEXP = new RegExp('<(\\w+)');
|
| +
|
| factory SvgElement.tag(String tag) =>
|
| - _SvgElementFactoryProvider.createSvgElement_tag(tag);
|
| - factory SvgElement.svg(String svg) =>
|
| - _SvgElementFactoryProvider.createSvgElement_svg(svg);
|
| + document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
|
| + factory SvgElement.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 {
|
| @@ -4792,12 +4782,33 @@ class SvgElement extends Element native "SVGElement" {
|
| 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.
|
| @@ -4876,7 +4887,12 @@ class SvgElement extends Element native "SVGElement" {
|
| @DomName('SVGSVGElement')
|
| @Unstable()
|
| class SvgSvgElement extends GraphicsElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan native "SVGSVGElement" {
|
| - factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
|
| + factory SvgSvgElement() {
|
| + final el = new SvgElement.tag("svg");
|
| + // The SVG spec requires the version attribute to match the spec version
|
| + el.attributes['version'] = "1.1";
|
| + return el;
|
| + }
|
|
|
| // To suppress missing implicit constructor warnings.
|
| factory SvgSvgElement._() { throw new UnsupportedError("Not supported"); }
|
|
|