aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/cssstylerule.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/cssstylerule.rs')
-rw-r--r--components/script/dom/cssstylerule.rs35
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();
}
}