Bug 1348481 Part 3: Change stylesheet management methods in Servo_StyleSet to deal only with indices. draft
authorBrad Werth <bwerth@mozilla.com>
Tue, 18 Apr 2017 11:45:53 -0700
changeset 564604 a19649338666e483dd14773fb2cf9f3783db22c2
parent 564603 9f0ef169ba2ace382b4752245f345d233d7e353f
child 564605 9276a9858a83f3e4d3a61006a81c0c6504ac3586
push id54663
push userbwerth@mozilla.com
push dateTue, 18 Apr 2017 20:47:30 +0000
bugs1348481
milestone55.0a1
Bug 1348481 Part 3: Change stylesheet management methods in Servo_StyleSet to deal only with indices. MozReview-Commit-ID: 6hHUX412k05
layout/style/ServoStyleSet.cpp
servo/ports/geckolib/glue.rs
--- a/layout/style/ServoStyleSet.cpp
+++ b/layout/style/ServoStyleSet.cpp
@@ -643,32 +643,37 @@ ServoStyleSet::InsertStyleSheetBefore(Sh
   MOZ_ASSERT(aNewSheet);
   MOZ_ASSERT(aReferenceSheet);
   MOZ_ASSERT(aNewSheet->IsApplicable());
 
   size_t idx = FindLocalIndexOfSheetOfType(aReferenceSheet, aType);
   if (idx == NO_RAW_INDEX) {
     return NS_ERROR_INVALID_ARG;
   }
-  size_t& referenceRawIndex = mSheets[aType][idx].rawIndex;
-
+  size_t referenceRawIndex = mSheets[aType][idx].rawIndex;
   size_t oldRawIndex = RemoveSheetOfType(aNewSheet, aType);
 
   MOZ_ASSERT(aNewSheet->RawSheet(), "Raw sheet should be in place before insertion.");
   size_t& rawIndex = InsertSheetOfType(aNewSheet, aType, idx);
 
   if (mRawSet) {
     // Maintain a mirrored list of sheets on the servo side.
+    MOZ_ASSERT(referenceRawIndex != NO_RAW_INDEX,
+               "Referencing a sheet that isn't tracked by Stylo.");
+
     if (oldRawIndex != NO_RAW_INDEX) {
       Servo_StyleSet_RemoveStyleSheet(mRawSet.get(), oldRawIndex, false);
       FixupRawIndexedSheetsAfterRawIndex(oldRawIndex, -1);
+
+      // Might also need to fixup the referenceRawIndex.
+      if (referenceRawIndex >= oldRawIndex) {
+        --referenceRawIndex;
+      }
     }
 
-    MOZ_ASSERT(referenceRawIndex != NO_RAW_INDEX,
-               "Referencing a sheet that isn't tracked by Stylo.");
     Servo_StyleSet_InsertStyleSheetBefore(mRawSet.get(),
                                           aNewSheet->RawSheet(),
                                           referenceRawIndex,
                                           !mBatching);
 
     FixupRawIndexedSheetsAfterRawIndex(referenceRawIndex, 1);
     rawIndex = referenceRawIndex;
   }
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -8,17 +8,16 @@ use cssparser::ToCss as ParserToCss;
 use env_logger::LogBuilder;
 use parking_lot::RwLock;
 use selectors::Element;
 use std::borrow::Cow;
 use std::env;
 use std::fmt::Write;
 use std::ptr;
 use std::sync::{Arc, Mutex};
-use style::arc_ptr_eq;
 use style::context::{QuirksMode, SharedStyleContext, StyleContext};
 use style::context::{ThreadLocalStyleContext, ThreadLocalStyleContextCreationInfo};
 use style::data::{ElementData, ElementStyles, RestyleData};
 use style::dom::{AnimationOnlyDirtyDescendants, DirtyDescendants};
 use style::dom::{ShowSubtreeData, TElement, TNode};
 use style::error_reporting::StdoutErrorReporter;
 use style::font_metrics::get_metrics_provider_for_product;
 use style::gecko::data::{PerDocumentStyleData, PerDocumentStyleDataImpl};
@@ -568,73 +567,68 @@ pub extern "C" fn Servo_StyleSheet_Clear
     let sheet = Stylesheet::as_arc(&stylesheet);
     Stylesheet::update_from_str(&sheet, input, url_data,
                                 loader, &StdoutErrorReporter);
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_StyleSet_AppendStyleSheet(raw_data: RawServoStyleSetBorrowed,
                                                   raw_sheet: RawServoStyleSheetBorrowed,
-                                                  flush: bool) {
+                                                  flush: bool) -> usize {
     let global_style_data = &*GLOBAL_STYLE_DATA;
     let guard = global_style_data.shared_lock.read();
     let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
-    let sheet = HasArcFFI::as_arc(&raw_sheet);
-    data.stylesheets.retain(|x| !arc_ptr_eq(x, sheet));
+    let sheet: &Arc<Stylesheet> = HasArcFFI::as_arc(&raw_sheet);
     data.stylesheets.push(sheet.clone());
     data.stylesheets_changed = true;
     if flush {
         data.flush_stylesheets(&guard);
     }
+    data.stylesheets.len() - 1
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_StyleSet_PrependStyleSheet(raw_data: RawServoStyleSetBorrowed,
                                                    raw_sheet: RawServoStyleSheetBorrowed,
                                                    flush: bool) {
     let global_style_data = &*GLOBAL_STYLE_DATA;
     let guard = global_style_data.shared_lock.read();
     let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
-    let sheet = HasArcFFI::as_arc(&raw_sheet);
-    data.stylesheets.retain(|x| !arc_ptr_eq(x, sheet));
+    let sheet: &Arc<Stylesheet> = HasArcFFI::as_arc(&raw_sheet);
     data.stylesheets.insert(0, sheet.clone());
     data.stylesheets_changed = true;
     if flush {
         data.flush_stylesheets(&guard);
     }
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_StyleSet_InsertStyleSheetBefore(raw_data: RawServoStyleSetBorrowed,
                                                         raw_sheet: RawServoStyleSheetBorrowed,
-                                                        raw_reference: RawServoStyleSheetBorrowed,
+                                                        index: usize,
                                                         flush: bool) {
     let global_style_data = &*GLOBAL_STYLE_DATA;
     let guard = global_style_data.shared_lock.read();
     let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
-    let sheet = HasArcFFI::as_arc(&raw_sheet);
-    let reference = HasArcFFI::as_arc(&raw_reference);
-    data.stylesheets.retain(|x| !arc_ptr_eq(x, sheet));
-    let index = data.stylesheets.iter().position(|x| arc_ptr_eq(x, reference)).unwrap();
+    let sheet: &Arc<Stylesheet> = HasArcFFI::as_arc(&raw_sheet);
     data.stylesheets.insert(index, sheet.clone());
     data.stylesheets_changed = true;
     if flush {
         data.flush_stylesheets(&guard);
     }
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_StyleSet_RemoveStyleSheet(raw_data: RawServoStyleSetBorrowed,
-                                                  raw_sheet: RawServoStyleSheetBorrowed,
+                                                  index: usize,
                                                   flush: bool) {
     let global_style_data = &*GLOBAL_STYLE_DATA;
     let guard = global_style_data.shared_lock.read();
     let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
-    let sheet = HasArcFFI::as_arc(&raw_sheet);
-    data.stylesheets.retain(|x| !arc_ptr_eq(x, sheet));
+    data.stylesheets.remove(index);
     data.stylesheets_changed = true;
     if flush {
         data.flush_stylesheets(&guard);
     }
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_StyleSet_FlushStyleSheets(raw_data: RawServoStyleSetBorrowed) {