diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index 366b07a3bbf..4a4650d163c 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -1885,6 +1885,11 @@ extern "C" { unique_id: u64, before_unique_id: u64); } +extern "C" { + pub fn Servo_StyleSet_UpdateStyleSheet(set: RawServoStyleSetBorrowed, + sheet: RawServoStyleSheetBorrowed, + unique_id: u64); +} extern "C" { pub fn Servo_StyleSet_FlushStyleSheets(set: RawServoStyleSetBorrowed, doc_elem: diff --git a/components/style/stylesheet_set.rs b/components/style/stylesheet_set.rs index 15bbf285a69..8c66d51c3b0 100644 --- a/components/style/stylesheet_set.rs +++ b/components/style/stylesheet_set.rs @@ -137,6 +137,23 @@ impl StylesheetSet { guard) } + /// Update the sheet that matches the unique_id. + pub fn update_stylesheet( + &mut self, + sheet: &Arc, + unique_id: u64) + { + // Since this function doesn't set self.dirty, or call + // self.invalidations.collect_invalidations_for, it should + // only be called in the case where sheet is a clone of + // the sheet it is updating. + debug!("StylesheetSet::update_stylesheet"); + if let Some(entry) = self.entries.iter_mut().find( + |e| e.unique_id == unique_id) { + entry.sheet = sheet.clone(); + } + } + /// Remove a given stylesheet from the set. pub fn remove_stylesheet(&mut self, unique_id: u64) { debug!("StylesheetSet::remove_stylesheet"); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 2ae1ea05f92..2ef968da837 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -909,6 +909,17 @@ pub extern "C" fn Servo_StyleSet_InsertStyleSheetBefore(raw_data: RawServoStyleS data.clear_stylist(); } +#[no_mangle] +pub extern "C" fn Servo_StyleSet_UpdateStyleSheet(raw_data: RawServoStyleSetBorrowed, + raw_sheet: RawServoStyleSheetBorrowed, + unique_id: u64) { + let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut(); + let sheet = HasArcFFI::as_arc(&raw_sheet); + data.stylesheets.update_stylesheet( + sheet, + unique_id); +} + #[no_mangle] pub extern "C" fn Servo_StyleSet_RemoveStyleSheet(raw_data: RawServoStyleSetBorrowed, unique_id: u64) {