aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/document.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r--components/script/dom/document.rs132
1 files changed, 65 insertions, 67 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index bef1edc68fd..4ec2e67521c 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -3191,6 +3191,65 @@ impl Document {
}
self.shadow_roots_styles_changed.set(false);
}
+
+ pub fn stylesheet_count(&self) -> usize {
+ self.stylesheets.borrow().len()
+ }
+
+ pub fn stylesheet_at(&self, index: usize) -> Option<DomRoot<CSSStyleSheet>> {
+ let stylesheets = self.stylesheets.borrow();
+
+ stylesheets
+ .get(Origin::Author, index)
+ .and_then(|s| s.owner.upcast::<Node>().get_cssom_stylesheet())
+ }
+
+ /// Add a stylesheet owned by `owner` to the list of document sheets, in the
+ /// correct tree position.
+ #[allow(unrooted_must_root)] // Owner needs to be rooted already necessarily.
+ pub fn add_stylesheet(&self, owner: &Element, sheet: Arc<Stylesheet>) {
+ let stylesheets = &mut *self.stylesheets.borrow_mut();
+ let insertion_point = stylesheets
+ .iter()
+ .map(|(sheet, _origin)| sheet)
+ .find(|sheet_in_doc| {
+ owner
+ .upcast::<Node>()
+ .is_before(sheet_in_doc.owner.upcast())
+ })
+ .cloned();
+
+ self.window
+ .layout_chan()
+ .send(Msg::AddStylesheet(
+ sheet.clone(),
+ insertion_point.as_ref().map(|s| s.sheet.clone()),
+ ))
+ .unwrap();
+
+ DocumentOrShadowRoot::add_stylesheet(
+ owner,
+ StylesheetSet::Document(stylesheets),
+ sheet,
+ insertion_point,
+ self.style_shared_lock(),
+ );
+ }
+
+ /// Remove a stylesheet owned by `owner` from the list of document sheets.
+ #[allow(unrooted_must_root)] // Owner needs to be rooted already necessarily.
+ pub fn remove_stylesheet(&self, owner: &Element, s: &Arc<Stylesheet>) {
+ self.window
+ .layout_chan()
+ .send(Msg::RemoveStylesheet(s.clone()))
+ .unwrap();
+
+ DocumentOrShadowRoot::remove_stylesheet(
+ owner,
+ s,
+ StylesheetSet::Document(&mut *self.stylesheets.borrow_mut()),
+ )
+ }
}
impl Element {
@@ -3222,8 +3281,12 @@ impl ProfilerMetadataFactory for Document {
impl DocumentMethods for Document {
// https://drafts.csswg.org/cssom/#dom-document-stylesheets
fn StyleSheets(&self) -> DomRoot<StyleSheetList> {
- self.stylesheet_list
- .or_init(|| StyleSheetList::new(&self.window, Box::new(Dom::from_ref(self))))
+ self.stylesheet_list.or_init(|| {
+ StyleSheetList::new(
+ &self.window,
+ StyleSheetListOwner::Document(Dom::from_ref(self)),
+ )
+ })
}
// https://dom.spec.whatwg.org/#dom-document-implementation
@@ -4606,68 +4669,3 @@ impl PendingScript {
.map(|result| (DomRoot::from_ref(&*self.element), result))
}
}
-
-impl StyleSheetListOwner for Dom<Document> {
- fn stylesheet_count(&self) -> usize {
- self.stylesheets.borrow().len()
- }
-
- fn stylesheet_at(&self, index: usize) -> Option<DomRoot<CSSStyleSheet>> {
- let stylesheets = self.stylesheets.borrow();
-
- stylesheets
- .get(Origin::Author, index)
- .and_then(|s| s.owner.upcast::<Node>().get_cssom_stylesheet())
- }
-
- /// Add a stylesheet owned by `owner` to the list of document sheets, in the
- /// correct tree position.
- #[allow(unrooted_must_root)] // Owner needs to be rooted already necessarily.
- fn add_stylesheet(&self, owner: &Element, sheet: Arc<Stylesheet>) {
- let stylesheets = &mut *self.stylesheets.borrow_mut();
- let insertion_point = stylesheets
- .iter()
- .map(|(sheet, _origin)| sheet)
- .find(|sheet_in_doc| {
- owner
- .upcast::<Node>()
- .is_before(sheet_in_doc.owner.upcast())
- })
- .cloned();
-
- self.window
- .layout_chan()
- .send(Msg::AddStylesheet(
- sheet.clone(),
- insertion_point.as_ref().map(|s| s.sheet.clone()),
- ))
- .unwrap();
-
- DocumentOrShadowRoot::add_stylesheet(
- owner,
- StylesheetSet::Document(stylesheets),
- sheet,
- insertion_point,
- self.style_shared_lock(),
- );
- }
-
- /// Remove a stylesheet owned by `owner` from the list of document sheets.
- #[allow(unrooted_must_root)] // Owner needs to be rooted already necessarily.
- fn remove_stylesheet(&self, owner: &Element, s: &Arc<Stylesheet>) {
- self.window
- .layout_chan()
- .send(Msg::RemoveStylesheet(s.clone()))
- .unwrap();
-
- DocumentOrShadowRoot::remove_stylesheet(
- owner,
- s,
- StylesheetSet::Document(&mut *self.stylesheets.borrow_mut()),
- )
- }
-
- fn invalidate_stylesheets(&self) {
- Document::invalidate_stylesheets(self);
- }
-}