aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/style/selector_matching.rs5
-rw-r--r--src/components/style/selectors.rs36
2 files changed, 26 insertions, 15 deletions
diff --git a/src/components/style/selector_matching.rs b/src/components/style/selector_matching.rs
index 375e00e1b6b..3d48fd66a57 100644
--- a/src/components/style/selector_matching.rs
+++ b/src/components/style/selector_matching.rs
@@ -281,8 +281,7 @@ impl Stylist {
Some(After) => &mut after_map,
};
map.$priority.insert(Rule {
- // TODO: avoid copying?
- selector: Arc::new(selector.compound_selectors.clone()),
+ selector: selector.compound_selectors.clone(),
specificity: selector.specificity,
declarations: style_rule.declarations.$priority.clone(),
source_order: self.rules_source_order,
@@ -735,7 +734,7 @@ mod tests {
.unwrap().move_iter().map(|s| {
Rule {
specificity: s.specificity,
- selector: Arc::new(s.compound_selectors),
+ selector: s.compound_selectors,
declarations: Arc::new(~[]),
source_order: i,
}
diff --git a/src/components/style/selectors.rs b/src/components/style/selectors.rs
index 3346c0cd897..2e401e1a407 100644
--- a/src/components/style/selectors.rs
+++ b/src/components/style/selectors.rs
@@ -4,14 +4,25 @@
use std::{vec, iter};
use std::ascii::StrAsciiExt;
+use extra::arc::Arc;
+
use cssparser::ast::*;
use cssparser::parse_nth;
+
use namespaces::NamespaceMap;
+// Only used in tests
+impl Eq for Arc<CompoundSelector> {
+ fn eq(&self, other: &Arc<CompoundSelector>) -> bool {
+ self.get() == other.get()
+ }
+}
+
+
#[deriving(Eq, Clone)]
pub struct Selector {
- compound_selectors: CompoundSelector,
+ compound_selectors: Arc<CompoundSelector>,
pseudo_element: Option<PseudoElement>,
specificity: u32,
}
@@ -157,7 +168,7 @@ fn parse_selector(iter: &mut Iter, namespaces: &NamespaceMap)
}
Some(Selector {
specificity: compute_specificity(&compound, &pseudo_element),
- compound_selectors: compound,
+ compound_selectors: Arc::new(compound),
pseudo_element: pseudo_element,
})
}
@@ -549,6 +560,7 @@ fn skip_whitespace(iter: &mut Iter) -> bool {
#[cfg(test)]
mod tests {
+ use extra::arc::Arc;
use cssparser;
use namespaces::NamespaceMap;
use super::*;
@@ -567,48 +579,48 @@ mod tests {
fn test_parsing() {
assert_eq!(parse(""), None)
assert_eq!(parse("e"), Some(~[Selector{
- compound_selectors: CompoundSelector {
+ compound_selectors: Arc::new(CompoundSelector {
simple_selectors: ~[LocalNameSelector(~"e")],
next: None,
- },
+ }),
pseudo_element: None,
specificity: specificity(0, 0, 1),
}]))
assert_eq!(parse(".foo"), Some(~[Selector{
- compound_selectors: CompoundSelector {
+ compound_selectors: Arc::new(CompoundSelector {
simple_selectors: ~[ClassSelector(~"foo")],
next: None,
- },
+ }),
pseudo_element: None,
specificity: specificity(0, 1, 0),
}]))
assert_eq!(parse("#bar"), Some(~[Selector{
- compound_selectors: CompoundSelector {
+ compound_selectors: Arc::new(CompoundSelector {
simple_selectors: ~[IDSelector(~"bar")],
next: None,
- },
+ }),
pseudo_element: None,
specificity: specificity(1, 0, 0),
}]))
assert_eq!(parse("e.foo#bar"), Some(~[Selector{
- compound_selectors: CompoundSelector {
+ compound_selectors: Arc::new(CompoundSelector {
simple_selectors: ~[LocalNameSelector(~"e"),
ClassSelector(~"foo"),
IDSelector(~"bar")],
next: None,
- },
+ }),
pseudo_element: None,
specificity: specificity(1, 1, 1),
}]))
assert_eq!(parse("e.foo #bar"), Some(~[Selector{
- compound_selectors: CompoundSelector {
+ compound_selectors: Arc::new(CompoundSelector {
simple_selectors: ~[IDSelector(~"bar")],
next: Some((~CompoundSelector {
simple_selectors: ~[LocalNameSelector(~"e"),
ClassSelector(~"foo")],
next: None,
}, Descendant)),
- },
+ }),
pseudo_element: None,
specificity: specificity(1, 1, 1),
}]))