63a57a76ce
This reverts commit f8ff12008e.
This CL is a revert of the initial revert and should be landed once
Flutter changes have been merged to handle the changes here.
Change-Id: I300a5efd776bf2a596743971f4e15ad62da77f5a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/153368
Commit-Queue: Srujan Gaddam <srujzs@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
152 lines
4.5 KiB
Plaintext
152 lines
4.5 KiB
Plaintext
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
part of $LIBRARYNAME;
|
|
|
|
class AttributeClassSet extends CssClassSetImpl {
|
|
final Element _element;
|
|
|
|
AttributeClassSet(this._element);
|
|
|
|
Set<String> readClasses() {
|
|
var classname = _element.attributes['class'];
|
|
if (classname is AnimatedString) {
|
|
classname = (classname as AnimatedString).baseVal;
|
|
}
|
|
|
|
Set<String> s = new LinkedHashSet<String>();
|
|
if (classname == null) {
|
|
return s;
|
|
}
|
|
for (String name in classname.split(' ')) {
|
|
String trimmed = name.trim();
|
|
if (!trimmed.isEmpty) {
|
|
s.add(trimmed);
|
|
}
|
|
}
|
|
return s;
|
|
}
|
|
|
|
void writeClasses(Set s) {
|
|
_element.setAttribute('class', s.join(' '));
|
|
}
|
|
}
|
|
|
|
$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
|
|
static final _START_TAG_REGEXP = new RegExp('<(\\w+)');
|
|
|
|
factory $CLASSNAME.tag(String tag) =>
|
|
document.createElementNS("http://www.w3.org/2000/svg", tag) $#NULLSAFECAST(as $CLASSNAME);
|
|
factory $CLASSNAME.svg(String svg,
|
|
{NodeValidator$NULLABLE validator,
|
|
NodeTreeSanitizer$NULLABLE 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)$NULLASSERT.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;
|
|
}
|
|
|
|
CssClassSet get classes => new AttributeClassSet(this);
|
|
|
|
List<Element> get children => new FilteredElementList(this);
|
|
|
|
set children(List<Element> value) {
|
|
final children = this.children;
|
|
children.clear();
|
|
children.addAll(value);
|
|
}
|
|
|
|
String$NULLABLE get outerHtml {
|
|
final container = new DivElement();
|
|
final SvgElement cloned = this.clone(true) $#NULLSAFECAST(as SvgElement);
|
|
container.children.add(cloned);
|
|
return container.innerHtml;
|
|
}
|
|
|
|
String$NULLABLE get innerHtml {
|
|
final container = new DivElement();
|
|
final SvgElement cloned = this.clone(true) $#NULLSAFECAST(as SvgElement);
|
|
container.children.addAll(cloned.children);
|
|
return container.innerHtml;
|
|
}
|
|
|
|
set innerHtml(String$NULLABLE value) {
|
|
this.setInnerHtml(value);
|
|
}
|
|
|
|
DocumentFragment createFragment(String$NULLABLE svg,
|
|
{NodeValidator$NULLABLE validator,
|
|
NodeTreeSanitizer$NULLABLE 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$NULLASSERT.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$NULLASSERT);
|
|
}
|
|
return svgFragment;
|
|
}
|
|
|
|
// Unsupported methods inherited from Element.
|
|
|
|
void insertAdjacentText(String where, String text) {
|
|
throw new UnsupportedError("Cannot invoke insertAdjacentText on SVG.");
|
|
}
|
|
|
|
void insertAdjacentHtml(String where, String text,
|
|
{NodeValidator$NULLABLE validator,
|
|
NodeTreeSanitizer$NULLABLE treeSanitizer}) {
|
|
throw new UnsupportedError("Cannot invoke insertAdjacentHtml on SVG.");
|
|
}
|
|
|
|
Element insertAdjacentElement(String where, Element element) {
|
|
throw new UnsupportedError("Cannot invoke insertAdjacentElement on SVG.");
|
|
}
|
|
|
|
HtmlCollection get _children {
|
|
throw new UnsupportedError("Cannot get _children on SVG.");
|
|
}
|
|
|
|
bool get isContentEditable => false;
|
|
void click() {
|
|
throw new UnsupportedError("Cannot invoke click SVG.");
|
|
}
|
|
|
|
/**
|
|
* Checks to see if the SVG element type is supported by the current platform.
|
|
*
|
|
* The tag should be a valid SVG element tag name.
|
|
*/
|
|
static bool isTagSupported(String tag) {
|
|
var e = new $CLASSNAME.tag(tag);
|
|
return e is $CLASSNAME && !(e is UnknownElement);
|
|
}
|
|
|
|
$!MEMBERS
|
|
}
|