Bug 1348481 Part 3: Change stylesheet management methods in Servo_StyleSet to deal only with indices.
MozReview-Commit-ID: 6hHUX412k05
--- 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) {