script/dom/css/
csslayerblockrule.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::{Locked, SharedRwLockReadGuard, ToCssWithGuard};
12use style::stylesheets::{CssRuleType, CssRules, LayerBlockRule};
13use style_traits::ToCss;
14
15use super::cssgroupingrule::CSSGroupingRule;
16use super::cssrule::SpecificCSSRule;
17use super::cssstylesheet::CSSStyleSheet;
18use crate::dom::bindings::codegen::Bindings::CSSLayerBlockRuleBinding::CSSLayerBlockRuleMethods;
19use crate::dom::bindings::root::DomRoot;
20use crate::dom::bindings::str::DOMString;
21use crate::dom::window::Window;
22
23#[dom_struct]
24pub(crate) struct CSSLayerBlockRule {
25 css_grouping_rule: CSSGroupingRule,
26 #[ignore_malloc_size_of = "Stylo"]
27 #[no_trace]
28 layer_block_rule: RefCell<Arc<LayerBlockRule>>,
29}
30
31impl CSSLayerBlockRule {
32 pub(crate) fn new_inherited(
33 parent_rule: Option<&CSSGroupingRule>,
34 parent_stylesheet: &CSSStyleSheet,
35 layerblockrule: Arc<LayerBlockRule>,
36 ) -> CSSLayerBlockRule {
37 CSSLayerBlockRule {
38 css_grouping_rule: CSSGroupingRule::new_inherited(parent_rule, parent_stylesheet),
39 layer_block_rule: RefCell::new(layerblockrule),
40 }
41 }
42
43 pub(crate) fn new(
44 cx: &mut JSContext,
45 window: &Window,
46 parent_rule: Option<&CSSGroupingRule>,
47 parent_stylesheet: &CSSStyleSheet,
48 layerblockrule: Arc<LayerBlockRule>,
49 ) -> DomRoot<CSSLayerBlockRule> {
50 reflect_dom_object_with_cx(
51 Box::new(CSSLayerBlockRule::new_inherited(
52 parent_rule,
53 parent_stylesheet,
54 layerblockrule,
55 )),
56 window,
57 cx,
58 )
59 }
60
61 pub(crate) fn clone_rules(&self) -> Arc<Locked<CssRules>> {
62 self.layer_block_rule.borrow().rules.clone()
63 }
64
65 pub(crate) fn update_rule(
66 &self,
67 layerblockrule: Arc<LayerBlockRule>,
68 guard: &SharedRwLockReadGuard,
69 ) {
70 self.css_grouping_rule
71 .update_rules(&layerblockrule.rules, guard);
72 *self.layer_block_rule.borrow_mut() = layerblockrule;
73 }
74}
75
76impl SpecificCSSRule for CSSLayerBlockRule {
77 fn ty(&self) -> CssRuleType {
78 CssRuleType::LayerBlock
79 }
80
81 fn get_css(&self) -> DOMString {
82 let guard = self.css_grouping_rule.shared_lock().read();
83 self.layer_block_rule.borrow().to_css_string(&guard).into()
84 }
85}
86
87impl CSSLayerBlockRuleMethods<crate::DomTypeHolder> for CSSLayerBlockRule {
88 fn Name(&self) -> DOMString {
90 self.layer_block_rule
91 .borrow()
92 .name
93 .as_ref()
94 .map(|name| name.to_css_cssstring().into())
95 .unwrap_or_default()
96 }
97}