Skip to main content

style/stylesheets/
view_transition_rule.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5//! A [`@view-transition`][view-transition] rule
6//!
7//! [view-transition]: https://drafts.csswg.org/css-view-transitions-2/#view-transition-rule
8
9use crate::derives::*;
10use crate::error_reporting::ContextualParseError;
11use crate::parser::ParserContext;
12use crate::properties::view_transition::{DescriptorParser, Descriptors};
13use crate::shared_lock::DeepCloneWithLock;
14use crate::shared_lock::{SharedRwLock, SharedRwLockReadGuard, ToCssWithGuard};
15use cssparser::{Parser, RuleBodyParser, SourceLocation};
16use std::fmt::{self, Write};
17use style_traits::{CssStringWriter, CssWriter, ToCss};
18
19/// A view-transition rule
20#[derive(Clone, Debug, MallocSizeOf, ToShmem)]
21pub struct ViewTransitionRule {
22    /// The descriptors of this view-transition rule.
23    pub descriptors: Descriptors,
24    /// The source position where this view-transition rule was found.
25    pub source_location: SourceLocation,
26}
27
28impl ViewTransitionRule {
29    /// Parses a ViewTransitionRule
30    pub fn parse(context: &ParserContext, input: &mut Parser, location: SourceLocation) -> Self {
31        let mut rule = ViewTransitionRule {
32            descriptors: Descriptors::default(),
33            source_location: location,
34        };
35
36        let mut parser = DescriptorParser {
37            context,
38            descriptors: &mut rule.descriptors,
39        };
40        let iter = RuleBodyParser::new(input, &mut parser);
41
42        for declaration in iter {
43            if let Err((error, slice, location)) = declaration {
44                let error = ContextualParseError::UnsupportedViewTransitionDescriptor(slice, error);
45                context.log_css_error(location, error);
46            }
47        }
48
49        rule
50    }
51}
52
53impl ToCssWithGuard for ViewTransitionRule {
54    fn to_css(&self, _guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
55        dest.write_str("@view-transition { ")?;
56        self.descriptors.to_css(&mut CssWriter::new(dest))?;
57        dest.write_str("}")
58    }
59}
60
61impl DeepCloneWithLock for ViewTransitionRule {
62    fn deep_clone_with_lock(&self, _lock: &SharedRwLock, _guard: &SharedRwLockReadGuard) -> Self {
63        self.clone()
64    }
65}
66
67/// <https://drafts.csswg.org/css-view-transitions-2/#view-transition-navigation>
68#[derive(Clone, Copy, Debug, Default, MallocSizeOf, Parse, PartialEq, ToCss, ToShmem)]
69#[repr(u8)]
70pub enum NavigationType {
71    /// No transition
72    #[default]
73    None,
74    /// Perform transition if conditions are met
75    Auto,
76}
77
78/// The `types` descriptor value: `none | <custom-ident>+`
79///
80/// <https://drafts.csswg.org/css-view-transitions-2/#typedef-pt-name-selector-list>
81pub use crate::values::specified::animation::ViewTransitionClass as TransitionTypes;