stylo: Run the stylehseet invalidation pass also for stylesheet removals. draft
authorEmilio Cobos Álvarez <emilio@crisal.io>
Sun, 09 Jul 2017 04:09:12 +0200
changeset 605766 76ea77b75f47496732346b0701eaea2f7c81f75a
parent 605765 fe590db882de7fba5b46a1f6aac64178b42062bb
child 605767 54d2cfcbd90c7703452044193cdd3fe51feb7c62
child 605795 85ccbec0687e48a8f0524da580408d9c7eedcf9f
push id67507
push userbmo:emilio+bugs@crisal.io
push dateSun, 09 Jul 2017 02:54:13 +0000
bugs1379203
milestone56.0a1
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
servo/components/style/stylesheet_set.rs
servo/ports/geckolib/glue.rs
--- 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,
 ) {