mirror of
https://github.com/servo/servo.git
synced 2025-07-15 03:13:41 +01:00
A recent update in the spec (https://github.com/whatwg/dom/pull/1079) introduced new rules for name validation of attribute, element, and doctype. This PR implements the new name validation rules in `components/script/dom/bindings/domname.rs`. The old XML name validation rules are not fully removed because there remains a few usage of it in `ProcessingInstructions` and `xpath`. Testing: Covered by WPT tests Fixes: #37746 --------- Signed-off-by: minghuaw <michael.wu1107@gmail.com> Signed-off-by: Minghua Wu <michael.wu1107@gmail.com> Co-authored-by: Xiaocheng Hu <xiaochengh.work@gmail.com>
46 lines
1.3 KiB
Rust
46 lines
1.3 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
//! Functions for validating and extracting qualified XML names.
|
|
|
|
/// Check if an element name is valid. See <http://www.w3.org/TR/xml/#NT-Name>
|
|
/// for details.
|
|
pub(crate) fn is_valid_start(c: char) -> bool {
|
|
matches!(c, ':' |
|
|
'A'..='Z' |
|
|
'_' |
|
|
'a'..='z' |
|
|
'\u{C0}'..='\u{D6}' |
|
|
'\u{D8}'..='\u{F6}' |
|
|
'\u{F8}'..='\u{2FF}' |
|
|
'\u{370}'..='\u{37D}' |
|
|
'\u{37F}'..='\u{1FFF}' |
|
|
'\u{200C}'..='\u{200D}' |
|
|
'\u{2070}'..='\u{218F}' |
|
|
'\u{2C00}'..='\u{2FEF}' |
|
|
'\u{3001}'..='\u{D7FF}' |
|
|
'\u{F900}'..='\u{FDCF}' |
|
|
'\u{FDF0}'..='\u{FFFD}' |
|
|
'\u{10000}'..='\u{EFFFF}')
|
|
}
|
|
|
|
pub(crate) fn is_valid_continuation(c: char) -> bool {
|
|
is_valid_start(c) ||
|
|
matches!(c,
|
|
'-' |
|
|
'.' |
|
|
'0'..='9' |
|
|
'\u{B7}' |
|
|
'\u{300}'..='\u{36F}' |
|
|
'\u{203F}'..='\u{2040}')
|
|
}
|
|
|
|
pub(crate) fn matches_name_production(name: &str) -> bool {
|
|
let mut iter = name.chars();
|
|
|
|
if iter.next().is_none_or(|c| !is_valid_start(c)) {
|
|
return false;
|
|
}
|
|
iter.all(is_valid_continuation)
|
|
}
|