aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-02-08 19:57:00 +0100
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-04-26 10:17:47 +0200
commit23b92d54d48274f4e80521c427a959cfd4cb646c (patch)
tree5722a06b5a7a7b801c5d4137aec34e0f878e27c7 /components/script
parent3bb50cc4795c3ac98d25e2b54d871ded2c3f3fed (diff)
downloadservo-23b92d54d48274f4e80521c427a959cfd4cb646c.tar.gz
servo-23b92d54d48274f4e80521c427a959cfd4cb646c.zip
Remove stylesheets ownership from DocumentOrShadowRoot
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/trace.rs12
-rw-r--r--components/script/dom/document.rs45
-rw-r--r--components/script/dom/documentorshadowroot.rs62
-rw-r--r--components/script/dom/htmlstyleelement.rs2
-rw-r--r--components/script/dom/shadowroot.rs31
5 files changed, 86 insertions, 66 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 06ee56e173a..2d568208b69 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -119,6 +119,7 @@ use std::sync::atomic::{AtomicBool, AtomicUsize};
use std::sync::{Arc, Mutex};
use std::time::{Instant, SystemTime};
use style::attr::{AttrIdentifier, AttrValue, LengthOrPercentageOrAuto};
+use style::author_styles::AuthorStyles;
use style::context::QuirksMode;
use style::dom::OpaqueNode;
use style::element_state::*;
@@ -130,6 +131,7 @@ use style::stylesheet_set::{AuthorStylesheetSet, DocumentStylesheetSet};
use style::stylesheets::keyframes_rule::Keyframe;
use style::stylesheets::{CssRules, FontFaceRule, KeyframesRule, MediaRule, Stylesheet};
use style::stylesheets::{ImportRule, NamespaceRule, StyleRule, SupportsRule, ViewportRule};
+use style::stylist::CascadeData;
use style::values::specified::Length;
use tendril::fmt::UTF8;
use tendril::stream::LossyDecoder;
@@ -499,6 +501,7 @@ unsafe_no_jsmanaged_fields!(Rotation3D<f64>, Transform2D<f32>, Transform3D<f64>)
unsafe_no_jsmanaged_fields!(Point2D<f32>, Vector2D<f32>, Rect<Au>);
unsafe_no_jsmanaged_fields!(Rect<f32>, RigidTransform3D<f64>);
unsafe_no_jsmanaged_fields!(StyleSheetListOwner);
+unsafe_no_jsmanaged_fields!(CascadeData);
unsafe impl<'a> JSTraceable for &'a str {
#[inline]
@@ -728,6 +731,15 @@ where
}
}
+unsafe impl<S> JSTraceable for AuthorStyles<S>
+where
+ S: JSTraceable + ::style::stylesheets::StylesheetInDocument + PartialEq + 'static,
+{
+ unsafe fn trace(&self, tracer: *mut JSTracer) {
+ self.stylesheets.trace(tracer)
+ }
+}
+
unsafe impl<Sink> JSTraceable for LossyDecoder<Sink>
where
Sink: JSTraceable + TendrilSink<UTF8>,
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index ad4099bdbf9..977bff505dc 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -156,7 +156,7 @@ use style::selector_parser::{RestyleDamage, Snapshot};
use style::shared_lock::SharedRwLock as StyleSharedRwLock;
use style::str::{split_html_space_chars, str_join};
use style::stylesheet_set::DocumentStylesheetSet;
-use style::stylesheets::Stylesheet;
+use style::stylesheets::{Origin, OriginSet, Stylesheet};
use url::percent_encoding::percent_decode;
use url::Host;
@@ -574,7 +574,7 @@ impl Document {
// FIXME: This should check the dirty bit on the document,
// not the document element. Needs some layout changes to make
// that workable.
- self.document_or_shadow_root.stylesheets_have_changed() ||
+ self.stylesheets.borrow().has_changed() ||
self.GetDocumentElement().map_or(false, |root| {
root.upcast::<Node>().has_dirty_descendants() ||
!self.pending_restyles.borrow().is_empty() ||
@@ -1536,7 +1536,7 @@ impl Document {
}
pub fn invalidate_stylesheets(&self) {
- self.document_or_shadow_root.invalidate_stylesheets();
+ self.stylesheets.borrow_mut().force_dirty(OriginSet::all());
// Mark the document element dirty so a reflow will be performed.
//
@@ -2821,9 +2821,9 @@ impl Document {
// and normal stylesheets additions / removals, because in the last case
// the layout thread already has that information and we could avoid
// dirtying the whole thing.
- let have_changed = self.document_or_shadow_root.stylesheets_have_changed();
- self.document_or_shadow_root
- .flush_stylesheets_without_invalidation();
+ let mut stylesheets = self.stylesheets.borrow_mut();
+ let have_changed = stylesheets.has_changed();
+ stylesheets.flush_without_invalidation();
have_changed
}
@@ -4550,24 +4550,47 @@ impl PendingScript {
impl StyleSheetListOwner for Dom<Document> {
fn stylesheet_count(&self) -> usize {
- self.document_or_shadow_root.stylesheet_count()
+ self.stylesheets.borrow().len()
}
fn stylesheet_at(&self, index: usize) -> Option<DomRoot<CSSStyleSheet>> {
- self.document_or_shadow_root.stylesheet_at(index)
+ 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>) {
- self.document_or_shadow_root
- .add_stylesheet(owner, sheet, self.style_shared_lock());
+ 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.document_or_shadow_root.add_stylesheet(
+ owner,
+ 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.document_or_shadow_root.remove_stylesheet(owner, s)
+ self.document_or_shadow_root.remove_stylesheet(
+ owner,
+ s,
+ &mut *self.stylesheets.borrow_mut(),
+ )
}
}
diff --git a/components/script/dom/documentorshadowroot.rs b/components/script/dom/documentorshadowroot.rs
index b1ea9ee1549..577df4bfd51 100644
--- a/components/script/dom/documentorshadowroot.rs
+++ b/components/script/dom/documentorshadowroot.rs
@@ -2,16 +2,14 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeBinding::NodeMethods;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::num::Finite;
use crate::dom::bindings::root::{Dom, DomRoot};
-use crate::dom::cssstylesheet::CSSStyleSheet;
use crate::dom::element::Element;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlmetaelement::HTMLMetaElement;
-use crate::dom::node::{self, Node};
+use crate::dom::node;
use crate::dom::window::Window;
use euclid::Point2D;
use js::jsapi::JS_GetRuntime;
@@ -22,15 +20,15 @@ use std::fmt;
use style::context::QuirksMode;
use style::media_queries::MediaList;
use style::shared_lock::{SharedRwLock as StyleSharedRwLock, SharedRwLockReadGuard};
-use style::stylesheet_set::DocumentStylesheetSet;
-use style::stylesheets::{CssRule, Origin, OriginSet, Stylesheet};
+use style::stylesheet_set::StylesheetSet;
+use style::stylesheets::{CssRule, Origin, Stylesheet};
#[derive(Clone, JSTraceable, MallocSizeOf)]
#[must_root]
pub struct StyleSheetInDocument {
#[ignore_malloc_size_of = "Arc"]
- sheet: Arc<Stylesheet>,
- owner: Dom<Element>,
+ pub sheet: Arc<Stylesheet>,
+ pub owner: Dom<Element>,
}
impl fmt::Debug for StyleSheetInDocument {
@@ -72,16 +70,12 @@ impl ::style::stylesheets::StylesheetInDocument for StyleSheetInDocument {
#[derive(JSTraceable, MallocSizeOf)]
pub struct DocumentOrShadowRoot {
window: Dom<Window>,
- /// List of stylesheets associated with nodes in this document or shadow root.
- /// |None| if the list needs to be refreshed.
- stylesheets: DomRefCell<DocumentStylesheetSet<StyleSheetInDocument>>,
}
impl DocumentOrShadowRoot {
pub fn new(window: &Window) -> Self {
Self {
window: Dom::from_ref(window),
- stylesheets: DomRefCell::new(DocumentStylesheetSet::new()),
}
}
@@ -207,33 +201,14 @@ impl DocumentOrShadowRoot {
}
}
- 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())
- }
-
- pub fn stylesheets_have_changed(&self) -> bool {
- self.stylesheets.borrow().has_changed()
- }
-
- pub fn invalidate_stylesheets(&self) {
- self.stylesheets.borrow_mut().force_dirty(OriginSet::all());
- }
-
- pub fn flush_stylesheets_without_invalidation(&self) {
- self.stylesheets.borrow_mut().flush_without_invalidation();
- }
-
/// 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>) {
+ pub fn remove_stylesheet(
+ &self,
+ owner: &Element,
+ s: &Arc<Stylesheet>,
+ stylesheets: &mut StylesheetSet<StyleSheetInDocument>,
+ ) {
self.window
.layout_chan()
.send(Msg::RemoveStylesheet(s.clone()))
@@ -242,7 +217,7 @@ impl DocumentOrShadowRoot {
let guard = s.shared_lock.read();
// FIXME(emilio): Would be nice to remove the clone, etc.
- self.stylesheets.borrow_mut().remove_stylesheet(
+ stylesheets.remove_stylesheet(
None,
StyleSheetInDocument {
sheet: s.clone(),
@@ -258,7 +233,9 @@ impl DocumentOrShadowRoot {
pub fn add_stylesheet(
&self,
owner: &Element,
+ stylesheets: &mut StylesheetSet<StyleSheetInDocument>,
sheet: Arc<Stylesheet>,
+ insertion_point: Option<StyleSheetInDocument>,
style_shared_lock: &StyleSharedRwLock,
) {
// FIXME(emilio): It'd be nice to unify more code between the elements
@@ -269,17 +246,6 @@ impl DocumentOrShadowRoot {
"Wat"
);
- let mut stylesheets = 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(
diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs
index f8465874a38..763afcf1bdb 100644
--- a/components/script/dom/htmlstyleelement.rs
+++ b/components/script/dom/htmlstyleelement.rs
@@ -82,7 +82,7 @@ impl HTMLStyleElement {
pub fn parse_own_css(&self) {
let node = self.upcast::<Node>();
let element = self.upcast::<Element>();
- assert!(node.is_in_doc());
+ assert!(node.is_connected());
let window = window_from_node(node);
let doc = document_from_node(self);
diff --git a/components/script/dom/shadowroot.rs b/components/script/dom/shadowroot.rs
index 3b1e9d34b87..7790423fb0a 100644
--- a/components/script/dom/shadowroot.rs
+++ b/components/script/dom/shadowroot.rs
@@ -19,7 +19,7 @@ use crate::dom::stylesheetlist::{StyleSheetList, StyleSheetListOwner};
use crate::dom::window::Window;
use dom_struct::dom_struct;
use servo_arc::Arc;
-use style::stylesheet_set::AuthorStylesheetSet;
+use style::author_styles::AuthorStyles;
use style::stylesheets::Stylesheet;
// https://dom.spec.whatwg.org/#interface-shadowroot
@@ -31,7 +31,7 @@ pub struct ShadowRoot {
host: Dom<Element>,
/// List of stylesheets associated with nodes in this shadow tree.
/// |None| if the list needs to be refreshed.
- stylesheets: DomRefCell<AuthorStylesheetSet<StyleSheetInDocument>>,
+ author_styles: DomRefCell<AuthorStyles<StyleSheetInDocument>>,
stylesheet_list: MutNullableDom<StyleSheetList>,
window: Dom<Window>,
}
@@ -48,7 +48,7 @@ impl ShadowRoot {
document_or_shadow_root: DocumentOrShadowRoot::new(document.window()),
document: Dom::from_ref(document),
host: Dom::from_ref(host),
- stylesheets: DomRefCell::new(AuthorStylesheetSet::new()),
+ author_styles: DomRefCell::new(AuthorStyles::new()),
stylesheet_list: MutNullableDom::new(None),
window: Dom::from_ref(document.window()),
}
@@ -131,20 +131,35 @@ impl LayoutShadowRootHelpers for LayoutDom<ShadowRoot> {
impl StyleSheetListOwner for Dom<ShadowRoot> {
fn stylesheet_count(&self) -> usize {
- self.document_or_shadow_root.stylesheet_count()
+ self.author_styles.borrow().stylesheets.len()
}
fn stylesheet_at(&self, index: usize) -> Option<DomRoot<CSSStyleSheet>> {
- self.document_or_shadow_root.stylesheet_at(index)
+ let stylesheets = &self.author_styles.borrow().stylesheets;
+
+ stylesheets
+ .get(index)
+ .and_then(|s| s.owner.upcast::<Node>().get_cssom_stylesheet())
}
/// Add a stylesheet owned by `owner` to the list of shadow root 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.author_styles.borrow_mut().stylesheets;
+ let insertion_point = stylesheets
+ .iter()
+ .find(|sheet_in_shadow| {
+ owner
+ .upcast::<Node>()
+ .is_before(sheet_in_shadow.owner.upcast())
+ })
+ .cloned();
self.document_or_shadow_root.add_stylesheet(
owner,
+ stylesheets,
sheet,
+ insertion_point,
self.document.style_shared_lock(),
);
}
@@ -152,6 +167,10 @@ impl StyleSheetListOwner for Dom<ShadowRoot> {
/// Remove a stylesheet owned by `owner` from the list of shadow root sheets.
#[allow(unrooted_must_root)] // Owner needs to be rooted already necessarily.
fn remove_stylesheet(&self, owner: &Element, s: &Arc<Stylesheet>) {
- self.document_or_shadow_root.remove_stylesheet(owner, s)
+ self.document_or_shadow_root.remove_stylesheet(
+ owner,
+ s,
+ &mut self.author_styles.borrow_mut().stylesheets,
+ )
}
}