diff --git a/components/layout/construct_modern.rs b/components/layout/construct_modern.rs index bc0c78beefa..5ccaf88e20d 100644 --- a/components/layout/construct_modern.rs +++ b/components/layout/construct_modern.rs @@ -228,7 +228,7 @@ impl<'a, 'dom> ModernContainerBuilder<'a, 'dom> { let anonymous_info = LazyLock::new(|| { self.info - .pseudo(self.context, PseudoElement::ServoAnonymousBox) + .with_pseudo_element(self.context, PseudoElement::ServoAnonymousBox) .expect("Should always be able to construct info for anonymous boxes.") }); diff --git a/components/layout/dom_traversal.rs b/components/layout/dom_traversal.rs index 8b8f5a16bf8..cacc1770b2e 100644 --- a/components/layout/dom_traversal.rs +++ b/components/layout/dom_traversal.rs @@ -31,7 +31,6 @@ use crate::style_ext::{Display, DisplayGeneratingBox, DisplayInside, DisplayOuts #[derive(Clone)] pub(crate) struct NodeAndStyleInfo<'dom> { pub node: ServoThreadSafeLayoutNode<'dom>, - pub pseudo_element_type: Option, pub style: ServoArc, pub damage: LayoutDamage, } @@ -44,37 +43,24 @@ impl<'dom> NodeAndStyleInfo<'dom> { ) -> Self { Self { node, - pseudo_element_type: None, style, damage, } } - /// Whether this is a container for the text within a single-line text input. This - /// is used to solve the special case of line height for a text entry widget. - /// - // TODO(stevennovaryo): Remove the addition of HTMLInputElement here once all of the - // input element is implemented with UA shadow DOM. This is temporary - // workaround for past version of input element where we are - // rendering it as a bare html element. - pub(crate) fn is_single_line_text_input(&self) -> bool { - self.node.type_id() == Some(LayoutNodeType::Element(LayoutElementType::HTMLInputElement)) || - self.node.is_text_container_of_single_line_input() + pub(crate) fn pseudo_element(&self) -> Option { + self.node.pseudo_element() } - pub(crate) fn pseudo( + pub(crate) fn with_pseudo_element( &self, context: &LayoutContext, pseudo_element_type: PseudoElement, ) -> Option { - let style = self - .node - .as_element()? - .with_pseudo(pseudo_element_type)? - .style(&context.style_context); + let element = self.node.as_element()?.with_pseudo(pseudo_element_type)?; + let style = element.style(&context.style_context); Some(NodeAndStyleInfo { - node: self.node, - pseudo_element_type: Some(pseudo_element_type), + node: element.as_node(), style, damage: self.damage, }) @@ -88,7 +74,7 @@ impl<'dom> NodeAndStyleInfo<'dom> { impl<'dom> From<&NodeAndStyleInfo<'dom>> for BaseFragmentInfo { fn from(info: &NodeAndStyleInfo<'dom>) -> Self { let threadsafe_node = info.node; - let pseudo = info.pseudo_element_type; + let pseudo = info.node.pseudo_element(); let mut flags = FragmentFlags::empty(); // Anonymous boxes should not have a tag, because they should not take part in hit testing. @@ -284,7 +270,8 @@ fn traverse_eager_pseudo_element<'dom>( // If this node doesn't have this eager pseudo-element, exit early. This depends on // the style applied to the element. - let Some(pseudo_element_info) = node_info.pseudo(context, pseudo_element_type) else { + let Some(pseudo_element_info) = node_info.with_pseudo_element(context, pseudo_element_type) + else { return; }; if pseudo_element_info.style.ineffective_content_property() { @@ -328,7 +315,7 @@ fn traverse_pseudo_element_contents<'dom>( PseudoElementContentItem::Text(text) => handler.handle_text(info, text.into()), PseudoElementContentItem::Replaced(contents) => { let anonymous_info = anonymous_info.get_or_insert_with(|| { - info.pseudo(context, PseudoElement::ServoAnonymousBox) + info.with_pseudo_element(context, PseudoElement::ServoAnonymousBox) .unwrap_or_else(|| info.clone()) }); let display_inline = DisplayGeneratingBox::OutsideInside { diff --git a/components/layout/flow/construct.rs b/components/layout/flow/construct.rs index 7537c98065d..19ee0ed76cf 100644 --- a/components/layout/flow/construct.rs +++ b/components/layout/flow/construct.rs @@ -228,7 +228,7 @@ impl<'dom, 'style> BlockContainerBuilder<'dom, 'style> { self.inline_formatting_context_builder.take()?.finish( self.context, !self.have_already_seen_first_line_for_text_indent, - self.info.is_single_line_text_input(), + self.info.node.is_single_line_text_input(), self.info.style.to_bidi_level(), ) } @@ -414,7 +414,7 @@ impl<'dom> BlockContainerBuilder<'dom, '_> { // TODO: We do not currently support saving box slots for ::marker pseudo-elements // that are part nested in ::before and ::after pseudo elements. For now, just // forget about them once they are built. - let box_slot = match container_info.pseudo_element_type { + let box_slot = match container_info.pseudo_element() { Some(_) => BoxSlot::dummy(), None => marker_info .node @@ -441,7 +441,7 @@ impl<'dom> BlockContainerBuilder<'dom, '_> { // TODO: We do not currently support saving box slots for ::marker pseudo-elements // that are part nested in ::before and ::after pseudo elements. For now, just // forget about them once they are built. - let box_slot = match container_info.pseudo_element_type { + let box_slot = match container_info.pseudo_element() { Some(_) => BoxSlot::dummy(), None => marker_info .node @@ -686,7 +686,7 @@ impl<'dom> BlockContainerBuilder<'dom, '_> { .anonymous_box_info .get_or_insert_with(|| { self.info - .pseudo(layout_context, PseudoElement::ServoAnonymousBox) + .with_pseudo_element(layout_context, PseudoElement::ServoAnonymousBox) .expect("Should never fail to create anonymous box") }) .clone(); diff --git a/components/layout/lists.rs b/components/layout/lists.rs index 730735b86e1..3f388de0ab7 100644 --- a/components/layout/lists.rs +++ b/components/layout/lists.rs @@ -15,7 +15,8 @@ pub(crate) fn make_marker<'dom>( context: &LayoutContext, info: &NodeAndStyleInfo<'dom>, ) -> Option<(NodeAndStyleInfo<'dom>, Vec)> { - let marker_info = info.pseudo(context, style::selector_parser::PseudoElement::Marker)?; + let marker_info = + info.with_pseudo_element(context, style::selector_parser::PseudoElement::Marker)?; let style = &marker_info.style; let list_style = style.get_list(); diff --git a/components/layout/table/construct.rs b/components/layout/table/construct.rs index 343e1048122..1bf6d475178 100644 --- a/components/layout/table/construct.rs +++ b/components/layout/table/construct.rs @@ -91,7 +91,7 @@ impl Table { propagated_data: PropagatedBoxTreeData, ) -> (NodeAndStyleInfo<'dom>, IndependentFormattingContext) { let table_info = parent_info - .pseudo(context, PseudoElement::ServoAnonymousTable) + .with_pseudo_element(context, PseudoElement::ServoAnonymousTable) .expect("Should never fail to create anonymous table info."); let table_style = table_info.style.clone(); let mut table_builder = @@ -688,7 +688,7 @@ impl<'style, 'dom> TableBuilderTraversal<'style, 'dom> { let row_content = std::mem::take(&mut self.current_anonymous_row_content); let anonymous_info = self .info - .pseudo(self.context, PseudoElement::ServoAnonymousTableRow) + .with_pseudo_element(self.context, PseudoElement::ServoAnonymousTableRow) .expect("Should never fail to create anonymous row info."); let mut row_builder = TableRowBuilder::new(self, &anonymous_info, self.current_propagated_data); @@ -957,7 +957,7 @@ impl<'style, 'builder, 'dom, 'a> TableRowBuilder<'style, 'builder, 'dom, 'a> { let context = self.table_traversal.context; let anonymous_info = self .info - .pseudo(context, PseudoElement::ServoAnonymousTableCell) + .with_pseudo_element(context, PseudoElement::ServoAnonymousTableCell) .expect("Should never fail to create anonymous table cell info"); let propagated_data = self.propagated_data.disallowing_percentage_table_columns(); let mut builder = BlockContainerBuilder::new(context, &anonymous_info, propagated_data); @@ -1027,7 +1027,7 @@ impl<'dom> TraversalHandler<'dom> for TableRowBuilder<'_, '_, 'dom, '_> { let cell = old_cell.unwrap_or_else(|| { // This value will already have filtered out rowspan=0 // in quirks mode, so we don't have to worry about that. - let (rowspan, colspan) = if info.pseudo_element_type.is_none() { + let (rowspan, colspan) = if info.pseudo_element().is_none() { let rowspan = info.node.get_rowspan().unwrap_or(1) as usize; let colspan = info.node.get_colspan().unwrap_or(1) as usize; @@ -1148,7 +1148,7 @@ fn add_column( is_anonymous: bool, old_column: Option>, ) -> ArcRefCell { - let span = if column_info.pseudo_element_type.is_none() { + let span = if column_info.pseudo_element().is_none() { column_info.node.get_span().unwrap_or(1) } else { 1 diff --git a/components/script/layout_dom/node.rs b/components/script/layout_dom/node.rs index 8d0cce2d0d2..fb38e3e9234 100644 --- a/components/script/layout_dom/node.rs +++ b/components/script/layout_dom/node.rs @@ -14,8 +14,8 @@ use layout_api::wrapper_traits::{ LayoutDataTrait, LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode, }; use layout_api::{ - GenericLayoutData, HTMLCanvasData, HTMLMediaData, LayoutNodeType, SVGElementData, StyleData, - TrustedNodeAddress, + GenericLayoutData, HTMLCanvasData, HTMLMediaData, LayoutElementType, LayoutNodeType, + SVGElementData, StyleData, TrustedNodeAddress, }; use net_traits::image_cache::Image; use pixels::ImageMetadata; @@ -258,8 +258,16 @@ impl<'dom> ServoThreadSafeLayoutNode<'dom> { .map(Self::new) } - pub fn is_text_container_of_single_line_input(&self) -> bool { - self.pseudo.is_none() && self.node.node.is_text_container_of_single_line_input() + /// Whether this is a container for the text within a single-line text input. This + /// is used to solve the special case of line height for a text entry widget. + /// + // TODO(stevennovaryo): Remove the addition of HTMLInputElement here once all of the + // input element is implemented with UA shadow DOM. This is temporary + // workaround for past version of input element where we are + // rendering it as a bare html element. + pub fn is_single_line_text_input(&self) -> bool { + self.type_id() == Some(LayoutNodeType::Element(LayoutElementType::HTMLInputElement)) || + (self.pseudo.is_none() && self.node.node.is_text_container_of_single_line_input()) } pub fn is_text_input(&self) -> bool {