stylo: Run the stylehseet invalidation pass also for stylesheet removals.
draft
stylo: Run the stylehseet invalidation pass also for stylesheet removals.
People apparently do all sorts of silly stuff with stylesheets, see Google Inbox
in
bug 1379203.
MozReview-Commit-ID: 4x2d3glOFu8
--- a/servo/components/style/stylesheet_set.rs
+++ b/servo/components/style/stylesheet_set.rs
@@ -120,39 +120,47 @@ where
}
/// Insert a given stylesheet before another stylesheet in the document.
pub fn insert_stylesheet_before(
&mut self,
stylist: &Stylist,
sheet: S,
before_sheet: S,
- guard: &SharedRwLockReadGuard)
- {
+ guard: &SharedRwLockReadGuard
+ ) {
debug!("StylesheetSet::insert_stylesheet_before");
self.remove_stylesheet_if_present(&sheet);
let index = self.entries.iter().position(|entry| {
entry.sheet == before_sheet
}).expect("`before_sheet` stylesheet not found");
self.invalidations.collect_invalidations_for(
stylist,
&sheet,
guard
);
self.entries.insert(index, StylesheetSetEntry { sheet });
self.dirty = true;
}
/// Remove a given stylesheet from the set.
- pub fn remove_stylesheet(&mut self, sheet: S) {
+ pub fn remove_stylesheet(
+ &mut self,
+ stylist: &Stylist,
+ sheet: S,
+ guard: &SharedRwLockReadGuard,
+ ) {
debug!("StylesheetSet::remove_stylesheet");
self.remove_stylesheet_if_present(&sheet);
self.dirty = true;
- // FIXME(emilio): We can do better!
- self.invalidations.invalidate_fully();
+ self.invalidations.collect_invalidations_for(
+ stylist,
+ &sheet,
+ guard
+ );
}
/// Notes that the author style has been disabled for this document.
pub fn set_author_style_disabled(&mut self, disabled: bool) {
debug!("StylesheetSet::set_author_style_disabled");
if self.author_style_disabled == disabled {
return;
}
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -872,27 +872,35 @@ pub extern "C" fn Servo_StyleSet_InsertS
let global_style_data = &*GLOBAL_STYLE_DATA;
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
let mut data = &mut *data;
let guard = global_style_data.shared_lock.read();
data.stylesheets.insert_stylesheet_before(
&data.stylist,
unsafe { GeckoStyleSheet::new(sheet) },
unsafe { GeckoStyleSheet::new(before_sheet) },
- &guard);
+ &guard,
+ );
data.clear_stylist();
}
#[no_mangle]
pub extern "C" fn Servo_StyleSet_RemoveStyleSheet(
raw_data: RawServoStyleSetBorrowed,
sheet: *const ServoStyleSheet
) {
+ let global_style_data = &*GLOBAL_STYLE_DATA;
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
- data.stylesheets.remove_stylesheet(unsafe { GeckoStyleSheet::new(sheet) });
+ let mut data = &mut *data;
+ let guard = global_style_data.shared_lock.read();
+ data.stylesheets.remove_stylesheet(
+ &data.stylist,
+ unsafe { GeckoStyleSheet::new(sheet) },
+ &guard,
+ );
data.clear_stylist();
}
#[no_mangle]
pub extern "C" fn Servo_StyleSet_FlushStyleSheets(
raw_data: RawServoStyleSetBorrowed,
doc_element: RawGeckoElementBorrowedOrNull,
) {