Skip to content

Commit

Permalink
layout: Convert layout internal display to inline for replaced elemen…
Browse files Browse the repository at this point in the history
…ts (servo#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.
  • Loading branch information
mrobinson authored Jan 23, 2024
1 parent 8905889 commit 54fb381
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 79 deletions.
1 change: 1 addition & 0 deletions components/layout_2020/dom_traversal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
18 changes: 18 additions & 0 deletions components/layout_2020/style_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down Expand Up @@ -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)]
Expand Down
2 changes: 1 addition & 1 deletion components/layout_2020/table/construct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,7 @@ where
)
},
Err(_replaced) => {
panic!("We don't handle this yet.");
unreachable!("Replaced should not have a LayoutInternal display type.");
},
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[table-anonymous-objects-211.xht]
expected: CRASH
expected: FAIL
78 changes: 1 addition & 77 deletions tests/wpt/meta/css/css-tables/table-model-fixup-2.html.ini
Original file line number Diff line number Diff line change
@@ -1,85 +1,9 @@
[table-model-fixup-2.html]
expected: CRASH
[Replaced elements inside a table cannot be table-row and are considered inline -- input elements (top)]
expected: FAIL

[Replaced elements inside a table cannot be table-row and are considered inline -- img elements (top)]
expected: FAIL

[Replaced elements inside a table cannot be table-column and are considered inline -- input elements (width)]
expected: FAIL

[Replaced elements inside a table cannot be table-column and are considered inline -- input elements (top)]
expected: FAIL

[Replaced elements inside a table cannot be table-column and are considered inline -- img elements (top)]
expected: FAIL

[Replaced elements inside a table cannot be table-cell and are considered inline -- input elements (width)]
expected: FAIL

[Replaced elements inside a table cannot be table-cell and are considered inline -- input elements (top)]
expected: FAIL

[Replaced elements inside a table cannot be table-cell and are considered inline -- img elements (top)]
expected: FAIL

[Replaced elements outside a table cannot be table-row and are considered inline -- input=text elements]
expected: FAIL

[Replaced elements outside a table cannot be table-row and are considered inline -- input=button elements]
expected: FAIL

[Replaced elements outside a table cannot be table-row and are considered inline -- input=file elements]
expected: FAIL

[Replaced elements outside a table cannot be table-row and are considered inline -- img elements]
expected: FAIL

[Replaced elements outside a table cannot be table-row-group and are considered inline -- input=text elements]
expected: FAIL

[Replaced elements outside a table cannot be table-row-group and are considered inline -- input=button elements]
expected: FAIL

[Replaced elements outside a table cannot be table-row-group and are considered inline -- input=file elements]
expected: FAIL

[Replaced elements outside a table cannot be table-row-group and are considered inline -- img elements]
expected: FAIL

[Replaced elements outside a table cannot be table-column and are considered inline inline -- input=text elements]
expected: FAIL

[Replaced elements outside a table cannot be table-column and are considered inline -- input=button elements]
expected: FAIL

[Replaced elements outside a table cannot be table-column and are considered inline -- input=file elements]
expected: FAIL

[Replaced elements outside a table cannot be table-column and are considered inline -- img elements]
expected: FAIL

[Replaced elements outside a table cannot be table-cell and are considered inline -- input=text elements]
expected: FAIL

[Replaced elements outside a table cannot be table-cell and are considered inline -- input=button elements]
expected: FAIL

[Replaced elements outside a table cannot be table-cell and are considered inline -- input=file elements]
expected: FAIL

[Replaced elements outside a table cannot be table-cell and are considered inline -- img elements]
expected: FAIL

[Replaced elements outside a table cannot be table-caption and are considered inline -- input=text elements]
expected: FAIL

[Replaced elements outside a table cannot be table-caption and are considered inline -- input=button elements]
expected: FAIL

[Replaced elements outside a table cannot be table-caption and are considered inline -- input=file elements]
expected: FAIL

[Replaced elements outside a table cannot be table-caption and are considered inline -- img elements]
[Replaced elements inside a table cannot be table-row and are considered inline -- input elements (width)]
expected: FAIL

0 comments on commit 54fb381

Please sign in to comment.