diff options
author | Oriol Brufau <obrufau@igalia.com> | 2025-04-01 13:20:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-01 11:20:46 +0000 |
commit | bc6926d1feea04b41879d43507509636db29b377 (patch) | |
tree | bd8e4a4058273781ad7eb546ecc916846741573d /components/script/dom/cssnesteddeclarations.rs | |
parent | e8d5a019a4c61ea3ab2bd9f36c96644b916c575a (diff) | |
download | servo-bc6926d1feea04b41879d43507509636db29b377.tar.gz servo-bc6926d1feea04b41879d43507509636db29b377.zip |
Implement CSSNestedDeclarations (#36248)
This is the CSSOM interface that represents a nested declarations rule.
https://drafts.csswg.org/css-nesting/#the-cssnestrule
Testing: `/_mozilla/mozilla/interfaces.https.html`. And once
`CSSStyleRule` becomes a `CSSGroupingRule` subclass, this will be
further covered by `/css/css-nestting/`.
This is part of #36245
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Diffstat (limited to 'components/script/dom/cssnesteddeclarations.rs')
-rw-r--r-- | components/script/dom/cssnesteddeclarations.rs | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/components/script/dom/cssnesteddeclarations.rs b/components/script/dom/cssnesteddeclarations.rs new file mode 100644 index 00000000000..2f2585631e1 --- /dev/null +++ b/components/script/dom/cssnesteddeclarations.rs @@ -0,0 +1,91 @@ +/* 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 servo_arc::Arc; +use style::shared_lock::{Locked, ToCssWithGuard}; +use style::stylesheets::{CssRuleType, NestedDeclarationsRule}; + +use crate::dom::bindings::codegen::Bindings::CSSNestedDeclarationsBinding::CSSNestedDeclarationsMethods; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::reflector::{DomGlobal, reflect_dom_object}; +use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; +use crate::dom::bindings::str::DOMString; +use crate::dom::cssrule::{CSSRule, SpecificCSSRule}; +use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner}; +use crate::dom::cssstylesheet::CSSStyleSheet; +use crate::dom::window::Window; +use crate::script_runtime::CanGc; + +#[dom_struct] +pub(crate) struct CSSNestedDeclarations { + cssrule: CSSRule, + #[ignore_malloc_size_of = "Arc"] + #[no_trace] + nesteddeclarationsrule: Arc<Locked<NestedDeclarationsRule>>, + style_decl: MutNullableDom<CSSStyleDeclaration>, +} + +impl CSSNestedDeclarations { + pub(crate) fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + nesteddeclarationsrule: Arc<Locked<NestedDeclarationsRule>>, + ) -> Self { + Self { + cssrule: CSSRule::new_inherited(parent_stylesheet), + nesteddeclarationsrule, + style_decl: Default::default(), + } + } + + #[cfg_attr(crown, allow(crown::unrooted_must_root))] + pub(crate) fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + nesteddeclarationsrule: Arc<Locked<NestedDeclarationsRule>>, + can_gc: CanGc, + ) -> DomRoot<Self> { + reflect_dom_object( + Box::new(Self::new_inherited( + parent_stylesheet, + nesteddeclarationsrule, + )), + window, + can_gc, + ) + } +} + +impl SpecificCSSRule for CSSNestedDeclarations { + fn ty(&self) -> CssRuleType { + CssRuleType::NestedDeclarations + } + + fn get_css(&self) -> DOMString { + let guard = self.cssrule.shared_lock().read(); + self.nesteddeclarationsrule + .read_with(&guard) + .to_css_string(&guard) + .into() + } +} + +impl CSSNestedDeclarationsMethods<crate::DomTypeHolder> for CSSNestedDeclarations { + /// <https://drafts.csswg.org/css-nesting/#dom-cssnesteddeclarations-style> + fn Style(&self, can_gc: CanGc) -> DomRoot<CSSStyleDeclaration> { + self.style_decl.or_init(|| { + let guard = self.cssrule.shared_lock().read(); + CSSStyleDeclaration::new( + self.global().as_window(), + CSSStyleOwner::CSSRule( + Dom::from_ref(self.upcast()), + self.nesteddeclarationsrule.read_with(&guard).block.clone(), + ), + None, + CSSModificationAccess::ReadWrite, + can_gc, + ) + }) + } +} |