Atomize namespace prefixes.

This commit is contained in:
Simon Sapin 2016-08-18 15:43:30 +02:00
parent 84fed1a62f
commit 6173e1d339
4 changed files with 19 additions and 9 deletions

View file

@ -167,7 +167,7 @@ impl SelectorImpl for GeckoSelectorImpl {
type Identifier = Atom; type Identifier = Atom;
type ClassName = Atom; type ClassName = Atom;
type LocalName = Atom; type LocalName = Atom;
type NamespacePrefix = String; type NamespacePrefix = Atom;
type NamespaceUrl = Namespace; type NamespaceUrl = Namespace;
type BorrowedNamespaceUrl = WeakNamespace; type BorrowedNamespaceUrl = WeakNamespace;
type BorrowedLocalName = WeakAtom; type BorrowedLocalName = WeakAtom;

View file

@ -145,7 +145,7 @@ impl SelectorImpl for ServoSelectorImpl {
type Identifier = Atom; type Identifier = Atom;
type ClassName = Atom; type ClassName = Atom;
type LocalName = Atom; type LocalName = Atom;
type NamespacePrefix = String; type NamespacePrefix = Atom;
type NamespaceUrl = Namespace; type NamespaceUrl = Namespace;
type BorrowedLocalName = Atom; type BorrowedLocalName = Atom;
type BorrowedNamespaceUrl = Namespace; type BorrowedNamespaceUrl = Namespace;

View file

@ -58,7 +58,11 @@ pub struct Stylesheet {
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[cfg_attr(feature = "servo", derive(HeapSizeOf))]
pub enum CSSRule { pub enum CSSRule {
Charset(String), Charset(String),
Namespace(Option<String>, Namespace), Namespace {
/// `None` for the default Namespace
prefix: Option<Atom>,
url: Namespace,
},
Style(StyleRule), Style(StyleRule),
Media(MediaRule), Media(MediaRule),
FontFace(FontFaceRule), FontFace(FontFaceRule),
@ -143,13 +147,13 @@ impl Stylesheet {
while let Some(result) = iter.next() { while let Some(result) = iter.next() {
match result { match result {
Ok(rule) => { Ok(rule) => {
if let CSSRule::Namespace(ref prefix, ref namespace) = rule { if let CSSRule::Namespace { ref prefix, ref url } = rule {
if let Some(prefix) = prefix.as_ref() { if let Some(prefix) = prefix.as_ref() {
iter.parser.context.selector_context.namespace_prefixes.insert( iter.parser.context.selector_context.namespace_prefixes.insert(
prefix.clone(), namespace.clone()); prefix.clone(), url.clone());
} else { } else {
iter.parser.context.selector_context.default_namespace = iter.parser.context.selector_context.default_namespace =
Some(namespace.clone()); Some(url.clone());
} }
} }
@ -435,9 +439,12 @@ impl<'a> AtRuleParser for TopLevelRuleParser<'a> {
if self.state.get() <= State::Namespaces { if self.state.get() <= State::Namespaces {
self.state.set(State::Namespaces); self.state.set(State::Namespaces);
let prefix = input.try(|input| input.expect_ident()).ok().map(|p| p.into_owned()); let prefix = input.try(|input| input.expect_ident()).ok().map(|p| p.into());
let url = Namespace(Atom::from(try!(input.expect_url_or_string()))); let url = Namespace(Atom::from(try!(input.expect_url_or_string())));
return Ok(AtRuleType::WithoutBlock(CSSRule::Namespace(prefix, url))) return Ok(AtRuleType::WithoutBlock(CSSRule::Namespace {
prefix: prefix,
url: url,
}))
} else { } else {
return Err(()) // "@namespace must be before any rule but @charset and @import" return Err(()) // "@namespace must be before any rule but @charset and @import"
} }

View file

@ -38,7 +38,10 @@ fn test_parse_stylesheet() {
media: None, media: None,
dirty_on_viewport_size_change: false, dirty_on_viewport_size_change: false,
rules: vec![ rules: vec![
CSSRule::Namespace(None, NsAtom(Atom::from("http://www.w3.org/1999/xhtml"))), CSSRule::Namespace {
prefix: None,
url: NsAtom(Atom::from("http://www.w3.org/1999/xhtml"))
},
CSSRule::Style(StyleRule { CSSRule::Style(StyleRule {
selectors: vec![ selectors: vec![
Selector { Selector {