style: Only flush stylesheet invalidations for origins that have changed.

This commit is contained in:
Cameron McCormack 2017-08-12 17:23:56 +08:00
parent f3a7adfcc7
commit 84451e521b
2 changed files with 19 additions and 9 deletions

View file

@ -163,7 +163,7 @@ impl PerDocumentStyleDataImpl {
} }
let author_style_disabled = self.stylesheets.author_style_disabled(); let author_style_disabled = self.stylesheets.author_style_disabled();
self.stylist.clear();
let iter = self.stylesheets.flush(document_element); let iter = self.stylesheets.flush(document_element);
self.stylist.rebuild( self.stylist.rebuild(
iter, iter,

View file

@ -8,7 +8,7 @@ use dom::TElement;
use invalidation::stylesheets::StylesheetInvalidationSet; use invalidation::stylesheets::StylesheetInvalidationSet;
use shared_lock::SharedRwLockReadGuard; use shared_lock::SharedRwLockReadGuard;
use std::slice; use std::slice;
use stylesheets::{PerOrigin, StylesheetInDocument}; use stylesheets::{Origin, PerOrigin, StylesheetInDocument};
use stylist::Stylist; use stylist::Stylist;
/// Entry for a StylesheetSet. We don't bother creating a constructor, because /// Entry for a StylesheetSet. We don't bother creating a constructor, because
@ -168,7 +168,7 @@ where
/// over the new stylesheet list. /// over the new stylesheet list.
pub fn flush<E>( pub fn flush<E>(
&mut self, &mut self,
document_element: Option<E> document_element: Option<E>,
) -> StylesheetIterator<S> ) -> StylesheetIterator<S>
where where
E: TElement, E: TElement,
@ -176,9 +176,11 @@ where
debug!("StylesheetSet::flush"); debug!("StylesheetSet::flush");
debug_assert!(self.has_changed()); debug_assert!(self.has_changed());
for data in self.invalidation_data.iter_mut_origins() { for (data, _) in self.invalidation_data.iter_mut_origins() {
data.0.invalidations.flush(document_element); if data.dirty {
data.0.dirty = false; data.invalidations.flush(document_element);
data.dirty = false;
}
} }
self.iter() self.iter()
@ -194,11 +196,19 @@ where
/// ///
/// FIXME(emilio): Make this more granular. /// FIXME(emilio): Make this more granular.
pub fn force_dirty(&mut self) { pub fn force_dirty(&mut self) {
for data in self.invalidation_data.iter_mut_origins() { for (data, _) in self.invalidation_data.iter_mut_origins() {
data.0.invalidations.invalidate_fully(); data.invalidations.invalidate_fully();
data.0.dirty = true; data.dirty = true;
} }
} }
/// Mark the stylesheets for the specified origin as dirty, because
/// something external may have invalidated it.
pub fn force_dirty_origin(&mut self, origin: &Origin) {
let data = self.invalidation_data.borrow_mut_for_origin(origin);
data.invalidations.invalidate_fully();
data.dirty = true;
}
} }
struct InvalidationData { struct InvalidationData {