script/dom/css/
csslayerstatementrule.rs1use std::cell::RefCell;
6
7use dom_struct::dom_struct;
8use js::context::JSContext;
9use js::rust::MutableHandleValue;
10use script_bindings::reflector::reflect_dom_object_with_cx;
11use servo_arc::Arc;
12use style::shared_lock::ToCssWithGuard;
13use style::stylesheets::{CssRuleType, LayerStatementRule};
14use style_traits::ToCss;
15
16use super::cssrule::{CSSRule, SpecificCSSRule};
17use super::cssstylesheet::CSSStyleSheet;
18use crate::dom::bindings::codegen::Bindings::CSSLayerStatementRuleBinding::CSSLayerStatementRuleMethods;
19use crate::dom::bindings::root::DomRoot;
20use crate::dom::bindings::str::DOMString;
21use crate::dom::bindings::utils::to_frozen_array;
22use crate::dom::types::CSSGroupingRule;
23use crate::dom::window::Window;
24
25#[dom_struct]
26pub(crate) struct CSSLayerStatementRule {
27 css_rule: CSSRule,
28 #[ignore_malloc_size_of = "Stylo"]
29 #[no_trace]
30 layer_statement_rule: RefCell<Arc<LayerStatementRule>>,
31}
32
33impl CSSLayerStatementRule {
34 pub(crate) fn new_inherited(
35 parent_rule: Option<&CSSGroupingRule>,
36 parent_stylesheet: &CSSStyleSheet,
37 layerstatementrule: Arc<LayerStatementRule>,
38 ) -> CSSLayerStatementRule {
39 CSSLayerStatementRule {
40 css_rule: CSSRule::new_inherited(parent_rule, parent_stylesheet),
41 layer_statement_rule: RefCell::new(layerstatementrule),
42 }
43 }
44
45 pub(crate) fn new(
46 cx: &mut JSContext,
47 window: &Window,
48 parent_rule: Option<&CSSGroupingRule>,
49 parent_stylesheet: &CSSStyleSheet,
50 layerstatementrule: Arc<LayerStatementRule>,
51 ) -> DomRoot<CSSLayerStatementRule> {
52 reflect_dom_object_with_cx(
53 Box::new(CSSLayerStatementRule::new_inherited(
54 parent_rule,
55 parent_stylesheet,
56 layerstatementrule,
57 )),
58 window,
59 cx,
60 )
61 }
62
63 pub(crate) fn update_rule(&self, layerstatementrule: Arc<LayerStatementRule>) {
64 *self.layer_statement_rule.borrow_mut() = layerstatementrule;
65 }
66}
67
68impl SpecificCSSRule for CSSLayerStatementRule {
69 fn ty(&self) -> CssRuleType {
70 CssRuleType::LayerStatement
71 }
72
73 fn get_css(&self) -> DOMString {
74 let guard = self.css_rule.shared_lock().read();
75 self.layer_statement_rule
76 .borrow()
77 .to_css_string(&guard)
78 .into()
79 }
80}
81
82impl CSSLayerStatementRuleMethods<crate::DomTypeHolder> for CSSLayerStatementRule {
83 fn NameList(&self, cx: &mut JSContext, retval: MutableHandleValue) {
85 let names: Vec<DOMString> = self
86 .layer_statement_rule
87 .borrow()
88 .names
89 .iter()
90 .map(|name| name.to_css_string().into())
91 .collect();
92 to_frozen_array(cx, names.as_slice(), retval)
93 }
94}