layout: Convert layout internal display to inline for replaced elements (#31133)

Replaced elements should never be able to have a layout internal
display, according to the specification. This change makes it so that
the used value of replaced element's display is always inline, as the
specification says.
This commit is contained in:
Martin Robinson 2024-01-23 13:55:01 +01:00 committed by GitHub
parent 890588945d
commit 54fb381a0a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 22 additions and 79 deletions

View file

@ -172,6 +172,7 @@ fn traverse_element<'dom, Node>(
},
Display::GeneratingBox(display) => {
let contents = replaced.map_or(Contents::OfElement, Contents::Replaced);
let display = display.used_value_for_contents(&contents);
let box_slot = element.element_box_slot();
let info = NodeAndStyleInfo::new(element, style);
handler.handle_element(&info, display, contents, box_slot);

View file

@ -21,6 +21,7 @@ use style::values::specified::{box_ as stylo, Overflow};
use style::Zero;
use webrender_api as wr;
use crate::dom_traversal::Contents;
use crate::geom::{
LengthOrAuto, LengthPercentageOrAuto, LogicalSides, LogicalVec2, PhysicalSides, PhysicalSize,
};
@ -52,6 +53,23 @@ impl DisplayGeneratingBox {
},
}
}
pub(crate) fn used_value_for_contents(&self, contents: &Contents) -> Self {
// From <https://www.w3.org/TR/css-display-3/#layout-specific-display>:
// > When the display property of a replaced element computes to one of
// > the layout-internal values, it is handled as having a used value of
// > inline.
if matches!(self, Self::LayoutInternal(_)) && contents.is_replaced() {
Self::OutsideInside {
outside: DisplayOutside::Inline,
inside: DisplayInside::Flow {
is_list_item: false,
},
}
} else {
*self
}
}
}
#[derive(Clone, Copy, Eq, PartialEq)]

View file

@ -679,7 +679,7 @@ where
)
},
Err(_replaced) => {
panic!("We don't handle this yet.");
unreachable!("Replaced should not have a LayoutInternal display type.");
},
};