aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/dom_traversal.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout/dom_traversal.rs')
-rw-r--r--components/layout/dom_traversal.rs114
1 files changed, 46 insertions, 68 deletions
diff --git a/components/layout/dom_traversal.rs b/components/layout/dom_traversal.rs
index 42101e3edbc..a75d699a1b3 100644
--- a/components/layout/dom_traversal.rs
+++ b/components/layout/dom_traversal.rs
@@ -8,11 +8,14 @@ use std::iter::FusedIterator;
use fonts::ByteIndex;
use html5ever::{LocalName, local_name};
use range::Range;
-use script_layout_interface::wrapper_traits::{ThreadSafeLayoutElement, ThreadSafeLayoutNode};
+use script::layout_dom::ServoLayoutNode;
+use script_layout_interface::wrapper_traits::{
+ LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
+};
use script_layout_interface::{LayoutElementType, LayoutNodeType};
use selectors::Element as SelectorsElement;
use servo_arc::Arc as ServoArc;
-use style::dom::{TElement, TShadowRoot};
+use style::dom::{NodeInfo, TElement, TNode, TShadowRoot};
use style::properties::ComputedValues;
use style::selector_parser::PseudoElement;
use style::values::generics::counters::{Content, ContentItem};
@@ -28,15 +31,15 @@ use crate::style_ext::{Display, DisplayGeneratingBox, DisplayInside, DisplayOuts
/// A data structure used to pass and store related layout information together to
/// avoid having to repeat the same arguments in argument lists.
#[derive(Clone)]
-pub(crate) struct NodeAndStyleInfo<Node> {
- pub node: Node,
+pub(crate) struct NodeAndStyleInfo<'dom> {
+ pub node: ServoLayoutNode<'dom>,
pub pseudo_element_type: Option<PseudoElement>,
pub style: ServoArc<ComputedValues>,
}
-impl<'dom, Node: NodeExt<'dom>> NodeAndStyleInfo<Node> {
+impl<'dom> NodeAndStyleInfo<'dom> {
fn new_with_pseudo(
- node: Node,
+ node: ServoLayoutNode<'dom>,
pseudo_element_type: PseudoElement,
style: ServoArc<ComputedValues>,
) -> Self {
@@ -47,7 +50,7 @@ impl<'dom, Node: NodeExt<'dom>> NodeAndStyleInfo<Node> {
}
}
- pub(crate) fn new(node: Node, style: ServoArc<ComputedValues>) -> Self {
+ pub(crate) fn new(node: ServoLayoutNode<'dom>, style: ServoArc<ComputedValues>) -> Self {
Self {
node,
pseudo_element_type: None,
@@ -86,11 +89,8 @@ impl<'dom, Node: NodeExt<'dom>> NodeAndStyleInfo<Node> {
}
}
-impl<'dom, Node> From<&NodeAndStyleInfo<Node>> for BaseFragmentInfo
-where
- Node: NodeExt<'dom>,
-{
- fn from(info: &NodeAndStyleInfo<Node>) -> Self {
+impl<'dom> From<&NodeAndStyleInfo<'dom>> for BaseFragmentInfo {
+ fn from(info: &NodeAndStyleInfo<'dom>) -> Self {
let node = info.node;
let pseudo = info.pseudo_element_type;
let threadsafe_node = node.to_threadsafe();
@@ -174,29 +174,24 @@ pub(super) enum PseudoElementContentItem {
Replaced(ReplacedContents),
}
-pub(super) trait TraversalHandler<'dom, Node>
-where
- Node: 'dom,
-{
- fn handle_text(&mut self, info: &NodeAndStyleInfo<Node>, text: Cow<'dom, str>);
+pub(super) trait TraversalHandler<'dom> {
+ fn handle_text(&mut self, info: &NodeAndStyleInfo<'dom>, text: Cow<'dom, str>);
/// Or pseudo-element
fn handle_element(
&mut self,
- info: &NodeAndStyleInfo<Node>,
+ info: &NodeAndStyleInfo<'dom>,
display: DisplayGeneratingBox,
contents: Contents,
box_slot: BoxSlot<'dom>,
);
}
-fn traverse_children_of<'dom, Node>(
- parent_element: Node,
+fn traverse_children_of<'dom>(
+ parent_element: ServoLayoutNode<'dom>,
context: &LayoutContext,
- handler: &mut impl TraversalHandler<'dom, Node>,
-) where
- Node: NodeExt<'dom>,
-{
+ handler: &mut impl TraversalHandler<'dom>,
+) {
traverse_eager_pseudo_element(PseudoElement::Before, parent_element, context, handler);
let is_text_input_element = matches!(
@@ -240,13 +235,11 @@ fn traverse_children_of<'dom, Node>(
traverse_eager_pseudo_element(PseudoElement::After, parent_element, context, handler);
}
-fn traverse_element<'dom, Node>(
- element: Node,
+fn traverse_element<'dom>(
+ element: ServoLayoutNode<'dom>,
context: &LayoutContext,
- handler: &mut impl TraversalHandler<'dom, Node>,
-) where
- Node: NodeExt<'dom>,
-{
+ handler: &mut impl TraversalHandler<'dom>,
+) {
// Clear any existing pseudo-element box slot, because markers are not handled like
// `::before`` and `::after`. They are processed during box tree creation.
element.unset_pseudo_element_box(PseudoElement::Marker);
@@ -286,14 +279,12 @@ fn traverse_element<'dom, Node>(
}
}
-fn traverse_eager_pseudo_element<'dom, Node>(
+fn traverse_eager_pseudo_element<'dom>(
pseudo_element_type: PseudoElement,
- node: Node,
+ node: ServoLayoutNode<'dom>,
context: &LayoutContext,
- handler: &mut impl TraversalHandler<'dom, Node>,
-) where
- Node: NodeExt<'dom>,
-{
+ handler: &mut impl TraversalHandler<'dom>,
+) {
assert!(pseudo_element_type.is_eager());
// First clear any old contents from the node.
@@ -329,14 +320,12 @@ fn traverse_eager_pseudo_element<'dom, Node>(
}
}
-fn traverse_pseudo_element_contents<'dom, Node>(
- info: &NodeAndStyleInfo<Node>,
+fn traverse_pseudo_element_contents<'dom>(
+ info: &NodeAndStyleInfo<'dom>,
context: &LayoutContext,
- handler: &mut impl TraversalHandler<'dom, Node>,
+ handler: &mut impl TraversalHandler<'dom>,
items: Vec<PseudoElementContentItem>,
-) where
- Node: NodeExt<'dom>,
-{
+) {
let mut anonymous_info = None;
for item in items {
match item {
@@ -396,14 +385,12 @@ impl std::convert::TryFrom<Contents> for NonReplacedContents {
}
impl NonReplacedContents {
- pub(crate) fn traverse<'dom, Node>(
+ pub(crate) fn traverse<'dom>(
self,
context: &LayoutContext,
- info: &NodeAndStyleInfo<Node>,
- handler: &mut impl TraversalHandler<'dom, Node>,
- ) where
- Node: NodeExt<'dom>,
- {
+ info: &NodeAndStyleInfo<'dom>,
+ handler: &mut impl TraversalHandler<'dom>,
+ ) {
match self {
NonReplacedContents::OfElement | NonReplacedContents::OfTextControl => {
traverse_children_of(info.node, context, handler)
@@ -427,14 +414,11 @@ where
}
/// <https://www.w3.org/TR/CSS2/generate.html#propdef-content>
-fn generate_pseudo_element_content<'dom, Node>(
+fn generate_pseudo_element_content(
pseudo_element_style: &ComputedValues,
- element: Node,
+ element: ServoLayoutNode<'_>,
context: &LayoutContext,
-) -> Vec<PseudoElementContentItem>
-where
- Node: NodeExt<'dom>,
-{
+) -> Vec<PseudoElementContentItem> {
match &pseudo_element_style.get_counters().content {
Content::Items(items) => {
let mut vec = vec![];
@@ -517,18 +501,14 @@ where
}
}
-pub enum ChildNodeIterator<Node> {
+pub enum ChildNodeIterator<'dom> {
/// Iterating over the children of a node
- Node(Option<Node>),
+ Node(Option<ServoLayoutNode<'dom>>),
/// Iterating over the assigned nodes of a `HTMLSlotElement`
- Slottables(<Vec<Node> as IntoIterator>::IntoIter),
+ Slottables(<Vec<ServoLayoutNode<'dom>> as IntoIterator>::IntoIter),
}
-#[allow(clippy::unnecessary_to_owned)] // Clippy is wrong.
-pub(crate) fn iter_child_nodes<'dom, Node>(parent: Node) -> ChildNodeIterator<Node>
-where
- Node: NodeExt<'dom>,
-{
+pub(crate) fn iter_child_nodes(parent: ServoLayoutNode<'_>) -> ChildNodeIterator<'_> {
if let Some(element) = parent.as_element() {
if let Some(shadow) = element.shadow_root() {
return iter_child_nodes(shadow.as_node());
@@ -536,6 +516,7 @@ where
let slotted_nodes = element.slotted_nodes();
if !slotted_nodes.is_empty() {
+ #[allow(clippy::unnecessary_to_owned)] // Clippy is wrong.
return ChildNodeIterator::Slottables(slotted_nodes.to_owned().into_iter());
}
}
@@ -544,11 +525,8 @@ where
ChildNodeIterator::Node(first)
}
-impl<'dom, Node> Iterator for ChildNodeIterator<Node>
-where
- Node: NodeExt<'dom>,
-{
- type Item = Node;
+impl<'dom> Iterator for ChildNodeIterator<'dom> {
+ type Item = ServoLayoutNode<'dom>;
fn next(&mut self) -> Option<Self::Item> {
match self {
@@ -562,4 +540,4 @@ where
}
}
-impl<'dom, Node> FusedIterator for ChildNodeIterator<Node> where Node: NodeExt<'dom> {}
+impl FusedIterator for ChildNodeIterator<'_> {}