diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs index 5975a5eb6d1..1c383403a00 100644 --- a/components/script/dom/cssrulelist.rs +++ b/components/script/dom/cssrulelist.rs @@ -25,7 +25,7 @@ pub struct CSSRuleList { impl CSSRuleList { #[allow(unrooted_must_root)] pub fn new_inherited(sheet: &CSSStyleSheet, rules: CssRules) -> CSSRuleList { - let dom_rules = rules.0.iter().map(|_| MutNullableHeap::new(None)).collect(); + let dom_rules = rules.0.read().iter().map(|_| MutNullableHeap::new(None)).collect(); CSSRuleList { reflector_: Reflector::new(), sheet: JS::from_ref(sheet), @@ -49,7 +49,7 @@ impl CSSRuleListMethods for CSSRuleList { rule.or_init(|| { CSSRule::new_specific(self.global().as_window(), &self.sheet, - self.rules.0[idx as usize].clone()) + self.rules.0.read()[idx as usize].clone()) }) }) } diff --git a/components/style/selector_matching.rs b/components/style/selector_matching.rs index b7c0df114d1..c574c097a5a 100644 --- a/components/style/selector_matching.rs +++ b/components/style/selector_matching.rs @@ -380,7 +380,7 @@ impl Stylist { return true } } - mq_eval_changed(&rules, before, after) + mq_eval_changed(rules, before, after) }) { return true } @@ -388,7 +388,7 @@ impl Stylist { false } self.is_device_dirty |= stylesheets.iter().any(|stylesheet| { - mq_eval_changed(&stylesheet.rules.0, &self.device, &device) + mq_eval_changed(&stylesheet.rules.0.read(), &self.device, &device) }); self.device = device; diff --git a/components/style/stylesheets.rs b/components/style/stylesheets.rs index 7126ba0ee8c..1538e9e0f25 100644 --- a/components/style/stylesheets.rs +++ b/components/style/stylesheets.rs @@ -43,11 +43,11 @@ pub enum Origin { } #[derive(Debug, Clone)] -pub struct CssRules(pub Arc>); +pub struct CssRules(pub Arc>>); impl From> for CssRules { fn from(other: Vec) -> Self { - CssRules(Arc::new(other)) + CssRules(Arc::new(RwLock::new(other))) } } @@ -100,7 +100,8 @@ impl CssRule { CssRule::Media(ref lock) => { let media_rule = lock.read(); let mq = media_rule.media_queries.read(); - f(&media_rule.rules.0, Some(&mq)) + let rules = media_rule.rules.0.read(); + f(&rules, Some(&mq)) } } } @@ -254,7 +255,7 @@ impl Stylesheet { /// examined. #[inline] pub fn effective_rules(&self, device: &Device, mut f: F) where F: FnMut(&CssRule) { - effective_rules(&self.rules.0, device, &mut f); + effective_rules(&self.rules.0.read(), device, &mut f); } } diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index cc672475c90..8a1745c16ca 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -255,7 +255,7 @@ pub extern "C" fn Servo_StyleSet_RemoveStyleSheet(raw_data: RawServoStyleSetBorr #[no_mangle] pub extern "C" fn Servo_StyleSheet_HasRules(raw_sheet: RawServoStyleSheetBorrowed) -> bool { - !Stylesheet::as_arc(&raw_sheet).rules.0.is_empty() + !Stylesheet::as_arc(&raw_sheet).rules.0.read().is_empty() } #[no_mangle] diff --git a/tests/unit/style/media_queries.rs b/tests/unit/style/media_queries.rs index 20375317bc2..59628128082 100644 --- a/tests/unit/style/media_queries.rs +++ b/tests/unit/style/media_queries.rs @@ -29,7 +29,7 @@ fn test_media_rule(css: &str, callback: F) where F: Fn(&MediaList, &str) { let stylesheet = Stylesheet::from_str(css, url, Origin::Author, Box::new(CSSErrorReporterTest), ParserContextExtraData::default()); let mut rule_count = 0; - media_queries(&stylesheet.rules.0, &mut |mq| { + media_queries(&stylesheet.rules.0.read(), &mut |mq| { rule_count += 1; callback(mq, css); });