Skip to main content

script/dom/css/
csssupportsrule.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use std::cell::RefCell;
6
7use dom_struct::dom_struct;
8use js::context::JSContext;
9use script_bindings::reflector::reflect_dom_object_with_cx;
10use servo_arc::Arc;
11use style::shared_lock::{SharedRwLockReadGuard, ToCssWithGuard};
12use style::stylesheets::{CssRuleType, SupportsRule};
13use style_traits::ToCss;
14
15use super::cssconditionrule::CSSConditionRule;
16use super::cssrule::SpecificCSSRule;
17use super::cssstylesheet::CSSStyleSheet;
18use crate::dom::bindings::root::DomRoot;
19use crate::dom::bindings::str::DOMString;
20use crate::dom::css::cssgroupingrule::CSSGroupingRule;
21use crate::dom::window::Window;
22
23#[dom_struct]
24pub(crate) struct CSSSupportsRule {
25    css_condition_rule: CSSConditionRule,
26    #[ignore_malloc_size_of = "Stylo"]
27    #[no_trace]
28    supports_rule: RefCell<Arc<SupportsRule>>,
29}
30
31impl CSSSupportsRule {
32    fn new_inherited(
33        parent_rule: Option<&CSSGroupingRule>,
34        parent_stylesheet: &CSSStyleSheet,
35        supportsrule: Arc<SupportsRule>,
36    ) -> CSSSupportsRule {
37        let list = supportsrule.rules.clone();
38        CSSSupportsRule {
39            css_condition_rule: CSSConditionRule::new_inherited(
40                parent_rule,
41                parent_stylesheet,
42                list,
43            ),
44            supports_rule: RefCell::new(supportsrule),
45        }
46    }
47
48    pub(crate) fn new(
49        cx: &mut JSContext,
50        window: &Window,
51        parent_rule: Option<&CSSGroupingRule>,
52        parent_stylesheet: &CSSStyleSheet,
53        supportsrule: Arc<SupportsRule>,
54    ) -> DomRoot<CSSSupportsRule> {
55        reflect_dom_object_with_cx(
56            Box::new(CSSSupportsRule::new_inherited(
57                parent_rule,
58                parent_stylesheet,
59                supportsrule,
60            )),
61            window,
62            cx,
63        )
64    }
65
66    /// <https://drafts.csswg.org/css-conditional-3/#the-csssupportsrule-interface>
67    pub(crate) fn get_condition_text(&self) -> DOMString {
68        self.supports_rule.borrow().condition.to_css_string().into()
69    }
70
71    pub(crate) fn update_rule(
72        &self,
73        supportsrule: Arc<SupportsRule>,
74        guard: &SharedRwLockReadGuard,
75    ) {
76        self.css_condition_rule
77            .update_rules(supportsrule.rules.clone(), guard);
78        *self.supports_rule.borrow_mut() = supportsrule;
79    }
80}
81
82impl SpecificCSSRule for CSSSupportsRule {
83    fn ty(&self) -> CssRuleType {
84        CssRuleType::Supports
85    }
86
87    fn get_css(&self) -> DOMString {
88        let guard = self.css_condition_rule.shared_lock().read();
89        self.supports_rule.borrow().to_css_string(&guard).into()
90    }
91}