tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }