OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of dart.dom.html; | 5 part of dart.dom.html; |
6 | 6 |
7 | 7 |
8 /** | 8 /** |
9 * Class which helps construct standard node validation policies. | 9 * Class which helps construct standard node validation policies. |
10 * | 10 * |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 * This will allow the elements as custom tags (such as <x-foo></x-foo>), | 150 * This will allow the elements as custom tags (such as <x-foo></x-foo>), |
151 * but will not allow tag extensions. Use [allowTagExtension] to allow | 151 * but will not allow tag extensions. Use [allowTagExtension] to allow |
152 * tag extensions. | 152 * tag extensions. |
153 */ | 153 */ |
154 void allowCustomElement(String tagName, | 154 void allowCustomElement(String tagName, |
155 {UriPolicy uriPolicy, | 155 {UriPolicy uriPolicy, |
156 Iterable<String> attributes, | 156 Iterable<String> attributes, |
157 Iterable<String> uriAttributes}) { | 157 Iterable<String> uriAttributes}) { |
158 | 158 |
159 var tagNameUpper = tagName.toUpperCase(); | 159 var tagNameUpper = tagName.toUpperCase(); |
160 var attrs; | 160 var attrs = attributes != null ? |
161 if (attributes != null) { | 161 attributes.map/*<String>*/((name) => '$tagNameUpper::${name.toLowerCase(
)}') : null; |
162 attrs = | 162 var uriAttrs = uriAttributes != null ? |
163 attributes.map((name) => '$tagNameUpper::${name.toLowerCase()}'); | 163 uriAttributes.map/*<String>*/((name) => '$tagNameUpper::${name.toLowerCa
se()}') : null; |
164 } | |
165 var uriAttrs; | |
166 if (uriAttributes != null) { | |
167 uriAttrs = | |
168 uriAttributes.map((name) => '$tagNameUpper::${name.toLowerCase()}'); | |
169 } | |
170 if (uriPolicy == null) { | 164 if (uriPolicy == null) { |
171 uriPolicy = new UriPolicy(); | 165 uriPolicy = new UriPolicy(); |
172 } | 166 } |
173 | 167 |
174 add(new _CustomElementNodeValidator( | 168 add(new _CustomElementNodeValidator( |
175 uriPolicy, | 169 uriPolicy, |
176 [tagNameUpper], | 170 [tagNameUpper], |
177 attrs, | 171 attrs, |
178 uriAttrs, | 172 uriAttrs, |
179 false, | 173 false, |
180 true)); | 174 true)); |
181 } | 175 } |
182 | 176 |
183 /** | 177 /** |
184 * Allow custom tag extensions with the specified type name and specified | 178 * Allow custom tag extensions with the specified type name and specified |
185 * attributes. | 179 * attributes. |
186 * | 180 * |
187 * This will allow tag extensions (such as <div is="x-foo"></div>), | 181 * This will allow tag extensions (such as <div is="x-foo"></div>), |
188 * but will not allow custom tags. Use [allowCustomElement] to allow | 182 * but will not allow custom tags. Use [allowCustomElement] to allow |
189 * custom tags. | 183 * custom tags. |
190 */ | 184 */ |
191 void allowTagExtension(String tagName, String baseName, | 185 void allowTagExtension(String tagName, String baseName, |
192 {UriPolicy uriPolicy, | 186 {UriPolicy uriPolicy, |
193 Iterable<String> attributes, | 187 Iterable<String> attributes, |
194 Iterable<String> uriAttributes}) { | 188 Iterable<String> uriAttributes}) { |
195 | 189 |
196 var baseNameUpper = baseName.toUpperCase(); | 190 var baseNameUpper = baseName.toUpperCase(); |
197 var tagNameUpper = tagName.toUpperCase(); | 191 var tagNameUpper = tagName.toUpperCase(); |
198 var attrs; | 192 var attrs = attributes != null ? attributes.map/*<String>*/((name) => '$base
NameUpper::${name.toLowerCase()}') : null; |
199 if (attributes != null) { | 193 var uriAttrs = uriAttributes != null ? uriAttributes.map/*<String>*/((name)
=> '$baseNameUpper::${name.toLowerCase()}') : null; |
200 attrs = | |
201 attributes.map((name) => '$baseNameUpper::${name.toLowerCase()}'); | |
202 } | |
203 var uriAttrs; | |
204 if (uriAttributes != null) { | |
205 uriAttrs = | |
206 uriAttributes.map((name) => '$baseNameUpper::${name.toLowerCase()}'); | |
207 } | |
208 if (uriPolicy == null) { | 194 if (uriPolicy == null) { |
209 uriPolicy = new UriPolicy(); | 195 uriPolicy = new UriPolicy(); |
210 } | 196 } |
211 | 197 |
212 add(new _CustomElementNodeValidator( | 198 add(new _CustomElementNodeValidator( |
213 uriPolicy, | 199 uriPolicy, |
214 [tagNameUpper, baseNameUpper], | 200 [tagNameUpper, baseNameUpper], |
215 attrs, | 201 attrs, |
216 uriAttrs, | 202 uriAttrs, |
217 true, | 203 true, |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 class _CustomElementNodeValidator extends _SimpleNodeValidator { | 369 class _CustomElementNodeValidator extends _SimpleNodeValidator { |
384 final bool allowTypeExtension; | 370 final bool allowTypeExtension; |
385 final bool allowCustomTag; | 371 final bool allowCustomTag; |
386 | 372 |
387 _CustomElementNodeValidator(UriPolicy uriPolicy, | 373 _CustomElementNodeValidator(UriPolicy uriPolicy, |
388 Iterable<String> allowedElements, | 374 Iterable<String> allowedElements, |
389 Iterable<String> allowedAttributes, | 375 Iterable<String> allowedAttributes, |
390 Iterable<String> allowedUriAttributes, | 376 Iterable<String> allowedUriAttributes, |
391 bool allowTypeExtension, | 377 bool allowTypeExtension, |
392 bool allowCustomTag): | 378 bool allowCustomTag): |
393 | 379 this.allowTypeExtension = allowTypeExtension == true, |
| 380 this.allowCustomTag = allowCustomTag == true, |
394 super(uriPolicy, | 381 super(uriPolicy, |
395 allowedElements: allowedElements, | 382 allowedElements: allowedElements, |
396 allowedAttributes: allowedAttributes, | 383 allowedAttributes: allowedAttributes, |
397 allowedUriAttributes: allowedUriAttributes), | 384 allowedUriAttributes: allowedUriAttributes); |
398 this.allowTypeExtension = allowTypeExtension == true, | |
399 this.allowCustomTag = allowCustomTag == true; | |
400 | 385 |
401 bool allowsElement(Element element) { | 386 bool allowsElement(Element element) { |
402 if (allowTypeExtension) { | 387 if (allowTypeExtension) { |
403 var isAttr = element.attributes['is']; | 388 var isAttr = element.attributes['is']; |
404 if (isAttr != null) { | 389 if (isAttr != null) { |
405 return allowedElements.contains(isAttr.toUpperCase()) && | 390 return allowedElements.contains(isAttr.toUpperCase()) && |
406 allowedElements.contains(Element._safeTagName(element)); | 391 allowedElements.contains(Element._safeTagName(element)); |
407 } | 392 } |
408 } | 393 } |
409 return allowCustomTag && allowedElements.contains(Element._safeTagName(eleme
nt)); | 394 return allowCustomTag && allowedElements.contains(Element._safeTagName(eleme
nt)); |
(...skipping 11 matching lines...) Expand all Loading... |
421 } | 406 } |
422 } | 407 } |
423 | 408 |
424 class _TemplatingNodeValidator extends _SimpleNodeValidator { | 409 class _TemplatingNodeValidator extends _SimpleNodeValidator { |
425 static const _TEMPLATE_ATTRS = | 410 static const _TEMPLATE_ATTRS = |
426 const <String>['bind', 'if', 'ref', 'repeat', 'syntax']; | 411 const <String>['bind', 'if', 'ref', 'repeat', 'syntax']; |
427 | 412 |
428 final Set<String> _templateAttrs; | 413 final Set<String> _templateAttrs; |
429 | 414 |
430 _TemplatingNodeValidator(): | 415 _TemplatingNodeValidator(): |
| 416 _templateAttrs = new Set<String>.from(_TEMPLATE_ATTRS), |
431 super(null, | 417 super(null, |
432 allowedElements: [ | 418 allowedElements: [ |
433 'TEMPLATE' | 419 'TEMPLATE' |
434 ], | 420 ], |
435 allowedAttributes: _TEMPLATE_ATTRS.map((attr) => 'TEMPLATE::$attr')), | 421 allowedAttributes: _TEMPLATE_ATTRS.map((attr) => 'TEMPLATE::$attr')) { |
436 _templateAttrs = new Set<String>.from(_TEMPLATE_ATTRS) { | |
437 } | 422 } |
438 | 423 |
439 bool allowsAttribute(Element element, String attributeName, String value) { | 424 bool allowsAttribute(Element element, String attributeName, String value) { |
440 if (super.allowsAttribute(element, attributeName, value)) { | 425 if (super.allowsAttribute(element, attributeName, value)) { |
441 return true; | 426 return true; |
442 } | 427 } |
443 | 428 |
444 if (attributeName == 'template' && value == "") { | 429 if (attributeName == 'template' && value == "") { |
445 return true; | 430 return true; |
446 } | 431 } |
(...skipping 24 matching lines...) Expand all Loading... |
471 return false; | 456 return false; |
472 } | 457 } |
473 | 458 |
474 bool allowsAttribute(Element element, String attributeName, String value) { | 459 bool allowsAttribute(Element element, String attributeName, String value) { |
475 if (attributeName == 'is' || attributeName.startsWith('on')) { | 460 if (attributeName == 'is' || attributeName.startsWith('on')) { |
476 return false; | 461 return false; |
477 } | 462 } |
478 return allowsElement(element); | 463 return allowsElement(element); |
479 } | 464 } |
480 } | 465 } |
OLD | NEW |