display: contents computes to block on the root element

This commit is contained in:
Simon Sapin 2020-04-17 14:36:03 +02:00
parent ef54bd6e58
commit 09dbf91e7b
2 changed files with 9 additions and 9 deletions

View file

@ -20,7 +20,7 @@ use crate::positioned::AbsolutelyPositionedBox;
use crate::positioned::PositioningContext; use crate::positioned::PositioningContext;
use crate::replaced::ReplacedContent; use crate::replaced::ReplacedContent;
use crate::sizing::ContentSizesRequest; use crate::sizing::ContentSizesRequest;
use crate::style_ext::{Display, DisplayGeneratingBox, DisplayInside}; use crate::style_ext::{Display, DisplayGeneratingBox};
use crate::DefiniteContainingBlock; use crate::DefiniteContainingBlock;
use app_units::Au; use app_units::Au;
use euclid::default::{Point2D, Rect, Size2D}; use euclid::default::{Point2D, Rect, Size2D};
@ -65,22 +65,22 @@ fn construct_for_root_element<'dom>(
root_element: impl NodeExt<'dom>, root_element: impl NodeExt<'dom>,
) -> (ContainsFloats, Vec<ArcRefCell<BlockLevelBox>>) { ) -> (ContainsFloats, Vec<ArcRefCell<BlockLevelBox>>) {
let style = root_element.style(context); let style = root_element.style(context);
let replaced = ReplacedContent::for_element(root_element);
let box_style = style.get_box(); let box_style = style.get_box();
let display_inside = match Display::from(box_style.display) { let display_inside = match Display::from(box_style.display) {
Display::None => return (ContainsFloats::No, Vec::new()), Display::None => return (ContainsFloats::No, Vec::new()),
Display::Contents if replaced.is_some() => { Display::Contents => {
// 'display: contents' computes to 'none' for replaced elements // Unreachable because the style crate adjusts the computed values:
return (ContainsFloats::No, Vec::new());
},
// https://drafts.csswg.org/css-display-3/#transformations // https://drafts.csswg.org/css-display-3/#transformations
Display::Contents => DisplayInside::Flow, // “'display' of 'contents' computes to 'block' on the root element”
unreachable!()
},
// The root element is blockified, ignore DisplayOutside // The root element is blockified, ignore DisplayOutside
Display::GeneratingBox(DisplayGeneratingBox::OutsideInside { inside, .. }) => inside, Display::GeneratingBox(DisplayGeneratingBox::OutsideInside { inside, .. }) => inside,
}; };
let contents = replaced.map_or(Contents::OfElement, Contents::Replaced); let contents =
ReplacedContent::for_element(root_element).map_or(Contents::OfElement, Contents::Replaced);
if box_style.position.is_absolutely_positioned() { if box_style.position.is_absolutely_positioned() {
( (
ContainsFloats::No, ContainsFloats::No,

View file

@ -354,7 +354,7 @@ impl Display {
/// ///
/// Also used for :root style adjustments. /// Also used for :root style adjustments.
pub fn equivalent_block_display(&self, _is_root_element: bool) -> Self { pub fn equivalent_block_display(&self, _is_root_element: bool) -> Self {
#[cfg(feature = "gecko")] #[cfg(any(feature = "servo-layout-2020", feature = "gecko"))]
{ {
// Special handling for `contents` and `list-item`s on the root element. // Special handling for `contents` and `list-item`s on the root element.
if _is_root_element && (self.is_contents() || self.is_list_item()) { if _is_root_element && (self.is_contents() || self.is_list_item()) {