diff options
Diffstat (limited to 'components/style/stylesheet_set.rs')
-rw-r--r-- | components/style/stylesheet_set.rs | 69 |
1 files changed, 45 insertions, 24 deletions
diff --git a/components/style/stylesheet_set.rs b/components/style/stylesheet_set.rs index e1f782bbbbf..0cc6f4fbf51 100644 --- a/components/style/stylesheet_set.rs +++ b/components/style/stylesheet_set.rs @@ -4,19 +4,26 @@ //! A centralized set of stylesheets for a document. -use arc_ptr_eq; -use std::sync::Arc; +use stylearc::Arc; use stylesheets::Stylesheet; +/// Entry for a StylesheetSet. We don't bother creating a constructor, because +/// there's no sensible defaults for the member variables. +pub struct StylesheetSetEntry { + unique_id: u32, + sheet: Arc<Stylesheet>, +} + /// The set of stylesheets effective for a given document. pub struct StylesheetSet { - /// The actual list of all the stylesheets that apply to the given document. + /// The actual list of all the stylesheets that apply to the given document, + /// each stylesheet associated with a unique ID. /// /// This is only a list of top-level stylesheets, and as such it doesn't /// include recursive `@import` rules. - stylesheets: Vec<Arc<Stylesheet>>, + entries: Vec<StylesheetSetEntry>, - /// Whether the stylesheets list above has changed since the last restyle. + /// Whether the entries list above has changed since the last restyle. dirty: bool, /// Has author style been disabled? @@ -27,7 +34,7 @@ impl StylesheetSet { /// Create a new empty StylesheetSet. pub fn new() -> Self { StylesheetSet { - stylesheets: vec![], + entries: vec![], dirty: false, author_style_disabled: false, } @@ -39,39 +46,51 @@ impl StylesheetSet { self.author_style_disabled } - fn remove_stylesheet_if_present(&mut self, sheet: &Arc<Stylesheet>) { - self.stylesheets.retain(|x| !arc_ptr_eq(x, sheet)); + fn remove_stylesheet_if_present(&mut self, unique_id: u32) { + self.entries.retain(|x| x.unique_id != unique_id); } /// Appends a new stylesheet to the current set. - pub fn append_stylesheet(&mut self, sheet: &Arc<Stylesheet>) { - self.remove_stylesheet_if_present(sheet); - self.stylesheets.push(sheet.clone()); + pub fn append_stylesheet(&mut self, sheet: &Arc<Stylesheet>, + unique_id: u32) { + self.remove_stylesheet_if_present(unique_id); + self.entries.push(StylesheetSetEntry { + unique_id: unique_id, + sheet: sheet.clone(), + }); self.dirty = true; } /// Prepend a new stylesheet to the current set. - pub fn prepend_stylesheet(&mut self, sheet: &Arc<Stylesheet>) { - self.remove_stylesheet_if_present(sheet); - self.stylesheets.insert(0, sheet.clone()); + pub fn prepend_stylesheet(&mut self, sheet: &Arc<Stylesheet>, + unique_id: u32) { + self.remove_stylesheet_if_present(unique_id); + self.entries.insert(0, StylesheetSetEntry { + unique_id: unique_id, + sheet: sheet.clone(), + }); self.dirty = true; } /// Insert a given stylesheet before another stylesheet in the document. pub fn insert_stylesheet_before(&mut self, sheet: &Arc<Stylesheet>, - before: &Arc<Stylesheet>) { - self.remove_stylesheet_if_present(sheet); - let index = self.stylesheets.iter().position(|x| { - arc_ptr_eq(x, before) - }).expect("`before` stylesheet not found"); - self.stylesheets.insert(index, sheet.clone()); + unique_id: u32, + before_unique_id: u32) { + self.remove_stylesheet_if_present(unique_id); + let index = self.entries.iter().position(|x| { + x.unique_id == before_unique_id + }).expect("`before_unique_id` stylesheet not found"); + self.entries.insert(index, StylesheetSetEntry { + unique_id: unique_id, + sheet: sheet.clone(), + }); self.dirty = true; } /// Remove a given stylesheet from the set. - pub fn remove_stylesheet(&mut self, sheet: &Arc<Stylesheet>) { - self.remove_stylesheet_if_present(sheet); + pub fn remove_stylesheet(&mut self, unique_id: u32) { + self.remove_stylesheet_if_present(unique_id); self.dirty = true; } @@ -90,9 +109,11 @@ impl StylesheetSet { } /// Flush the current set, unmarking it as dirty. - pub fn flush(&mut self) -> &[Arc<Stylesheet>] { + pub fn flush(&mut self, sheets: &mut Vec<Arc<Stylesheet>>) { self.dirty = false; - &self.stylesheets + for entry in &self.entries { + sheets.push(entry.sheet.clone()) + } } /// Mark the stylesheets as dirty, because something external may have |