diff options
Diffstat (limited to 'components/layout_thread/dom_wrapper.rs')
-rw-r--r-- | components/layout_thread/dom_wrapper.rs | 100 |
1 files changed, 33 insertions, 67 deletions
diff --git a/components/layout_thread/dom_wrapper.rs b/components/layout_thread/dom_wrapper.rs index 08d628a6d6c..f19e5e13b78 100644 --- a/components/layout_thread/dom_wrapper.rs +++ b/components/layout_thread/dom_wrapper.rs @@ -68,7 +68,7 @@ use style::attr::AttrValue; use style::computed_values::display; use style::context::SharedStyleContext; use style::data::ElementData; -use style::dom::{LayoutIterator, NodeInfo, OpaqueNode}; +use style::dom::{DomChildren, LayoutIterator, NodeInfo, OpaqueNode}; use style::dom::{PresentationalHintsSynthesizer, TElement, TNode}; use style::element_state::*; use style::font_metrics::ServoMetricsProvider; @@ -159,7 +159,6 @@ impl<'ln> NodeInfo for ServoLayoutNode<'ln> { impl<'ln> TNode for ServoLayoutNode<'ln> { type ConcreteElement = ServoLayoutElement<'ln>; - type ConcreteChildrenIterator = ServoChildrenIterator<'ln>; fn parent_node(&self) -> Option<Self> { unsafe { @@ -167,18 +166,32 @@ impl<'ln> TNode for ServoLayoutNode<'ln> { } } - fn children(&self) -> LayoutIterator<ServoChildrenIterator<'ln>> { - LayoutIterator(ServoChildrenIterator { - current: self.first_child(), - }) + fn first_child(&self) -> Option<Self> { + unsafe { + self.node.first_child_ref().map(|node| self.new_with_this_lifetime(&node)) + } } - fn traversal_parent(&self) -> Option<ServoLayoutElement<'ln>> { - self.parent_element() + fn last_child(&self) -> Option<Self> { + unsafe { + self.node.last_child_ref().map(|node| self.new_with_this_lifetime(&node)) + } + } + + fn prev_sibling(&self) -> Option<Self> { + unsafe { + self.node.prev_sibling_ref().map(|node| self.new_with_this_lifetime(&node)) + } } - fn traversal_children(&self) -> LayoutIterator<ServoChildrenIterator<'ln>> { - self.children() + fn next_sibling(&self) -> Option<Self> { + unsafe { + self.node.next_sibling_ref().map(|node| self.new_with_this_lifetime(&node)) + } + } + + fn traversal_parent(&self) -> Option<ServoLayoutElement<'ln>> { + self.parent_element() } fn opaque(&self) -> OpaqueNode { @@ -200,23 +213,6 @@ impl<'ln> TNode for ServoLayoutNode<'ln> { unsafe fn set_can_be_fragmented(&self, value: bool) { self.node.set_flag(CAN_BE_FRAGMENTED, value) } - - fn is_in_doc(&self) -> bool { - unsafe { (*self.node.unsafe_get()).is_in_doc() } - } -} - -pub struct ServoChildrenIterator<'a> { - current: Option<ServoLayoutNode<'a>>, -} - -impl<'a> Iterator for ServoChildrenIterator<'a> { - type Item = ServoLayoutNode<'a>; - fn next(&mut self) -> Option<ServoLayoutNode<'a>> { - let node = self.current; - self.current = node.and_then(|node| node.next_sibling()); - node - } } impl<'ln> LayoutNode for ServoLayoutNode<'ln> { @@ -248,30 +244,6 @@ impl<'ln> LayoutNode for ServoLayoutNode<'ln> { unsafe fn take_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData { self.get_jsmanaged().take_style_and_layout_data() } - - 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)) - } - } } impl<'ln> GetLayoutData for ServoLayoutNode<'ln> { @@ -320,8 +292,8 @@ impl<'ld> ServoLayoutDocument<'ld> { ServoLayoutNode::from_layout_js(self.document.upcast()) } - pub fn root_node(&self) -> Option<ServoLayoutNode<'ld>> { - self.as_node().children().find(ServoLayoutNode::is_element) + pub fn root_element(&self) -> Option<ServoLayoutElement<'ld>> { + self.as_node().dom_children().flat_map(|n| n.as_element()).next() } pub fn drain_pending_restyles(&self) -> Vec<(ServoLayoutElement<'ld>, PendingRestyle)> { @@ -380,6 +352,7 @@ impl<'le> PresentationalHintsSynthesizer for ServoLayoutElement<'le> { impl<'le> TElement for ServoLayoutElement<'le> { type ConcreteNode = ServoLayoutNode<'le>; + type TraversalChildrenIterator = DomChildren<Self::ConcreteNode>; type FontMetricsProvider = ServoMetricsProvider; @@ -387,6 +360,10 @@ impl<'le> TElement for ServoLayoutElement<'le> { ServoLayoutNode::from_layout_js(self.element.upcast()) } + fn traversal_children(&self) -> LayoutIterator<Self::TraversalChildrenIterator> { + LayoutIterator(self.as_node().dom_children()) + } + fn style_attribute(&self) -> Option<ArcBorrow<StyleLocked<PropertyDeclarationBlock>>> { unsafe { (*self.element.style_attribute()).as_ref().map(|x| x.borrow_arc()) @@ -629,7 +606,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { } fn first_child_element(&self) -> Option<ServoLayoutElement<'le>> { - self.as_node().children().filter_map(|n| n.as_element()).next() + self.as_node().dom_children().filter_map(|n| n.as_element()).next() } fn last_child_element(&self) -> Option<ServoLayoutElement<'le>> { @@ -690,7 +667,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { } fn is_empty(&self) -> bool { - self.as_node().children().all(|node| match node.script_type_id() { + self.as_node().dom_children().all(|node| match node.script_type_id() { NodeTypeId::Element(..) => false, NodeTypeId::CharacterData(CharacterDataTypeId::Text) => unsafe { node.node.downcast().unwrap().data_for_layout().is_empty() @@ -850,20 +827,14 @@ impl<'ln> ServoThreadSafeLayoutNode<'ln> { } } -// NB: The implementation here is a bit tricky because elements implementing -// pseudos are supposed to return false for is_element(). impl<'ln> NodeInfo for ServoThreadSafeLayoutNode<'ln> { fn is_element(&self) -> bool { - self.pseudo == PseudoElementType::Normal && self.node.is_element() + self.node.is_element() } fn is_text_node(&self) -> bool { self.node.is_text_node() } - - fn needs_layout(&self) -> bool { - self.node.is_text_node() || self.node.is_element() - } } impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { @@ -883,11 +854,6 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { } } - #[inline] - fn type_id_without_excluding_pseudo_elements(&self) -> LayoutNodeType { - self.node.type_id() - } - fn parent_style(&self) -> Arc<ComputedValues> { let parent = self.node.parent_node().unwrap().as_element().unwrap(); let parent_data = parent.get_data().unwrap().borrow(); |