1use crate::derives::*;
9use crate::invalidation::stylesheets::StylesheetInvalidationSet;
10use crate::shared_lock::SharedRwLockReadGuard;
11use crate::stylesheet_set::AuthorStylesheetSet;
12use crate::stylesheets::StylesheetInDocument;
13use crate::stylist::CascadeData;
14use crate::stylist::Stylist;
15use servo_arc::Arc;
16use std::sync::LazyLock;
17
18#[derive(MallocSizeOf)]
21pub struct GenericAuthorStyles<S>
22where
23 S: StylesheetInDocument + PartialEq + 'static,
24{
25 pub stylesheets: AuthorStylesheetSet<S>,
28 #[ignore_malloc_size_of = "Measured as part of the stylist"]
30 pub data: Arc<CascadeData>,
31}
32
33pub use self::GenericAuthorStyles as AuthorStyles;
34
35static EMPTY_CASCADE_DATA: LazyLock<Arc<CascadeData>> =
36 LazyLock::new(|| Arc::new_leaked(CascadeData::new()));
37
38impl<S> Default for GenericAuthorStyles<S>
39where
40 S: StylesheetInDocument + PartialEq + 'static,
41{
42 fn default() -> Self {
43 Self::new()
44 }
45}
46
47impl<S> GenericAuthorStyles<S>
48where
49 S: StylesheetInDocument + PartialEq + 'static,
50{
51 #[inline]
53 pub fn new() -> Self {
54 Self {
55 stylesheets: AuthorStylesheetSet::new(),
56 data: EMPTY_CASCADE_DATA.clone(),
57 }
58 }
59
60 #[inline]
62 pub fn flush(
63 &mut self,
64 stylist: &mut Stylist,
65 guard: &SharedRwLockReadGuard,
66 ) -> StylesheetInvalidationSet {
67 let (flusher, mut invalidations) =
70 self.stylesheets
71 .flush(None, self.data.custom_media_map(), guard);
72 let result = stylist.rebuild_author_data(
73 &self.data,
74 flusher.sheets,
75 guard,
76 &mut invalidations.cascade_data_difference,
77 );
78 if let Ok(Some(new_data)) = result {
79 self.data = new_data;
80 }
81 invalidations
82 }
83}