mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
layout: Simplify Contents
a little (#32487)
Instead of duplicating some of `NonReplacedContents` in `Contents`, divide it into either replaced and non-replaced content, since this is how the layout system processes `Contents` always. In addition, stop using `TryInto` to match replaced or non-replaced contents, as it is quite confusing to handle an `Err` as a success case.
This commit is contained in:
parent
44064b1439
commit
66edef8065
4 changed files with 34 additions and 41 deletions
|
@ -122,20 +122,19 @@ where
|
|||
|
||||
#[derive(Debug)]
|
||||
pub(super) enum Contents {
|
||||
/// Refers to a DOM subtree, plus `::before` and `::after` pseudo-elements.
|
||||
OfElement,
|
||||
|
||||
/// Any kind of content that is not replaced, including the contents of pseudo-elements.
|
||||
NonReplaced(NonReplacedContents),
|
||||
/// Example: an `<img src=…>` element.
|
||||
/// <https://drafts.csswg.org/css2/conform.html#replaced-element>
|
||||
Replaced(ReplacedContent),
|
||||
|
||||
/// Content of a `::before` or `::after` pseudo-element that is being generated.
|
||||
/// <https://drafts.csswg.org/css2/generate.html#content>
|
||||
OfPseudoElement(Vec<PseudoElementContentItem>),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) enum NonReplacedContents {
|
||||
/// Refers to a DOM subtree, plus `::before` and `::after` pseudo-elements.
|
||||
OfElement,
|
||||
/// Content of a `::before` or `::after` pseudo-element that is being generated.
|
||||
/// <https://drafts.csswg.org/css2/generate.html#content>
|
||||
OfPseudoElement(Vec<PseudoElementContentItem>),
|
||||
}
|
||||
|
||||
|
@ -221,7 +220,8 @@ fn traverse_element<'dom, Node>(
|
|||
}
|
||||
},
|
||||
Display::GeneratingBox(display) => {
|
||||
let contents = replaced.map_or(Contents::OfElement, Contents::Replaced);
|
||||
let contents =
|
||||
replaced.map_or(NonReplacedContents::OfElement.into(), Contents::Replaced);
|
||||
let display = display.used_value_for_contents(&contents);
|
||||
let box_slot = element.element_box_slot();
|
||||
let info = NodeAndStyleInfo::new(element, style);
|
||||
|
@ -251,7 +251,7 @@ fn traverse_pseudo_element<'dom, Node>(
|
|||
Display::GeneratingBox(display) => {
|
||||
let items = generate_pseudo_element_content(&info.style, element, context);
|
||||
let box_slot = element.pseudo_element_box_slot(which);
|
||||
let contents = Contents::OfPseudoElement(items);
|
||||
let contents = NonReplacedContents::OfPseudoElement(items).into();
|
||||
handler.handle_element(&info, display, contents, box_slot);
|
||||
},
|
||||
}
|
||||
|
@ -310,30 +310,25 @@ fn traverse_pseudo_element_contents<'dom, Node>(
|
|||
impl Contents {
|
||||
/// Returns true iff the `try_from` impl below would return `Err(_)`
|
||||
pub fn is_replaced(&self) -> bool {
|
||||
match self {
|
||||
Contents::OfElement | Contents::OfPseudoElement(_) => false,
|
||||
Contents::Replaced(_) => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl std::convert::TryFrom<Contents> for NonReplacedContents {
|
||||
type Error = ReplacedContent;
|
||||
|
||||
fn try_from(contents: Contents) -> Result<Self, Self::Error> {
|
||||
match contents {
|
||||
Contents::OfElement => Ok(NonReplacedContents::OfElement),
|
||||
Contents::OfPseudoElement(items) => Ok(NonReplacedContents::OfPseudoElement(items)),
|
||||
Contents::Replaced(replaced) => Err(replaced),
|
||||
}
|
||||
matches!(self, Contents::Replaced(_))
|
||||
}
|
||||
}
|
||||
|
||||
impl From<NonReplacedContents> for Contents {
|
||||
fn from(contents: NonReplacedContents) -> Self {
|
||||
fn from(non_replaced_contents: NonReplacedContents) -> Self {
|
||||
Contents::NonReplaced(non_replaced_contents)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::convert::TryFrom<Contents> for NonReplacedContents {
|
||||
type Error = &'static str;
|
||||
|
||||
fn try_from(contents: Contents) -> Result<Self, Self::Error> {
|
||||
match contents {
|
||||
NonReplacedContents::OfElement => Contents::OfElement,
|
||||
NonReplacedContents::OfPseudoElement(items) => Contents::OfPseudoElement(items),
|
||||
Contents::NonReplaced(non_replaced_contents) => Ok(non_replaced_contents),
|
||||
Contents::Replaced(_) => {
|
||||
Err("Tried to covnert a `Contents::Replaced` into `NonReplacedContent`")
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::convert::{TryFrom, TryInto};
|
||||
use std::convert::TryFrom;
|
||||
|
||||
use rayon::iter::{IntoParallelIterator, ParallelIterator};
|
||||
use servo_arc::Arc;
|
||||
|
@ -401,7 +401,7 @@ where
|
|||
DisplayInside::Flow {
|
||||
is_list_item: false,
|
||||
},
|
||||
Contents::OfPseudoElement(contents),
|
||||
NonReplacedContents::OfPseudoElement(contents).into(),
|
||||
BoxSlot::dummy(),
|
||||
);
|
||||
}
|
||||
|
@ -494,8 +494,8 @@ where
|
|||
}
|
||||
|
||||
let propagated_text_decoration_line = self.text_decoration_line;
|
||||
let kind = match contents.try_into() {
|
||||
Ok(contents) => match display_inside {
|
||||
let kind = match contents {
|
||||
Contents::NonReplaced(contents) => match display_inside {
|
||||
DisplayInside::Flow { is_list_item }
|
||||
if !info.style.establishes_block_formatting_context() =>
|
||||
{
|
||||
|
@ -513,7 +513,7 @@ where
|
|||
propagated_text_decoration_line,
|
||||
},
|
||||
},
|
||||
Err(contents) => {
|
||||
Contents::Replaced(contents) => {
|
||||
let contents = Contents::Replaced(contents);
|
||||
BlockLevelCreator::Independent {
|
||||
display_inside,
|
||||
|
|
|
@ -18,7 +18,7 @@ use webrender_traits::display_list::ScrollSensitivity;
|
|||
use crate::cell::ArcRefCell;
|
||||
use crate::context::LayoutContext;
|
||||
use crate::dom::{LayoutBox, NodeExt};
|
||||
use crate::dom_traversal::{iter_child_nodes, Contents, NodeAndStyleInfo};
|
||||
use crate::dom_traversal::{iter_child_nodes, Contents, NodeAndStyleInfo, NonReplacedContents};
|
||||
use crate::flexbox::FlexLevelBox;
|
||||
use crate::flow::float::FloatBox;
|
||||
use crate::flow::inline::InlineItem;
|
||||
|
@ -206,7 +206,7 @@ impl BoxTree {
|
|||
loop {
|
||||
if let Some((primary_style, display_inside, update_point)) = update_point(dirty_node) {
|
||||
let contents = ReplacedContent::for_element(dirty_node, context)
|
||||
.map_or(Contents::OfElement, Contents::Replaced);
|
||||
.map_or_else(|| NonReplacedContents::OfElement.into(), Contents::Replaced);
|
||||
let info = NodeAndStyleInfo::new(dirty_node, Arc::clone(&primary_style));
|
||||
let out_of_flow_absolutely_positioned_box = ArcRefCell::new(
|
||||
AbsolutelyPositionedBox::construct(context, &info, display_inside, contents),
|
||||
|
@ -264,7 +264,7 @@ fn construct_for_root_element<'dom>(
|
|||
};
|
||||
|
||||
let contents = ReplacedContent::for_element(root_element, context)
|
||||
.map_or(Contents::OfElement, Contents::Replaced);
|
||||
.map_or_else(|| NonReplacedContents::OfElement.into(), Contents::Replaced);
|
||||
let root_box = if box_style.position.is_absolutely_positioned() {
|
||||
BlockLevelBox::OutOfFlowAbsolutelyPositionedBox(ArcRefCell::new(
|
||||
AbsolutelyPositionedBox::construct(context, &info, display_inside, contents),
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::convert::TryInto;
|
||||
|
||||
use app_units::Au;
|
||||
use serde::Serialize;
|
||||
use servo_arc::Arc;
|
||||
|
@ -92,8 +90,8 @@ impl IndependentFormattingContext {
|
|||
contents: Contents,
|
||||
propagated_text_decoration_line: TextDecorationLine,
|
||||
) -> Self {
|
||||
match contents.try_into() {
|
||||
Ok(non_replaced_contents) => {
|
||||
match contents {
|
||||
Contents::NonReplaced(non_replaced_contents) => {
|
||||
let contents = match display_inside {
|
||||
DisplayInside::Flow { is_list_item } |
|
||||
DisplayInside::FlowRoot { is_list_item } => {
|
||||
|
@ -131,7 +129,7 @@ impl IndependentFormattingContext {
|
|||
contents,
|
||||
})
|
||||
},
|
||||
Err(contents) => {
|
||||
Contents::Replaced(contents) => {
|
||||
let mut base_fragment_info: BaseFragmentInfo = node_and_style_info.into();
|
||||
base_fragment_info.flags.insert(FragmentFlags::IS_REPLACED);
|
||||
Self::Replaced(ReplacedFormattingContext {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue