| Index: tools/dom/src/NodeValidatorBuilder.dart
|
| diff --git a/tools/dom/src/NodeValidatorBuilder.dart b/tools/dom/src/NodeValidatorBuilder.dart
|
| index 24f079b47488f3820612ca58c9b2a965d2953673..bcf807c5472398fe502c473d9883a18f6f4a83c1 100644
|
| --- a/tools/dom/src/NodeValidatorBuilder.dart
|
| +++ b/tools/dom/src/NodeValidatorBuilder.dart
|
| @@ -4,7 +4,6 @@
|
|
|
| part of dart.dom.html;
|
|
|
| -
|
| /**
|
| * Class which helps construct standard node validation policies.
|
| *
|
| @@ -22,11 +21,9 @@ part of dart.dom.html;
|
| * appropriate.
|
| */
|
| class NodeValidatorBuilder implements NodeValidator {
|
| -
|
| final List<NodeValidator> _validators = <NodeValidator>[];
|
|
|
| - NodeValidatorBuilder() {
|
| - }
|
| + NodeValidatorBuilder() {}
|
|
|
| /**
|
| * Creates a new NodeValidatorBuilder which accepts common constructs.
|
| @@ -155,29 +152,17 @@ class NodeValidatorBuilder implements NodeValidator {
|
| {UriPolicy uriPolicy,
|
| Iterable<String> attributes,
|
| Iterable<String> uriAttributes}) {
|
| -
|
| var tagNameUpper = tagName.toUpperCase();
|
| - var attrs;
|
| - if (attributes != null) {
|
| - attrs =
|
| - attributes.map((name) => '$tagNameUpper::${name.toLowerCase()}');
|
| - }
|
| - var uriAttrs;
|
| - if (uriAttributes != null) {
|
| - uriAttrs =
|
| - uriAttributes.map((name) => '$tagNameUpper::${name.toLowerCase()}');
|
| - }
|
| + var attrs = attributes
|
| + ?.map /*<String>*/ ((name) => '$tagNameUpper::${name.toLowerCase()}');
|
| + var uriAttrs = uriAttributes
|
| + ?.map /*<String>*/ ((name) => '$tagNameUpper::${name.toLowerCase()}');
|
| if (uriPolicy == null) {
|
| uriPolicy = new UriPolicy();
|
| }
|
|
|
| add(new _CustomElementNodeValidator(
|
| - uriPolicy,
|
| - [tagNameUpper],
|
| - attrs,
|
| - uriAttrs,
|
| - false,
|
| - true));
|
| + uriPolicy, [tagNameUpper], attrs, uriAttrs, false, true));
|
| }
|
|
|
| /**
|
| @@ -192,37 +177,26 @@ class NodeValidatorBuilder implements NodeValidator {
|
| {UriPolicy uriPolicy,
|
| Iterable<String> attributes,
|
| Iterable<String> uriAttributes}) {
|
| -
|
| var baseNameUpper = baseName.toUpperCase();
|
| var tagNameUpper = tagName.toUpperCase();
|
| - var attrs;
|
| - if (attributes != null) {
|
| - attrs =
|
| - attributes.map((name) => '$baseNameUpper::${name.toLowerCase()}');
|
| - }
|
| - var uriAttrs;
|
| - if (uriAttributes != null) {
|
| - uriAttrs =
|
| - uriAttributes.map((name) => '$baseNameUpper::${name.toLowerCase()}');
|
| - }
|
| + var attrs = attributes
|
| + ?.map /*<String>*/ ((name) => '$baseNameUpper::${name.toLowerCase()}');
|
| + var uriAttrs = uriAttributes
|
| + ?.map /*<String>*/ ((name) => '$baseNameUpper::${name.toLowerCase()}');
|
| if (uriPolicy == null) {
|
| uriPolicy = new UriPolicy();
|
| }
|
|
|
| - add(new _CustomElementNodeValidator(
|
| - uriPolicy,
|
| - [tagNameUpper, baseNameUpper],
|
| - attrs,
|
| - uriAttrs,
|
| - true,
|
| - false));
|
| + add(new _CustomElementNodeValidator(uriPolicy,
|
| + [tagNameUpper, baseNameUpper], attrs, uriAttrs, true, false));
|
| }
|
|
|
| - void allowElement(String tagName, {UriPolicy uriPolicy,
|
| - Iterable<String> attributes,
|
| - Iterable<String> uriAttributes}) {
|
| -
|
| - allowCustomElement(tagName, uriPolicy: uriPolicy,
|
| + void allowElement(String tagName,
|
| + {UriPolicy uriPolicy,
|
| + Iterable<String> attributes,
|
| + Iterable<String> uriAttributes}) {
|
| + allowCustomElement(tagName,
|
| + uriPolicy: uriPolicy,
|
| attributes: attributes,
|
| uriAttributes: uriAttributes);
|
| }
|
| @@ -253,8 +227,8 @@ class NodeValidatorBuilder implements NodeValidator {
|
| }
|
|
|
| bool allowsAttribute(Element element, String attributeName, String value) {
|
| - return _validators.any(
|
| - (v) => v.allowsAttribute(element, attributeName, value));
|
| + return _validators
|
| + .any((v) => v.allowsAttribute(element, attributeName, value));
|
| }
|
| }
|
|
|
| @@ -265,76 +239,70 @@ class _SimpleNodeValidator implements NodeValidator {
|
| final UriPolicy uriPolicy;
|
|
|
| factory _SimpleNodeValidator.allowNavigation(UriPolicy uriPolicy) {
|
| - return new _SimpleNodeValidator(uriPolicy,
|
| - allowedElements: const [
|
| - 'A',
|
| - 'FORM'],
|
| - allowedAttributes: const [
|
| - 'A::accesskey',
|
| - 'A::coords',
|
| - 'A::hreflang',
|
| - 'A::name',
|
| - 'A::shape',
|
| - 'A::tabindex',
|
| - 'A::target',
|
| - 'A::type',
|
| - 'FORM::accept',
|
| - 'FORM::autocomplete',
|
| - 'FORM::enctype',
|
| - 'FORM::method',
|
| - 'FORM::name',
|
| - 'FORM::novalidate',
|
| - 'FORM::target',
|
| - ],
|
| - allowedUriAttributes: const [
|
| - 'A::href',
|
| - 'FORM::action',
|
| - ]);
|
| + return new _SimpleNodeValidator(uriPolicy, allowedElements: const [
|
| + 'A',
|
| + 'FORM'
|
| + ], allowedAttributes: const [
|
| + 'A::accesskey',
|
| + 'A::coords',
|
| + 'A::hreflang',
|
| + 'A::name',
|
| + 'A::shape',
|
| + 'A::tabindex',
|
| + 'A::target',
|
| + 'A::type',
|
| + 'FORM::accept',
|
| + 'FORM::autocomplete',
|
| + 'FORM::enctype',
|
| + 'FORM::method',
|
| + 'FORM::name',
|
| + 'FORM::novalidate',
|
| + 'FORM::target',
|
| + ], allowedUriAttributes: const [
|
| + 'A::href',
|
| + 'FORM::action',
|
| + ]);
|
| }
|
|
|
| factory _SimpleNodeValidator.allowImages(UriPolicy uriPolicy) {
|
| - return new _SimpleNodeValidator(uriPolicy,
|
| - allowedElements: const [
|
| - 'IMG'
|
| - ],
|
| - allowedAttributes: const [
|
| - 'IMG::align',
|
| - 'IMG::alt',
|
| - 'IMG::border',
|
| - 'IMG::height',
|
| - 'IMG::hspace',
|
| - 'IMG::ismap',
|
| - 'IMG::name',
|
| - 'IMG::usemap',
|
| - 'IMG::vspace',
|
| - 'IMG::width',
|
| - ],
|
| - allowedUriAttributes: const [
|
| - 'IMG::src',
|
| - ]);
|
| + return new _SimpleNodeValidator(uriPolicy, allowedElements: const [
|
| + 'IMG'
|
| + ], allowedAttributes: const [
|
| + 'IMG::align',
|
| + 'IMG::alt',
|
| + 'IMG::border',
|
| + 'IMG::height',
|
| + 'IMG::hspace',
|
| + 'IMG::ismap',
|
| + 'IMG::name',
|
| + 'IMG::usemap',
|
| + 'IMG::vspace',
|
| + 'IMG::width',
|
| + ], allowedUriAttributes: const [
|
| + 'IMG::src',
|
| + ]);
|
| }
|
|
|
| factory _SimpleNodeValidator.allowTextElements() {
|
| - return new _SimpleNodeValidator(null,
|
| - allowedElements: const [
|
| - 'B',
|
| - 'BLOCKQUOTE',
|
| - 'BR',
|
| - 'EM',
|
| - 'H1',
|
| - 'H2',
|
| - 'H3',
|
| - 'H4',
|
| - 'H5',
|
| - 'H6',
|
| - 'HR',
|
| - 'I',
|
| - 'LI',
|
| - 'OL',
|
| - 'P',
|
| - 'SPAN',
|
| - 'UL',
|
| - ]);
|
| + return new _SimpleNodeValidator(null, allowedElements: const [
|
| + 'B',
|
| + 'BLOCKQUOTE',
|
| + 'BR',
|
| + 'EM',
|
| + 'H1',
|
| + 'H2',
|
| + 'H3',
|
| + 'H4',
|
| + 'H5',
|
| + 'H6',
|
| + 'HR',
|
| + 'I',
|
| + 'LI',
|
| + 'OL',
|
| + 'P',
|
| + 'SPAN',
|
| + 'UL',
|
| + ]);
|
| }
|
|
|
| /**
|
| @@ -343,15 +311,16 @@ class _SimpleNodeValidator implements NodeValidator {
|
| * lowercase attribute name. For example `'IMG:src'`.
|
| */
|
| _SimpleNodeValidator(this.uriPolicy,
|
| - {Iterable<String> allowedElements, Iterable<String> allowedAttributes,
|
| - Iterable<String> allowedUriAttributes}) {
|
| + {Iterable<String> allowedElements,
|
| + Iterable<String> allowedAttributes,
|
| + Iterable<String> allowedUriAttributes}) {
|
| this.allowedElements.addAll(allowedElements ?? const []);
|
| allowedAttributes = allowedAttributes ?? const [];
|
| allowedUriAttributes = allowedUriAttributes ?? const [];
|
| - var legalAttributes = allowedAttributes.where(
|
| - (x) => !_Html5NodeValidator._uriAttributes.contains(x));
|
| - var extraUriAttributes = allowedAttributes.where(
|
| - (x) => _Html5NodeValidator._uriAttributes.contains(x));
|
| + var legalAttributes = allowedAttributes
|
| + .where((x) => !_Html5NodeValidator._uriAttributes.contains(x));
|
| + var extraUriAttributes = allowedAttributes
|
| + .where((x) => _Html5NodeValidator._uriAttributes.contains(x));
|
| this.allowedAttributes.addAll(legalAttributes);
|
| this.allowedUriAttributes.addAll(allowedUriAttributes);
|
| this.allowedUriAttributes.addAll(extraUriAttributes);
|
| @@ -384,19 +353,19 @@ class _CustomElementNodeValidator extends _SimpleNodeValidator {
|
| final bool allowTypeExtension;
|
| final bool allowCustomTag;
|
|
|
| - _CustomElementNodeValidator(UriPolicy uriPolicy,
|
| + _CustomElementNodeValidator(
|
| + UriPolicy uriPolicy,
|
| Iterable<String> allowedElements,
|
| Iterable<String> allowedAttributes,
|
| Iterable<String> allowedUriAttributes,
|
| bool allowTypeExtension,
|
| - bool allowCustomTag):
|
| -
|
| - super(uriPolicy,
|
| - allowedElements: allowedElements,
|
| - allowedAttributes: allowedAttributes,
|
| - allowedUriAttributes: allowedUriAttributes),
|
| - this.allowTypeExtension = allowTypeExtension == true,
|
| - this.allowCustomTag = allowCustomTag == true;
|
| + bool allowCustomTag)
|
| + : this.allowTypeExtension = allowTypeExtension == true,
|
| + this.allowCustomTag = allowCustomTag == true,
|
| + super(uriPolicy,
|
| + allowedElements: allowedElements,
|
| + allowedAttributes: allowedAttributes,
|
| + allowedUriAttributes: allowedUriAttributes);
|
|
|
| bool allowsElement(Element element) {
|
| if (allowTypeExtension) {
|
| @@ -406,12 +375,14 @@ class _CustomElementNodeValidator extends _SimpleNodeValidator {
|
| allowedElements.contains(Element._safeTagName(element));
|
| }
|
| }
|
| - return allowCustomTag && allowedElements.contains(Element._safeTagName(element));
|
| + return allowCustomTag &&
|
| + allowedElements.contains(Element._safeTagName(element));
|
| }
|
|
|
| bool allowsAttribute(Element element, String attributeName, String value) {
|
| - if (allowsElement(element)) {
|
| - if (allowTypeExtension && attributeName == 'is' &&
|
| + if (allowsElement(element)) {
|
| + if (allowTypeExtension &&
|
| + attributeName == 'is' &&
|
| allowedElements.contains(value.toUpperCase())) {
|
| return true;
|
| }
|
| @@ -422,19 +393,22 @@ class _CustomElementNodeValidator extends _SimpleNodeValidator {
|
| }
|
|
|
| class _TemplatingNodeValidator extends _SimpleNodeValidator {
|
| - static const _TEMPLATE_ATTRS =
|
| - const <String>['bind', 'if', 'ref', 'repeat', 'syntax'];
|
| + static const _TEMPLATE_ATTRS = const <String>[
|
| + 'bind',
|
| + 'if',
|
| + 'ref',
|
| + 'repeat',
|
| + 'syntax'
|
| + ];
|
|
|
| final Set<String> _templateAttrs;
|
|
|
| - _TemplatingNodeValidator():
|
| - super(null,
|
| - allowedElements: [
|
| - 'TEMPLATE'
|
| - ],
|
| - allowedAttributes: _TEMPLATE_ATTRS.map((attr) => 'TEMPLATE::$attr')),
|
| - _templateAttrs = new Set<String>.from(_TEMPLATE_ATTRS) {
|
| - }
|
| + _TemplatingNodeValidator()
|
| + : _templateAttrs = new Set<String>.from(_TEMPLATE_ATTRS),
|
| + super(null,
|
| + allowedElements: ['TEMPLATE'],
|
| + allowedAttributes:
|
| + _TEMPLATE_ATTRS.map((attr) => 'TEMPLATE::$attr')) {}
|
|
|
| bool allowsAttribute(Element element, String attributeName, String value) {
|
| if (super.allowsAttribute(element, attributeName, value)) {
|
| @@ -445,14 +419,13 @@ class _TemplatingNodeValidator extends _SimpleNodeValidator {
|
| return true;
|
| }
|
|
|
| - if (element.attributes['template'] == "" ) {
|
| + if (element.attributes['template'] == "") {
|
| return _templateAttrs.contains(attributeName);
|
| }
|
| return false;
|
| }
|
| }
|
|
|
| -
|
| class _SvgNodeValidator implements NodeValidator {
|
| bool allowsElement(Element element) {
|
| if (element is svg.ScriptElement) {
|
| @@ -462,7 +435,8 @@ class _SvgNodeValidator implements NodeValidator {
|
| // foreignobject tag as SvgElement. We don't want foreignobject contents
|
| // anyway, so just remove the whole tree outright. And we can't rely
|
| // on IE recognizing the SvgForeignObject type, so go by tagName. Bug 23144
|
| - if (element is svg.SvgElement && Element._safeTagName(element) == 'foreignObject') {
|
| + if (element is svg.SvgElement &&
|
| + Element._safeTagName(element) == 'foreignObject') {
|
| return false;
|
| }
|
| if (element is svg.SvgElement) {
|
|
|