diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/document.rs | 23 | ||||
-rw-r--r-- | components/script/dom/element.rs | 8 | ||||
-rw-r--r-- | components/script/dom/window.rs | 1 |
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(); |