1use crate::dom::TElement;
9use crate::invalidation::media_queries::ToMediaListKey;
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;
16
17#[derive(MallocSizeOf)]
20pub struct GenericAuthorStyles<S>
21where
22 S: StylesheetInDocument + PartialEq + 'static,
23{
24 pub stylesheets: AuthorStylesheetSet<S>,
27 #[ignore_malloc_size_of = "Measured as part of the stylist"]
29 pub data: Arc<CascadeData>,
30}
31
32pub use self::GenericAuthorStyles as AuthorStyles;
33
34lazy_static! {
35 static ref EMPTY_CASCADE_DATA: Arc<CascadeData> = Arc::new_leaked(CascadeData::new());
36}
37
38impl<S> GenericAuthorStyles<S>
39where
40 S: StylesheetInDocument + PartialEq + 'static,
41{
42 #[inline]
44 pub fn new() -> Self {
45 Self {
46 stylesheets: AuthorStylesheetSet::new(),
47 data: EMPTY_CASCADE_DATA.clone(),
48 }
49 }
50
51 #[inline]
56 pub fn flush<E>(&mut self, stylist: &mut Stylist, guard: &SharedRwLockReadGuard)
57 where
58 E: TElement,
59 S: ToMediaListKey,
60 {
61 let flusher = self
62 .stylesheets
63 .flush::<E>(None, None);
64
65 let result = stylist.rebuild_author_data(&self.data, flusher.sheets, guard);
66 if let Ok(Some(new_data)) = result {
67 self.data = new_data;
68 }
69 }
70}