author_styles.rs (2272B)
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 set of author stylesheets and their computed representation, such as the 6 //! ones used for ShadowRoot. 7 8 use crate::derives::*; 9 use crate::invalidation::stylesheets::StylesheetInvalidationSet; 10 use crate::shared_lock::SharedRwLockReadGuard; 11 use crate::stylesheet_set::AuthorStylesheetSet; 12 use crate::stylesheets::StylesheetInDocument; 13 use crate::stylist::CascadeData; 14 use crate::stylist::Stylist; 15 use servo_arc::Arc; 16 use std::sync::LazyLock; 17 18 /// A set of author stylesheets and their computed representation, such as the 19 /// ones used for ShadowRoot. 20 #[derive(MallocSizeOf)] 21 pub struct GenericAuthorStyles<S> 22 where 23 S: StylesheetInDocument + PartialEq + 'static, 24 { 25 /// The sheet collection, which holds the sheet pointers, the invalidations, 26 /// and all that stuff. 27 pub stylesheets: AuthorStylesheetSet<S>, 28 /// The actual cascade data computed from the stylesheets. 29 #[ignore_malloc_size_of = "Measured as part of the stylist"] 30 pub data: Arc<CascadeData>, 31 } 32 33 pub use self::GenericAuthorStyles as AuthorStyles; 34 35 static EMPTY_CASCADE_DATA: LazyLock<Arc<CascadeData>> = 36 LazyLock::new(|| Arc::new_leaked(CascadeData::new())); 37 38 impl<S> GenericAuthorStyles<S> 39 where 40 S: StylesheetInDocument + PartialEq + 'static, 41 { 42 /// Create an empty AuthorStyles. 43 #[inline] 44 pub fn new() -> Self { 45 Self { 46 stylesheets: AuthorStylesheetSet::new(), 47 data: EMPTY_CASCADE_DATA.clone(), 48 } 49 } 50 51 /// Flush the pending sheet changes, updating `data` as appropriate. 52 #[inline] 53 pub fn flush( 54 &mut self, 55 stylist: &mut Stylist, 56 guard: &SharedRwLockReadGuard, 57 ) -> StylesheetInvalidationSet { 58 let (flusher, mut invalidations) = self.stylesheets.flush(); 59 let result = stylist.rebuild_author_data( 60 &self.data, 61 flusher.sheets, 62 guard, 63 &mut invalidations.cascade_data_difference, 64 ); 65 if let Ok(Some(new_data)) = result { 66 self.data = new_data; 67 } 68 invalidations 69 } 70 }