aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/document.rs23
-rw-r--r--components/script/dom/element.rs8
-rw-r--r--components/script/dom/window.rs1
3 files changed, 30 insertions, 2 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 8b66d2db75d..cf63dfcfb9a 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -283,6 +283,12 @@ pub struct Document {
last_click_info: DOMRefCell<Option<(Instant, Point2D<f32>)>>,
/// https://html.spec.whatwg.org/multipage/#ignore-destructive-writes-counter
ignore_destructive_writes_counter: Cell<u32>,
+ /// Track the total number of elements in this DOM's tree.
+ /// This is sent to the layout thread every time a reflow is done;
+ /// layout uses this to determine if the gains from parallel layout will be worth the overhead.
+ ///
+ /// See also: https://github.com/servo/servo/issues/10110
+ dom_count: Cell<u32>,
}
#[derive(JSTraceable, HeapSizeOf)]
@@ -454,6 +460,22 @@ impl Document {
self.base_element.set(base.r());
}
+ pub fn dom_count(&self) -> u32 {
+ self.dom_count.get()
+ }
+
+ /// This is called by `bind_to_tree` when a node is added to the DOM.
+ /// The internal count is used by layout to determine whether to be sequential or parallel.
+ /// (it's sequential for small DOMs)
+ pub fn increment_dom_count(&self) {
+ self.dom_count.set(self.dom_count.get() + 1);
+ }
+
+ /// This is called by `unbind_from_tree` when a node is removed from the DOM.
+ pub fn decrement_dom_count(&self) {
+ self.dom_count.set(self.dom_count.get() - 1);
+ }
+
pub fn quirks_mode(&self) -> QuirksMode {
self.quirks_mode.get()
}
@@ -1880,6 +1902,7 @@ impl Document {
target_element: MutNullableHeap::new(None),
last_click_info: DOMRefCell::new(None),
ignore_destructive_writes_counter: Default::default(),
+ dom_count: Cell::new(1),
}
}
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index c384001e33a..6df2122e7b3 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -2151,10 +2151,12 @@ impl VirtualMethods for Element {
return;
}
+ let doc = document_from_node(self);
if let Some(ref value) = *self.id_attribute.borrow() {
- let doc = document_from_node(self);
doc.register_named_element(self, value.clone());
}
+ // This is used for layout optimization.
+ doc.increment_dom_count();
}
fn unbind_from_tree(&self, context: &UnbindContext) {
@@ -2164,10 +2166,12 @@ impl VirtualMethods for Element {
return;
}
+ let doc = document_from_node(self);
if let Some(ref value) = *self.id_attribute.borrow() {
- let doc = document_from_node(self);
doc.unregister_named_element(self, value.clone());
}
+ // This is used for layout optimization.
+ doc.decrement_dom_count();
}
fn children_changed(&self, mutation: &ChildrenMutation) {
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index e5e85051c7c..3b1bd124398 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -1083,6 +1083,7 @@ impl Window {
window_size: window_size,
script_join_chan: join_chan,
query_type: query_type,
+ dom_count: self.Document().dom_count(),
};
self.layout_chan.send(Msg::Reflow(reflow)).unwrap();