diff options
author | Oriol Brufau <obrufau@igalia.com> | 2024-03-03 13:47:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-03 12:47:39 +0000 |
commit | 06aeeeb1f3574706e6992426063306a3f10716d8 (patch) | |
tree | a9c9ba57a9eb49a70ebaf33df46a97068858ff0c /components/script/dom/csslayerstatementrule.rs | |
parent | 845f503c349cbfc5589169512495c989a001a160 (diff) | |
download | servo-06aeeeb1f3574706e6992426063306a3f10716d8.tar.gz servo-06aeeeb1f3574706e6992426063306a3f10716d8.zip |
Add CSSOM support for CSS layers (#31481)
Instead of just crashing.
Diffstat (limited to 'components/script/dom/csslayerstatementrule.rs')
-rw-r--r-- | components/script/dom/csslayerstatementrule.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/components/script/dom/csslayerstatementrule.rs b/components/script/dom/csslayerstatementrule.rs new file mode 100644 index 00000000000..f2dbfeca0fd --- /dev/null +++ b/components/script/dom/csslayerstatementrule.rs @@ -0,0 +1,79 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use dom_struct::dom_struct; +use js::jsval::JSVal; +use servo_arc::Arc; +use style::shared_lock::ToCssWithGuard; +use style::stylesheets::LayerStatementRule; +use style_traits::ToCss; + +use crate::dom::bindings::codegen::Bindings::CSSLayerStatementRuleBinding::CSSLayerStatementRuleMethods; +use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::str::DOMString; +use crate::dom::bindings::utils::to_frozen_array; +use crate::dom::cssrule::{CSSRule, SpecificCSSRule}; +use crate::dom::cssstylesheet::CSSStyleSheet; +use crate::dom::window::Window; +use crate::script_runtime::JSContext as SafeJSContext; + +#[dom_struct] +pub struct CSSLayerStatementRule { + cssrule: CSSRule, + #[ignore_malloc_size_of = "Arc"] + #[no_trace] + layerstatementrule: Arc<LayerStatementRule>, +} + +impl CSSLayerStatementRule { + pub fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + layerstatementrule: Arc<LayerStatementRule>, + ) -> CSSLayerStatementRule { + CSSLayerStatementRule { + cssrule: CSSRule::new_inherited(parent_stylesheet), + layerstatementrule, + } + } + + #[allow(crown::unrooted_must_root)] + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + layerstatementrule: Arc<LayerStatementRule>, + ) -> DomRoot<CSSLayerStatementRule> { + reflect_dom_object( + Box::new(CSSLayerStatementRule::new_inherited( + parent_stylesheet, + layerstatementrule, + )), + window, + ) + } +} + +impl SpecificCSSRule for CSSLayerStatementRule { + fn ty(&self) -> u16 { + 0 + } + + fn get_css(&self) -> DOMString { + let guard = self.cssrule.shared_lock().read(); + self.layerstatementrule.to_css_string(&guard).into() + } +} + +impl CSSLayerStatementRuleMethods for CSSLayerStatementRule { + /// <https://drafts.csswg.org/css-cascade-5/#dom-csslayerstatementrule-namelist> + fn NameList(&self, cx: SafeJSContext) -> JSVal { + let names: Vec<DOMString> = self + .layerstatementrule + .names + .iter() + .map(|name| DOMString::from_string(name.to_css_string())) + .collect(); + to_frozen_array(names.as_slice(), cx) + } +} |