Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Immutable CSSOM #14190

Merged
merged 6 commits into from Nov 16, 2016
Merged
Next

Arc all Vec<CSSRule>s, put in CSSRules type

  • Loading branch information
Manishearth committed Nov 15, 2016
commit 2220fcdc0bbb46b907a3a5ed974508c67ddb2890
@@ -81,7 +81,7 @@ impl HTMLMetaElement {
if !content.is_empty() {
if let Some(translated_rule) = ViewportRule::from_meta(&**content) {
*self.stylesheet.borrow_mut() = Some(Arc::new(Stylesheet {
rules: vec![CssRule::Viewport(Arc::new(RwLock::new(translated_rule)))],
rules: vec![CssRule::Viewport(Arc::new(RwLock::new(translated_rule)))].into(),
origin: Origin::Author,
media: Default::default(),
// Viewport constraints are always recomputed on resize; they don't need to
@@ -380,15 +380,15 @@ impl Stylist {
return true
}
}
mq_eval_changed(rules, before, after)
mq_eval_changed(&rules, before, after)
}) {
return true
}
}
false
}
self.is_device_dirty |= stylesheets.iter().any(|stylesheet| {
mq_eval_changed(&stylesheet.rules, &self.device, &device)
mq_eval_changed(&stylesheet.rules.0, &self.device, &device)
});

self.device = device;
@@ -39,12 +39,20 @@ pub enum Origin {
User,
}

#[derive(Debug)]
pub struct CssRules(pub Arc<Vec<CssRule>>);

impl From<Vec<CssRule>> for CssRules {
fn from(other: Vec<CssRule>) -> Self {
CssRules(Arc::new(other))
}
}

#[derive(Debug)]
pub struct Stylesheet {
/// List of rules in the order they were found (important for
/// cascading order)
pub rules: Vec<CssRule>,
pub rules: CssRules,
/// List of media associated with the Stylesheet.
pub media: MediaList,
pub origin: Origin,
@@ -89,7 +97,7 @@ impl CssRule {
CssRule::Media(ref lock) => {
let media_rule = lock.read();
let mq = media_rule.media_queries.read();
f(&media_rule.rules, Some(&mq))
f(&media_rule.rules.0, Some(&mq))
}
}
}
@@ -112,7 +120,7 @@ pub struct KeyframesRule {
#[derive(Debug)]
pub struct MediaRule {
pub media_queries: Arc<RwLock<MediaList>>,
pub rules: Vec<CssRule>,
pub rules: CssRules,
}

#[derive(Debug)]
@@ -180,7 +188,7 @@ impl Stylesheet {

Stylesheet {
origin: origin,
rules: rules,
rules: rules.into(),
media: Default::default(),
dirty_on_viewport_size_change:
input.seen_viewport_percentages(),
@@ -208,7 +216,7 @@ impl Stylesheet {
/// examined.
#[inline]
pub fn effective_rules<F>(&self, device: &Device, mut f: F) where F: FnMut(&CssRule) {
effective_rules(&self.rules, device, &mut f);
effective_rules(&self.rules.0, device, &mut f);
}
}

@@ -251,7 +259,7 @@ rule_filter! {
effective_keyframes_rules(Keyframes => KeyframesRule),
}

fn parse_nested_rules(context: &ParserContext, input: &mut Parser) -> Vec<CssRule> {
fn parse_nested_rules(context: &ParserContext, input: &mut Parser) -> CssRules {
let mut iter = RuleListParser::new_for_nested_rule(input,
NestedRuleParser { context: context });
let mut rules = Vec::new();
@@ -265,7 +273,7 @@ fn parse_nested_rules(context: &ParserContext, input: &mut Parser) -> Vec<CssRul
}
}
}
rules
rules.into()
}


ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.