aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/layout_dom/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/layout_dom/node.rs')
-rw-r--r--components/script/layout_dom/node.rs58
1 files changed, 30 insertions, 28 deletions
diff --git a/components/script/layout_dom/node.rs b/components/script/layout_dom/node.rs
index 4a7b3a04b06..83c1b8dd57a 100644
--- a/components/script/layout_dom/node.rs
+++ b/components/script/layout_dom/node.rs
@@ -13,9 +13,7 @@ use fonts_traits::ByteIndex;
use html5ever::{local_name, namespace_url, ns};
use pixels::{Image, ImageMetadata};
use range::Range;
-use script_layout_interface::wrapper_traits::{
- LayoutDataTrait, LayoutNode, PseudoElementType, ThreadSafeLayoutNode,
-};
+use script_layout_interface::wrapper_traits::{LayoutDataTrait, LayoutNode, ThreadSafeLayoutNode};
use script_layout_interface::{
GenericLayoutData, HTMLCanvasData, HTMLMediaData, LayoutNodeType, SVGSVGData, StyleData,
TrustedNodeAddress,
@@ -25,6 +23,7 @@ use servo_url::ServoUrl;
use style;
use style::dom::{NodeInfo, TElement, TNode, TShadowRoot};
use style::properties::ComputedValues;
+use style::selector_parser::PseudoElement;
use super::{
ServoLayoutDocument, ServoLayoutElement, ServoShadowRoot, ServoThreadSafeLayoutElement,
@@ -230,18 +229,15 @@ pub struct ServoThreadSafeLayoutNode<'dom> {
/// The wrapped `ServoLayoutNode`.
pub(super) node: ServoLayoutNode<'dom>,
- /// The pseudo-element type, with (optionally)
- /// a specified display value to override the stylesheet.
- pub(super) pseudo: PseudoElementType,
+ /// The pseudo-element type for this node, or `None` if it is the non-pseudo
+ /// version of the element.
+ pub(super) pseudo: Option<PseudoElement>,
}
impl<'dom> ServoThreadSafeLayoutNode<'dom> {
/// Creates a new `ServoThreadSafeLayoutNode` from the given `ServoLayoutNode`.
pub fn new(node: ServoLayoutNode<'dom>) -> Self {
- ServoThreadSafeLayoutNode {
- node,
- pseudo: PseudoElementType::Normal,
- }
+ ServoThreadSafeLayoutNode { node, pseudo: None }
}
/// Returns the interior of this node as a `LayoutDom`. This is highly unsafe for layout to
@@ -289,8 +285,12 @@ impl<'dom> ThreadSafeLayoutNode<'dom> for ServoThreadSafeLayoutNode<'dom> {
unsafe { self.get_jsmanaged().opaque() }
}
+ fn pseudo_element(&self) -> Option<PseudoElement> {
+ self.pseudo
+ }
+
fn type_id(&self) -> Option<LayoutNodeType> {
- if self.pseudo == PseudoElementType::Normal {
+ if self.pseudo.is_none() {
Some(self.node.type_id())
} else {
None
@@ -434,12 +434,12 @@ pub struct ServoThreadSafeLayoutNodeChildrenIterator<'dom> {
impl<'dom> ServoThreadSafeLayoutNodeChildrenIterator<'dom> {
pub fn new(parent: ServoThreadSafeLayoutNode<'dom>) -> Self {
- let first_child = match parent.get_pseudo_element_type() {
- PseudoElementType::Normal => parent
- .get_before_pseudo()
+ let first_child = match parent.pseudo_element() {
+ None => parent
+ .get_pseudo(PseudoElement::Before)
.or_else(|| parent.get_details_summary_pseudo())
.or_else(|| unsafe { parent.dangerous_first_child() }),
- PseudoElementType::DetailsContent | PseudoElementType::DetailsSummary => unsafe {
+ Some(PseudoElement::DetailsContent) | Some(PseudoElement::DetailsSummary) => unsafe {
parent.dangerous_first_child()
},
_ => None,
@@ -455,10 +455,10 @@ impl<'dom> Iterator for ServoThreadSafeLayoutNodeChildrenIterator<'dom> {
type Item = ServoThreadSafeLayoutNode<'dom>;
fn next(&mut self) -> Option<ServoThreadSafeLayoutNode<'dom>> {
use selectors::Element;
- match self.parent_node.get_pseudo_element_type() {
- PseudoElementType::Before | PseudoElementType::After => None,
+ match self.parent_node.pseudo_element() {
+ Some(PseudoElement::Before) | Some(PseudoElement::After) => None,
- PseudoElementType::DetailsSummary => {
+ Some(PseudoElement::DetailsSummary) => {
let mut current_node = self.current_node;
loop {
let next_node = if let Some(ref node) = current_node {
@@ -479,7 +479,7 @@ impl<'dom> Iterator for ServoThreadSafeLayoutNodeChildrenIterator<'dom> {
}
},
- PseudoElementType::DetailsContent => {
+ Some(PseudoElement::DetailsContent) => {
let node = self.current_node;
let node = node.and_then(|node| {
if node.is_element() &&
@@ -497,22 +497,24 @@ impl<'dom> Iterator for ServoThreadSafeLayoutNodeChildrenIterator<'dom> {
node
},
- PseudoElementType::Normal => {
+ None | Some(_) => {
let node = self.current_node;
if let Some(ref node) = node {
- self.current_node = match node.get_pseudo_element_type() {
- PseudoElementType::Before => self
+ self.current_node = match node.pseudo_element() {
+ Some(PseudoElement::Before) => self
.parent_node
.get_details_summary_pseudo()
.or_else(|| unsafe { self.parent_node.dangerous_first_child() })
- .or_else(|| self.parent_node.get_after_pseudo()),
- PseudoElementType::Normal => unsafe { node.dangerous_next_sibling() }
- .or_else(|| self.parent_node.get_after_pseudo()),
- PseudoElementType::DetailsSummary => {
+ .or_else(|| self.parent_node.get_pseudo(PseudoElement::After)),
+ Some(PseudoElement::DetailsSummary) => {
self.parent_node.get_details_content_pseudo()
},
- PseudoElementType::DetailsContent => self.parent_node.get_after_pseudo(),
- PseudoElementType::After => None,
+ Some(PseudoElement::DetailsContent) => {
+ self.parent_node.get_pseudo(PseudoElement::After)
+ },
+ Some(PseudoElement::After) => None,
+ None | Some(_) => unsafe { node.dangerous_next_sibling() }
+ .or_else(|| self.parent_node.get_pseudo(PseudoElement::After)),
};
}
node