diff options
Diffstat (limited to 'components/script/dom/cssstylerule.rs')
-rw-r--r-- | components/script/dom/cssstylerule.rs | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/components/script/dom/cssstylerule.rs b/components/script/dom/cssstylerule.rs index 14d23079d36..bb2d7eaadac 100644 --- a/components/script/dom/cssstylerule.rs +++ b/components/script/dom/cssstylerule.rs @@ -10,14 +10,15 @@ use selectors::parser::{ParseRelative, SelectorList}; use servo_arc::Arc; use style::selector_parser::SelectorParser; use style::shared_lock::{Locked, ToCssWithGuard}; -use style::stylesheets::{CssRuleType, Origin, StyleRule}; +use style::stylesheets::{CssRuleType, CssRules, Origin, StyleRule}; use crate::dom::bindings::codegen::Bindings::CSSStyleRuleBinding::CSSStyleRuleMethods; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{DomGlobal, reflect_dom_object}; use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; -use crate::dom::cssrule::{CSSRule, SpecificCSSRule}; +use crate::dom::cssgroupingrule::CSSGroupingRule; +use crate::dom::cssrule::SpecificCSSRule; use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner}; use crate::dom::cssstylesheet::CSSStyleSheet; use crate::dom::node::NodeTraits; @@ -26,7 +27,7 @@ use crate::script_runtime::CanGc; #[dom_struct] pub(crate) struct CSSStyleRule { - cssrule: CSSRule, + cssgroupingrule: CSSGroupingRule, #[ignore_malloc_size_of = "Arc"] #[no_trace] stylerule: Arc<Locked<StyleRule>>, @@ -39,7 +40,7 @@ impl CSSStyleRule { stylerule: Arc<Locked<StyleRule>>, ) -> CSSStyleRule { CSSStyleRule { - cssrule: CSSRule::new_inherited(parent_stylesheet), + cssgroupingrule: CSSGroupingRule::new_inherited(parent_stylesheet), stylerule, style_decl: Default::default(), } @@ -58,6 +59,16 @@ impl CSSStyleRule { can_gc, ) } + + pub(crate) fn ensure_rules(&self) -> Arc<Locked<CssRules>> { + let lock = self.cssgroupingrule.shared_lock(); + let mut guard = lock.write(); + self.stylerule + .write_with(&mut guard) + .rules + .get_or_insert_with(|| CssRules::new(vec![], lock)) + .clone() + } } impl SpecificCSSRule for CSSStyleRule { @@ -66,7 +77,7 @@ impl SpecificCSSRule for CSSStyleRule { } fn get_css(&self) -> DOMString { - let guard = self.cssrule.shared_lock().read(); + let guard = self.cssgroupingrule.shared_lock().read(); self.stylerule .read_with(&guard) .to_css_string(&guard) @@ -78,7 +89,7 @@ impl CSSStyleRuleMethods<crate::DomTypeHolder> for CSSStyleRule { // https://drafts.csswg.org/cssom/#dom-cssstylerule-style fn Style(&self) -> DomRoot<CSSStyleDeclaration> { self.style_decl.or_init(|| { - let guard = self.cssrule.shared_lock().read(); + let guard = self.cssgroupingrule.shared_lock().read(); CSSStyleDeclaration::new( self.global().as_window(), CSSStyleOwner::CSSRule( @@ -94,14 +105,18 @@ impl CSSStyleRuleMethods<crate::DomTypeHolder> for CSSStyleRule { // https://drafts.csswg.org/cssom/#dom-cssstylerule-selectortext fn SelectorText(&self) -> DOMString { - let guard = self.cssrule.shared_lock().read(); + let guard = self.cssgroupingrule.shared_lock().read(); let stylerule = self.stylerule.read_with(&guard); DOMString::from_string(stylerule.selectors.to_css_string()) } // https://drafts.csswg.org/cssom/#dom-cssstylerule-selectortext fn SetSelectorText(&self, value: DOMString) { - let contents = &self.cssrule.parent_stylesheet().style_stylesheet().contents; + let contents = &self + .cssgroupingrule + .parent_stylesheet() + .style_stylesheet() + .contents; // It's not clear from the spec if we should use the stylesheet's namespaces. // https://github.com/w3c/csswg-drafts/issues/1511 let namespaces = contents.namespaces.read(); @@ -118,10 +133,10 @@ impl CSSStyleRuleMethods<crate::DomTypeHolder> for CSSStyleRule { // rule? if let Ok(mut s) = SelectorList::parse(&parser, &mut css_parser, ParseRelative::No) { // This mirrors what we do in CSSStyleOwner::mutate_associated_block. - let mut guard = self.cssrule.shared_lock().write(); + let mut guard = self.cssgroupingrule.shared_lock().write(); let stylerule = self.stylerule.write_with(&mut guard); mem::swap(&mut stylerule.selectors, &mut s); - if let Some(owner) = self.cssrule.parent_stylesheet().get_owner() { + if let Some(owner) = self.cssgroupingrule.parent_stylesheet().get_owner() { owner.stylesheet_list_owner().invalidate_stylesheets(); } } |