diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/trace.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssconditionrule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssgroupingrule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssmediarule.rs | 7 | ||||
-rw-r--r-- | components/script/dom/medialist.rs | 44 |
5 files changed, 44 insertions, 19 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index b0828ab6d56..b0fabb5fd45 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -99,7 +99,7 @@ use style::keyframes::Keyframe; use style::media_queries::MediaList; use style::properties::PropertyDeclarationBlock; use style::selector_parser::{PseudoElement, Snapshot}; -use style::shared_lock::SharedRwLock as StyleSharedRwLock; +use style::shared_lock::{SharedRwLock as StyleSharedRwLock, Locked as StyleLocked}; use style::stylesheets::{CssRules, KeyframesRule, MediaRule, NamespaceRule, StyleRule, ImportRule}; use style::stylesheets::SupportsRule; use style::values::specified::Length; @@ -574,7 +574,7 @@ unsafe impl JSTraceable for RwLock<SharedRt> { } } -unsafe impl JSTraceable for RwLock<MediaList> { +unsafe impl JSTraceable for StyleLocked<MediaList> { unsafe fn trace(&self, _trc: *mut JSTracer) { // Do nothing. } diff --git a/components/script/dom/cssconditionrule.rs b/components/script/dom/cssconditionrule.rs index 42fca721759..44d10c21dd3 100644 --- a/components/script/dom/cssconditionrule.rs +++ b/components/script/dom/cssconditionrule.rs @@ -28,6 +28,10 @@ impl CSSConditionRule { } } + pub fn parent_stylesheet(&self) -> &CSSStyleSheet { + self.cssgroupingrule.parent_stylesheet() + } + pub fn shared_lock(&self) -> &SharedRwLock { self.cssgroupingrule.shared_lock() } diff --git a/components/script/dom/cssgroupingrule.rs b/components/script/dom/cssgroupingrule.rs index 29f6bc361a2..7204b8447f9 100644 --- a/components/script/dom/cssgroupingrule.rs +++ b/components/script/dom/cssgroupingrule.rs @@ -42,6 +42,10 @@ impl CSSGroupingRule { RulesSource::Rules(self.rules.clone()))) } + pub fn parent_stylesheet(&self) -> &CSSStyleSheet { + self.cssrule.parent_stylesheet() + } + pub fn shared_lock(&self) -> &SharedRwLock { self.cssrule.shared_lock() } diff --git a/components/script/dom/cssmediarule.rs b/components/script/dom/cssmediarule.rs index 9242ee01bb7..1d1f0846a51 100644 --- a/components/script/dom/cssmediarule.rs +++ b/components/script/dom/cssmediarule.rs @@ -50,22 +50,25 @@ impl CSSMediaRule { fn medialist(&self) -> Root<MediaList> { self.medialist.or_init(|| MediaList::new(self.global().as_window(), + self.cssconditionrule.parent_stylesheet(), self.mediarule.read().media_queries.clone())) } /// https://drafts.csswg.org/css-conditional-3/#the-cssmediarule-interface pub fn get_condition_text(&self) -> DOMString { + let guard = self.cssconditionrule.shared_lock().read(); let rule = self.mediarule.read(); - let list = rule.media_queries.read(); + let list = rule.media_queries.read_with(&guard); list.to_css_string().into() } /// https://drafts.csswg.org/css-conditional-3/#the-cssmediarule-interface pub fn set_condition_text(&self, text: DOMString) { + let mut guard = self.cssconditionrule.shared_lock().write(); let mut input = Parser::new(&text); let new_medialist = parse_media_query_list(&mut input); let rule = self.mediarule.read(); - let mut list = rule.media_queries.write(); + let mut list = rule.media_queries.write_with(&mut guard); *list = new_medialist; } } diff --git a/components/script/dom/medialist.rs b/components/script/dom/medialist.rs index 806946f6356..0020f7f3a08 100644 --- a/components/script/dom/medialist.rs +++ b/components/script/dom/medialist.rs @@ -6,13 +6,14 @@ use core::default::Default; use cssparser::Parser; use dom::bindings::codegen::Bindings::MediaListBinding; use dom::bindings::codegen::Bindings::MediaListBinding::MediaListMethods; -use dom::bindings::js::Root; +use dom::bindings::js::{JS, Root}; use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::DOMString; +use dom::cssstylesheet::CSSStyleSheet; use dom::window::Window; use dom_struct::dom_struct; -use parking_lot::RwLock; use std::sync::Arc; +use style::shared_lock::{SharedRwLock, Locked}; use style::media_queries::{MediaQuery, parse_media_query_list}; use style::media_queries::MediaList as StyleMediaList; use style_traits::ToCss; @@ -20,38 +21,47 @@ use style_traits::ToCss; #[dom_struct] pub struct MediaList { reflector_: Reflector, + parent_stylesheet: JS<CSSStyleSheet>, #[ignore_heap_size_of = "Arc"] - media_queries: Arc<RwLock<StyleMediaList>>, + media_queries: Arc<Locked<StyleMediaList>>, } impl MediaList { #[allow(unrooted_must_root)] - pub fn new_inherited(media_queries: Arc<RwLock<StyleMediaList>>) -> MediaList { + pub fn new_inherited(parent_stylesheet: &CSSStyleSheet, + media_queries: Arc<Locked<StyleMediaList>>) -> MediaList { MediaList { + parent_stylesheet: JS::from_ref(parent_stylesheet), reflector_: Reflector::new(), media_queries: media_queries, } } #[allow(unrooted_must_root)] - pub fn new(window: &Window, media_queries: Arc<RwLock<StyleMediaList>>) + pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, + media_queries: Arc<Locked<StyleMediaList>>) -> Root<MediaList> { - reflect_dom_object(box MediaList::new_inherited(media_queries), + reflect_dom_object(box MediaList::new_inherited(parent_stylesheet, media_queries), window, MediaListBinding::Wrap) } + fn shared_lock(&self) -> &SharedRwLock { + &self.parent_stylesheet.style_stylesheet().shared_lock + } } impl MediaListMethods for MediaList { // https://drafts.csswg.org/cssom/#dom-medialist-mediatext fn MediaText(&self) -> DOMString { - DOMString::from(self.media_queries.read().to_css_string()) + let guard = self.shared_lock().read(); + DOMString::from(self.media_queries.read_with(&guard).to_css_string()) } // https://drafts.csswg.org/cssom/#dom-medialist-mediatext fn SetMediaText(&self, value: DOMString) { - let mut media_queries = self.media_queries.write(); + let mut guard = self.shared_lock().write(); + let mut media_queries = self.media_queries.write_with(&mut guard); // Step 2 if value.is_empty() { // Step 1 @@ -65,13 +75,15 @@ impl MediaListMethods for MediaList { // https://drafts.csswg.org/cssom/#dom-medialist-length fn Length(&self) -> u32 { - self.media_queries.read().media_queries.len() as u32 + let guard = self.shared_lock().read(); + self.media_queries.read_with(&guard).media_queries.len() as u32 } // https://drafts.csswg.org/cssom/#dom-medialist-item fn Item(&self, index: u32) -> Option<DOMString> { - self.media_queries.read().media_queries.get(index as usize) - .and_then(|query| { + let guard = self.shared_lock().read(); + self.media_queries.read_with(&guard).media_queries + .get(index as usize).and_then(|query| { let mut s = String::new(); query.to_css(&mut s).unwrap(); Some(DOMString::from_string(s)) @@ -94,13 +106,14 @@ impl MediaListMethods for MediaList { } // Step 3 let m_serialized = m.clone().unwrap().to_css_string(); - let any = self.media_queries.read().media_queries.iter() - .any(|q| m_serialized == q.to_css_string()); + let mut guard = self.shared_lock().write(); + let mq = self.media_queries.write_with(&mut guard); + let any = mq.media_queries.iter().any(|q| m_serialized == q.to_css_string()); if any { return; } // Step 4 - self.media_queries.write().media_queries.push(m.unwrap()); + mq.media_queries.push(m.unwrap()); } // https://drafts.csswg.org/cssom/#dom-medialist-deletemedium @@ -114,7 +127,8 @@ impl MediaListMethods for MediaList { } // Step 3 let m_serialized = m.unwrap().to_css_string(); - let mut media_list = self.media_queries.write(); + let mut guard = self.shared_lock().write(); + let mut media_list = self.media_queries.write_with(&mut guard); let new_vec = media_list.media_queries.drain(..) .filter(|q| m_serialized != q.to_css_string()) .collect(); |