diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/document.rs | 1 | ||||
-rw-r--r-- | components/script/dom/node.rs | 13 | ||||
-rw-r--r-- | components/script/layout_wrapper.rs | 117 |
3 files changed, 50 insertions, 81 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index b4273233c37..5870e4c1320 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -434,7 +434,6 @@ impl Document { // that workable. match self.GetDocumentElement() { Some(root) => { - root.upcast::<Node>().is_dirty() || root.upcast::<Node>().has_dirty_descendants() || !self.pending_restyles.borrow().is_empty() || self.needs_paint() diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 8e8bf6edc9e..983e2e8d403 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -149,9 +149,6 @@ bitflags! { #[doc = "Specifies whether this node is in a document."] const IS_IN_DOC = 0x01, #[doc = "Specifies whether this node needs style recalc on next reflow."] - const IS_DIRTY = 0x04, - #[doc = "Specifies whether this node has descendants (inclusive of itself) which \ - have changed since the last reflow."] const HAS_DIRTY_DESCENDANTS = 0x08, // TODO: find a better place to keep this (#4105) // https://critic.hoppipolla.co.uk/showcomment?chain=8873 @@ -172,7 +169,7 @@ bitflags! { impl NodeFlags { pub fn new() -> NodeFlags { - IS_DIRTY + NodeFlags::empty() } } @@ -428,14 +425,6 @@ impl Node { self.flags.set(flags); } - pub fn is_dirty(&self) -> bool { - self.get_flag(IS_DIRTY) - } - - pub fn set_is_dirty(&self, state: bool) { - self.set_flag(IS_DIRTY, state) - } - pub fn has_dirty_descendants(&self) -> bool { self.get_flag(HAS_DIRTY_DESCENDANTS) } diff --git a/components/script/layout_wrapper.rs b/components/script/layout_wrapper.rs index 18d2bd092c0..a386d5c8563 100644 --- a/components/script/layout_wrapper.rs +++ b/components/script/layout_wrapper.rs @@ -36,7 +36,7 @@ use dom::bindings::js::LayoutJS; use dom::characterdata::LayoutCharacterDataHelpers; use dom::document::{Document, LayoutDocumentHelpers, PendingRestyle}; use dom::element::{Element, LayoutElementHelpers, RawLayoutElementHelpers}; -use dom::node::{CAN_BE_FRAGMENTED, DIRTY_ON_VIEWPORT_SIZE_CHANGE, HAS_DIRTY_DESCENDANTS, IS_DIRTY}; +use dom::node::{CAN_BE_FRAGMENTED, DIRTY_ON_VIEWPORT_SIZE_CHANGE, HAS_DIRTY_DESCENDANTS}; use dom::node::{LayoutNodeHelpers, Node}; use dom::text::Text; use gfx_traits::ByteIndex; @@ -53,11 +53,12 @@ use selectors::parser::{AttrSelector, NamespaceConstraint}; use servo_atoms::Atom; use servo_url::ServoUrl; use std::fmt; +use std::fmt::Debug; use std::marker::PhantomData; use std::mem::transmute; use std::sync::Arc; use std::sync::atomic::Ordering; -use style::atomic_refcell::{AtomicRef, AtomicRefCell}; +use style::atomic_refcell::AtomicRefCell; use style::attr::AttrValue; use style::computed_values::display; use style::context::SharedStyleContext; @@ -80,6 +81,16 @@ pub struct ServoLayoutNode<'a> { chain: PhantomData<&'a ()>, } +impl<'ln> Debug for ServoLayoutNode<'ln> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + if let Some(el) = self.as_element() { + el.fmt(f) + } else { + write!(f, "{:?} ({:#x})", self.type_id(), self.opaque().0) + } + } +} + impl<'a> PartialEq for ServoLayoutNode<'a> { #[inline] fn eq(&self, other: &ServoLayoutNode) -> bool { @@ -201,30 +212,6 @@ impl<'ln> TNode for ServoLayoutNode<'ln> { self.node.parent_node_ref().map(|node| self.new_with_this_lifetime(&node)) } } - - fn first_child(&self) -> Option<ServoLayoutNode<'ln>> { - unsafe { - self.node.first_child_ref().map(|node| self.new_with_this_lifetime(&node)) - } - } - - fn last_child(&self) -> Option<ServoLayoutNode<'ln>> { - unsafe { - self.node.last_child_ref().map(|node| self.new_with_this_lifetime(&node)) - } - } - - fn prev_sibling(&self) -> Option<ServoLayoutNode<'ln>> { - unsafe { - self.node.prev_sibling_ref().map(|node| self.new_with_this_lifetime(&node)) - } - } - - fn next_sibling(&self) -> Option<ServoLayoutNode<'ln>> { - unsafe { - self.node.next_sibling_ref().map(|node| self.new_with_this_lifetime(&node)) - } - } } pub struct ServoChildrenIterator<'a> { @@ -259,9 +246,28 @@ impl<'ln> LayoutNode for ServoLayoutNode<'ln> { self.get_jsmanaged().take_style_and_layout_data() } - unsafe fn clear_dirty_bits(&self) { - self.node.set_flag(IS_DIRTY, false); - self.node.set_flag(HAS_DIRTY_DESCENDANTS, false); + fn first_child(&self) -> Option<ServoLayoutNode<'ln>> { + unsafe { + self.node.first_child_ref().map(|node| self.new_with_this_lifetime(&node)) + } + } + + fn last_child(&self) -> Option<ServoLayoutNode<'ln>> { + unsafe { + self.node.last_child_ref().map(|node| self.new_with_this_lifetime(&node)) + } + } + + fn prev_sibling(&self) -> Option<ServoLayoutNode<'ln>> { + unsafe { + self.node.prev_sibling_ref().map(|node| self.new_with_this_lifetime(&node)) + } + } + + fn next_sibling(&self) -> Option<ServoLayoutNode<'ln>> { + unsafe { + self.node.next_sibling_ref().map(|node| self.new_with_this_lifetime(&node)) + } } } @@ -292,14 +298,6 @@ impl<'le> GetLayoutData for ServoThreadSafeLayoutElement<'le> { } impl<'ln> ServoLayoutNode<'ln> { - pub fn is_dirty(&self) -> bool { - unsafe { self.node.get_flag(IS_DIRTY) } - } - - pub unsafe fn set_dirty(&self) { - self.node.set_flag(IS_DIRTY, true) - } - fn dump_indent(self, indent: u32) { let mut s = String::new(); for _ in 0..indent { @@ -330,9 +328,8 @@ impl<'ln> ServoLayoutNode<'ln> { } fn debug_str(self) -> String { - format!("{:?}: dirty={} dirty_descendants={}", + format!("{:?}: dirty_descendants={}", self.script_type_id(), - self.as_element().map_or(false, |el| el.deprecated_dirty_bit_is_set()), self.as_element().map_or(false, |el| el.has_dirty_descendants())) } @@ -406,7 +403,7 @@ impl<'le> fmt::Debug for ServoLayoutElement<'le> { if let &Some(ref id) = unsafe { &*self.element.id_attribute() } { try!(write!(f, " id={}", id)); } - write!(f, ">") + write!(f, "> ({:#x})", self.as_node().opaque().0) } } @@ -447,10 +444,6 @@ impl<'le> TElement for ServoLayoutElement<'le> { self.get_attr(namespace, attr).map_or(false, |x| x == val) } - fn set_restyle_damage(self, damage: RestyleDamage) { - self.get_partial_layout_data().unwrap().borrow_mut().restyle_damage |= damage; - } - #[inline] fn existing_style_for_restyle_damage<'a>(&'a self, current_cv: Option<&'a Arc<ComputedValues>>, @@ -459,10 +452,6 @@ impl<'le> TElement for ServoLayoutElement<'le> { current_cv } - fn deprecated_dirty_bit_is_set(&self) -> bool { - unsafe { self.as_node().node.get_flag(IS_DIRTY) } - } - fn has_dirty_descendants(&self) -> bool { unsafe { self.as_node().node.get_flag(HAS_DIRTY_DESCENDANTS) } } @@ -471,6 +460,10 @@ impl<'le> TElement for ServoLayoutElement<'le> { self.as_node().node.set_flag(HAS_DIRTY_DESCENDANTS, true) } + unsafe fn unset_dirty_descendants(&self) { + self.as_node().node.set_flag(HAS_DIRTY_DESCENDANTS, false) + } + fn store_children_to_process(&self, n: isize) { let data = self.get_partial_layout_data().unwrap().borrow(); data.parallel.children_to_process.store(n, Ordering::Relaxed); @@ -483,10 +476,6 @@ impl<'le> TElement for ServoLayoutElement<'le> { old_value - 1 } - fn borrow_data(&self) -> Option<AtomicRef<ElementData>> { - self.get_data().map(|d| d.borrow()) - } - fn get_data(&self) -> Option<&AtomicRefCell<ElementData>> { unsafe { self.get_style_and_layout_data().map(|d| { @@ -729,7 +718,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { } } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Debug)] pub struct ServoThreadSafeLayoutNode<'ln> { /// The wrapped node. node: ServoLayoutNode<'ln>, @@ -830,7 +819,7 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { debug_assert!(self.is_text_node()); let parent = self.node.parent_node().unwrap().as_element().unwrap(); let parent_data = parent.get_data().unwrap().borrow(); - parent_data.current_styles().primary.clone() + parent_data.current_styles().primary.values.clone() } fn debug_id(self) -> usize { @@ -874,22 +863,14 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { } fn restyle_damage(self) -> RestyleDamage { - if self.is_text_node() { - let parent = self.node.parent_node().unwrap().as_element().unwrap(); - let parent_data = parent.get_partial_layout_data().unwrap().borrow(); - parent_data.restyle_damage + let element = if self.is_text_node() { + self.node.parent_node().unwrap().as_element().unwrap() } else { - let el = self.as_element().unwrap().element; - let damage = el.get_partial_layout_data().unwrap().borrow().restyle_damage.clone(); - damage - } - } + self.node.as_element().unwrap() + }; - fn clear_restyle_damage(self) { - if let Some(el) = self.as_element() { - let mut data = el.element.get_partial_layout_data().unwrap().borrow_mut(); - data.restyle_damage = RestyleDamage::empty(); - } + let damage = element.borrow_data().unwrap().damage(); + damage } fn can_be_fragmented(&self) -> bool { |