script/dom/css/
csssupportsrule.rs1use 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 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}