diff --git a/components/style/gecko/data.rs b/components/style/gecko/data.rs index 3e44ee02e2a..1ac69f2f29e 100644 --- a/components/style/gecko/data.rs +++ b/components/style/gecko/data.rs @@ -163,7 +163,7 @@ impl PerDocumentStyleDataImpl { } let author_style_disabled = self.stylesheets.author_style_disabled(); - self.stylist.clear(); + let iter = self.stylesheets.flush(document_element); self.stylist.rebuild( iter, diff --git a/components/style/stylesheet_set.rs b/components/style/stylesheet_set.rs index 039a7a1e611..60f35dd2788 100644 --- a/components/style/stylesheet_set.rs +++ b/components/style/stylesheet_set.rs @@ -8,7 +8,7 @@ use dom::TElement; use invalidation::stylesheets::StylesheetInvalidationSet; use shared_lock::SharedRwLockReadGuard; use std::slice; -use stylesheets::{PerOrigin, StylesheetInDocument}; +use stylesheets::{Origin, PerOrigin, StylesheetInDocument}; use stylist::Stylist; /// Entry for a StylesheetSet. We don't bother creating a constructor, because @@ -168,7 +168,7 @@ where /// over the new stylesheet list. pub fn flush( &mut self, - document_element: Option + document_element: Option, ) -> StylesheetIterator where E: TElement, @@ -176,9 +176,11 @@ where debug!("StylesheetSet::flush"); debug_assert!(self.has_changed()); - for data in self.invalidation_data.iter_mut_origins() { - data.0.invalidations.flush(document_element); - data.0.dirty = false; + for (data, _) in self.invalidation_data.iter_mut_origins() { + if data.dirty { + data.invalidations.flush(document_element); + data.dirty = false; + } } self.iter() @@ -194,11 +196,19 @@ where /// /// FIXME(emilio): Make this more granular. pub fn force_dirty(&mut self) { - for data in self.invalidation_data.iter_mut_origins() { - data.0.invalidations.invalidate_fully(); - data.0.dirty = true; + for (data, _) in self.invalidation_data.iter_mut_origins() { + data.invalidations.invalidate_fully(); + 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 {