aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/config/prefs.rs3
-rw-r--r--components/layout_2020/display_list/mod.rs2
-rw-r--r--components/layout_2020/display_list/stacking_context.rs27
-rw-r--r--components/layout_2020/flexbox/layout.rs1
-rw-r--r--components/layout_2020/flow/float.rs426
-rw-r--r--components/layout_2020/flow/inline.rs40
-rw-r--r--components/layout_2020/flow/mod.rs420
-rw-r--r--components/layout_2020/flow/root.rs4
-rw-r--r--components/layout_2020/fragments.rs53
-rw-r--r--components/layout_2020/geom.rs22
-rw-r--r--components/layout_2020/positioned.rs3
-rw-r--r--components/layout_2020/query.rs6
-rw-r--r--components/layout_2020/tests/floats.rs54
-rw-r--r--components/style/properties/longhands/box.mako.rs5
-rw-r--r--components/style/values/computed/length.rs9
-rw-r--r--resources/prefs.json1
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/__dir__.ini1
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-fit-006.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-wrap-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/css1/c5525-fltwidth-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/adjacent-floats-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-applies-to-000.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-applies-to-009.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-005.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-default-inheritance-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-005.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-006.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-007.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-008.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-009.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-initial-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-no-interpolation.html.ini54
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-on-child-with-margins-2.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-on-parent-and-child.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-with-top-margin-after-cleared-empty-block.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clearance-006.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-001a.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-004a.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-005.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-006.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-007.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-008.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-008a.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-009.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-012.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-015.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-height-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-005.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-height-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-006.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-011.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-007.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-008.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-009.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-023.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-024.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-025.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-028.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-041.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-043.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-119.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-120.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-121.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-123.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-132.xht.ini (renamed from tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-005.xht.ini)2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-135.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-139.xht.ini (renamed from tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-004.xht.ini)2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-141.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-144.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-146.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-147.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-154.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-bfc-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-002.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-003.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-balancing-002.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-balancing-003.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-018.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-023.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-027.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-165.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-166.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/no-clearance-due-to-large-margin-after-left-right.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/second-float-inside-empty-cleared-block-after-margin.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/second-float-inside-empty-cleared-block.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/computed-float-position-absolute.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/float-no-interpolation.html.ini42
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-1.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-3-ref.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-4.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-6.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/float-root.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/float-table-align-left-quirk.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/float-under-flatten-under-preserve-3d.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-in-table-caption-001.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-004.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-006.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001a.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001b.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001c.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-rule3-outside-left-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-rule3-outside-right-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-outside-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-with-margin-005.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-001.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-005.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/negative-margin-float-positioning.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/new-fc-separates-from-float.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-space-between-floats-003.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-space-between-floats-004.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-width-floats.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/linebox/inline-negative-margin-001.html.ini27
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/linebox/line-height-128.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-collapse-006.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-collapse-007.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-005.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-006.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-007.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-016.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-017.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-018.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-028.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-029.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-030.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-040.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-041.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-042.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-052.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-053.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-054.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-064.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-065.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-066.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-076.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-077.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-078.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-088.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-089.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-090.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-109.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-110.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-111.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-112.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-009.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-012.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-013.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-014.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-015.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-009.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-013.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-014.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-context-height-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-context-height-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-contexts-008.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-contexts-016.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-in-inline-margins-004.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-non-replaced-height-011.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/margin-collapse-through-percentage-padding.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/max-width-110.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/min-height-106.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/width-non-replaced-inline-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/abspos-028.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/line-break-after-leading-float.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/position-relative-018.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/positioning-float-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/values/units-005.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini3
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/__dir__.ini1
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/abs_float_pref_width.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/background_position_shorthand.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_cleared_float_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_complex_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_containing_floats_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_float_inorder_interaction_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_float_placement_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_margin_inout_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_max_width_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_relative_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_translation_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/box_sizing_sanity_check_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/clear_generated_content_table_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/first_child_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/first_of_type_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/fixed_width_overrides_child_intrinsic_width_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/float-abspos.html.ini3
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/float_clearance_intrinsic_width_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/float_cleared_with_just_height.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/float_intrinsic_height.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/float_relative_to_position.html.ini3
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/float_under_top_margin_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/floated_list_item_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/floated_negative_margins_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/floated_table_with_margin_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/floats_margin_collapse_with_clearance_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/floats_percentage_width_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/incremental_float_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/input_alignment_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/intrinsic_border_box.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/last_child_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/last_of_type_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/negative_margin_uncle_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/nth_child_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/nth_last_child_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/nth_last_of_type_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/nth_of_type_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/only_child_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/only_of_type_pseudo_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/percentage_height_float_a.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/css/table_float_translation_a.html.ini2
235 files changed, 1018 insertions, 623 deletions
diff --git a/components/config/prefs.rs b/components/config/prefs.rs
index d72e64ad7c8..fd213766ebe 100644
--- a/components/config/prefs.rs
+++ b/components/config/prefs.rs
@@ -445,6 +445,9 @@ mod gen {
flexbox: {
enabled: bool,
},
+ floats: {
+ enabled: bool,
+ },
#[serde(default = "default_layout_threads")]
threads: i64,
viewport: {
diff --git a/components/layout_2020/display_list/mod.rs b/components/layout_2020/display_list/mod.rs
index 46636064045..1c1990b739d 100644
--- a/components/layout_2020/display_list/mod.rs
+++ b/components/layout_2020/display_list/mod.rs
@@ -200,6 +200,8 @@ impl Fragment {
Visibility::Hidden => (),
Visibility::Collapse => (),
},
+ Fragment::HoistedFloat(_) => {},
+ Fragment::Float => {},
Fragment::AbsoluteOrFixedPositioned(_) => {},
Fragment::Anonymous(_) => {},
Fragment::Image(i) => match i.style.get_inherited_box().visibility {
diff --git a/components/layout_2020/display_list/stacking_context.rs b/components/layout_2020/display_list/stacking_context.rs
index d4995d8cfc3..b9489308318 100644
--- a/components/layout_2020/display_list/stacking_context.rs
+++ b/components/layout_2020/display_list/stacking_context.rs
@@ -7,7 +7,7 @@ use crate::cell::ArcRefCell;
use crate::display_list::conversions::ToWebRender;
use crate::display_list::DisplayListBuilder;
use crate::fragment_tree::ContainingBlockManager;
-use crate::fragments::{AnonymousFragment, BoxFragment, Fragment};
+use crate::fragments::{AnonymousFragment, BoxFragment, Fragment, HoistedFloatFragment};
use crate::geom::PhysicalRect;
use crate::style_ext::ComputedValuesExt;
use crate::FragmentTree;
@@ -554,6 +554,14 @@ impl Fragment {
stacking_context,
);
},
+ Fragment::HoistedFloat(fragment) => {
+ fragment.build_stacking_context_tree(
+ display_list,
+ containing_block_info,
+ stacking_context,
+ );
+ },
+ Fragment::Float => {},
Fragment::AbsoluteOrFixedPositioned(fragment) => {
let shared_fragment = fragment.borrow();
let fragment_ref = match shared_fragment.fragment.as_ref() {
@@ -1095,3 +1103,20 @@ impl AnonymousFragment {
}
}
}
+
+impl HoistedFloatFragment {
+ fn build_stacking_context_tree(
+ &self,
+ display_list: &mut DisplayList,
+ containing_block_info: &ContainingBlockInfo,
+ stacking_context: &mut StackingContext,
+ ) {
+ self.fragment.borrow().build_stacking_context_tree(
+ &self.fragment,
+ display_list,
+ containing_block_info,
+ stacking_context,
+ StackingContextBuildMode::SkipHoisted,
+ );
+ }
+}
diff --git a/components/layout_2020/flexbox/layout.rs b/components/layout_2020/flexbox/layout.rs
index 1c8001d9b95..24e514b8010 100644
--- a/components/layout_2020/flexbox/layout.rs
+++ b/components/layout_2020/flexbox/layout.rs
@@ -800,6 +800,7 @@ impl FlexLine<'_> {
flex_context.sides_to_flow_relative(item.padding),
flex_context.sides_to_flow_relative(item.border),
margin,
+ Length::zero(),
collapsed_margin,
)
})
diff --git a/components/layout_2020/flow/float.rs b/components/layout_2020/flow/float.rs
index eeae46cba61..d85b364b694 100644
--- a/components/layout_2020/flow/float.rs
+++ b/components/layout_2020/flow/float.rs
@@ -6,16 +6,25 @@
//!
//! See CSS 2.1 § 9.5.1: https://www.w3.org/TR/CSS2/visuren.html#float-position
+use crate::cell::ArcRefCell;
use crate::context::LayoutContext;
use crate::dom::NodeExt;
use crate::dom_traversal::{Contents, NodeAndStyleInfo};
use crate::formatting_contexts::IndependentFormattingContext;
+use crate::fragments::{BoxFragment, CollapsedBlockMargins, CollapsedMargin, FloatFragment};
+use crate::fragments::{Fragment, HoistedFloatFragment};
use crate::geom::flow_relative::{Rect, Vec2};
-use crate::style_ext::DisplayInside;
+use crate::positioned::PositioningContext;
+use crate::style_ext::{ComputedValuesExt, DisplayInside};
+use crate::ContainingBlock;
use euclid::num::Zero;
use servo_arc::Arc;
use std::f32;
+use std::fmt::{Debug, Formatter, Result as FmtResult};
use std::ops::Range;
+use style::computed_values::clear::T as ClearProperty;
+use style::computed_values::float::T as FloatProperty;
+use style::properties::ComputedValues;
use style::values::computed::Length;
use style::values::specified::text::TextDecorationLine;
@@ -40,6 +49,25 @@ pub struct FloatContext {
/// The current (logically) vertical position. No new floats may be placed (logically) above
/// this line.
pub ceiling: Length,
+ /// Distances from the logical left side of the block formatting context to the logical sides
+ /// of the current containing block.
+ pub walls: InlineWalls,
+ /// The (logically) lowest margin edge of the last left float.
+ pub clear_left_position: Length,
+ /// The (logically) lowest margin edge of the last right float.
+ pub clear_right_position: Length,
+}
+
+/// Distances from the logical left side of the block formatting context to the logical sides of
+/// the current containing block.
+#[derive(Clone, Copy, Debug)]
+pub struct InlineWalls {
+ /// The distance from the logical left side of the block formatting context to the logical
+ /// left side of the current containing block.
+ pub left: Length,
+ /// The distance from the logical *left* side of the block formatting context to the logical
+ /// right side of this object's containing block.
+ pub right: Length,
}
impl FloatContext {
@@ -60,6 +88,9 @@ impl FloatContext {
FloatContext {
bands,
ceiling: Length::zero(),
+ walls: InlineWalls::new(),
+ clear_left_position: Length::zero(),
+ clear_right_position: Length::zero(),
}
}
@@ -81,9 +112,19 @@ impl FloatContext {
/// This should be used for placing inline elements and block formatting contexts so that they
/// don't collide with floats.
pub fn place_object(&self, object: &PlacementInfo) -> Vec2<Length> {
+ let ceiling = match object.clear {
+ ClearSide::None => self.ceiling,
+ ClearSide::Left => self.ceiling.max(self.clear_left_position),
+ ClearSide::Right => self.ceiling.max(self.clear_right_position),
+ ClearSide::Both => self
+ .ceiling
+ .max(self.clear_left_position)
+ .max(self.clear_right_position),
+ };
+
// Find the first band this float fits in.
- let mut first_band = self.bands.find(self.ceiling).unwrap();
- while !first_band.object_fits(&object) {
+ let mut first_band = self.bands.find(ceiling).unwrap();
+ while !first_band.object_fits(&object, &self.walls) {
let next_band = self.bands.find_next(first_band.top).unwrap();
if next_band.top.px().is_infinite() {
break;
@@ -95,8 +136,8 @@ impl FloatContext {
match object.side {
FloatSide::Left => {
let left_object_edge = match first_band.left {
- Some(band_left) => band_left.max(object.left_wall),
- None => object.left_wall,
+ Some(band_left) => band_left.max(self.walls.left),
+ None => self.walls.left,
};
Vec2 {
inline: left_object_edge,
@@ -105,8 +146,8 @@ impl FloatContext {
},
FloatSide::Right => {
let right_object_edge = match first_band.right {
- Some(band_right) => band_right.min(object.right_wall),
- None => object.right_wall,
+ Some(band_right) => band_right.min(self.walls.right),
+ None => self.walls.right,
};
Vec2 {
inline: right_object_edge - object.size.inline,
@@ -129,6 +170,20 @@ impl FloatContext {
size: new_float.size.clone(),
};
+ // Update clear.
+ match new_float.side {
+ FloatSide::Left => {
+ self.clear_left_position = self
+ .clear_left_position
+ .max(new_float_rect.max_block_position())
+ },
+ FloatSide::Right => {
+ self.clear_right_position = self
+ .clear_right_position
+ .max(new_float_rect.max_block_position())
+ },
+ }
+
// Split the first band if necessary.
let mut first_band = self.bands.find(new_float_rect.start_corner.block).unwrap();
first_band.top = new_float_rect.start_corner.block;
@@ -155,6 +210,15 @@ impl FloatContext {
}
}
+impl InlineWalls {
+ fn new() -> InlineWalls {
+ InlineWalls {
+ left: Length::zero(),
+ right: Length::new(f32::INFINITY),
+ }
+ }
+}
+
/// Information needed to place an object so that it doesn't collide with existing floats.
#[derive(Clone, Debug)]
pub struct PlacementInfo {
@@ -164,12 +228,6 @@ pub struct PlacementInfo {
pub side: FloatSide,
/// Which side or sides to clear floats on.
pub clear: ClearSide,
- /// The distance from the logical left side of the block formatting context to the logical
- /// left side of this object's containing block.
- pub left_wall: Length,
- /// The distance from the logical *left* side of the block formatting context to the logical
- /// right side of this object's containing block.
- pub right_wall: Length,
}
/// Whether the float is left or right.
@@ -210,39 +268,41 @@ pub struct FloatBand {
pub right: Option<Length>,
}
-impl FloatBand {
- // Returns true if this band is clear of floats on the given side or sides.
- fn is_clear(&self, side: ClearSide) -> bool {
- match (side, self.left, self.right) {
- (ClearSide::Left, Some(_), _) |
- (ClearSide::Right, _, Some(_)) |
- (ClearSide::Both, Some(_), _) |
- (ClearSide::Both, _, Some(_)) => false,
- (ClearSide::None, _, _) |
- (ClearSide::Left, None, _) |
- (ClearSide::Right, _, None) |
- (ClearSide::Both, None, None) => true,
+impl FloatSide {
+ fn from_style(style: &ComputedValues) -> Option<FloatSide> {
+ match style.get_box().float {
+ FloatProperty::None => None,
+ FloatProperty::Left => Some(FloatSide::Left),
+ FloatProperty::Right => Some(FloatSide::Right),
}
}
+}
- // Determines whether an object fits in a band.
- fn object_fits(&self, object: &PlacementInfo) -> bool {
- // If we must be clear on the given side and we aren't, this object doesn't fit.
- if !self.is_clear(object.clear) {
- return false;
+impl ClearSide {
+ pub(crate) fn from_style(style: &ComputedValues) -> ClearSide {
+ match style.get_box().clear {
+ ClearProperty::None => ClearSide::None,
+ ClearProperty::Left => ClearSide::Left,
+ ClearProperty::Right => ClearSide::Right,
+ ClearProperty::Both => ClearSide::Both,
}
+ }
+}
+impl FloatBand {
+ // Determines whether an object fits in a band.
+ fn object_fits(&self, object: &PlacementInfo, walls: &InlineWalls) -> bool {
match object.side {
FloatSide::Left => {
// Compute a candidate left position for the object.
let candidate_left = match self.left {
- None => object.left_wall,
- Some(left) => left.max(object.left_wall),
+ None => walls.left,
+ Some(left) => left.max(walls.left),
};
// If this band has an existing left float in it, then make sure that the object
// doesn't stick out past the right edge (rule 7).
- if self.left.is_some() && candidate_left + object.size.inline > object.right_wall {
+ if self.left.is_some() && candidate_left + object.size.inline > walls.right {
return false;
}
@@ -257,13 +317,13 @@ impl FloatBand {
FloatSide::Right => {
// Compute a candidate right position for the object.
let candidate_right = match self.right {
- None => object.right_wall,
- Some(right) => right.min(object.right_wall),
+ None => walls.right,
+ Some(right) => right.min(walls.right),
};
// If this band has an existing right float in it, then make sure that the new
// object doesn't stick out past the left edge (rule 7).
- if self.right.is_some() && candidate_right - object.size.inline < object.left_wall {
+ if self.right.is_some() && candidate_right - object.size.inline < walls.left {
return false;
}
@@ -540,6 +600,12 @@ impl FloatBandLink {
}
}
+impl Debug for FloatFragment {
+ fn fmt(&self, formatter: &mut Formatter) -> FmtResult {
+ write!(formatter, "FloatFragment")
+ }
+}
+
// Float boxes
impl FloatBox {
@@ -561,4 +627,292 @@ impl FloatBox {
),
}
}
+
+ pub fn layout(
+ &mut self,
+ layout_context: &LayoutContext,
+ positioning_context: &mut PositioningContext,
+ containing_block: &ContainingBlock,
+ mut sequential_layout_state: Option<&mut SequentialLayoutState>,
+ ) {
+ let sequential_layout_state = sequential_layout_state
+ .as_mut()
+ .expect("Tried to lay out a float with no sequential placement state!");
+
+ // Speculate that the float ceiling will be located at the current block position plus the
+ // result of solving any margins we're building up. This is usually right, but it can be
+ // incorrect if there are more in-flow collapsible margins yet to be seen. An example
+ // showing when this can go wrong:
+ //
+ // <div style="margin: 5px"></div>
+ // <div style="float: left"></div>
+ // <div style="margin: 10px"></div>
+ //
+ // Assuming these are all in-flow, the float should be placed 10px down from the start, not
+ // 5px, but we can't know that because we haven't seen the block after this float yet.
+ //
+ // FIXME(pcwalton): Implement the proper behavior when speculation fails. Either detect it
+ // afterward and fix it up, or detect this situation ahead of time via lookahead and make
+ // sure `current_margin` is accurate before calling this method.
+ sequential_layout_state.floats.lower_ceiling(
+ sequential_layout_state.bfc_relative_block_position +
+ sequential_layout_state.current_margin.solve(),
+ );
+
+ let style = match self.contents {
+ IndependentFormattingContext::Replaced(ref replaced) => replaced.style.clone(),
+ IndependentFormattingContext::NonReplaced(ref non_replaced) => {
+ non_replaced.style.clone()
+ },
+ };
+ let float_context = &mut sequential_layout_state.floats;
+ let box_fragment = positioning_context.layout_maybe_position_relative_fragment(
+ layout_context,
+ containing_block,
+ &style,
+ |mut positioning_context| {
+ // Margin is computed this way regardless of whether the element is replaced
+ // or non-replaced.
+ let pbm = style.padding_border_margin(containing_block);
+ let margin = pbm.margin.auto_is(|| Length::zero());
+ let pbm_sums = &(&pbm.padding + &pbm.border) + &margin;
+
+ let (content_size, fragments);
+ match self.contents {
+ IndependentFormattingContext::NonReplaced(ref mut non_replaced) => {
+ // Calculate inline size.
+ // https://drafts.csswg.org/css2/#float-width
+ let box_size = non_replaced.style.content_box_size(&containing_block, &pbm);
+ let max_box_size = non_replaced
+ .style
+ .content_max_box_size(&containing_block, &pbm);
+ let min_box_size = non_replaced
+ .style
+ .content_min_box_size(&containing_block, &pbm)
+ .auto_is(Length::zero);
+
+ let tentative_inline_size = box_size.inline.auto_is(|| {
+ let available_size =
+ containing_block.inline_size - pbm_sums.inline_sum();
+ non_replaced
+ .inline_content_sizes(layout_context)
+ .shrink_to_fit(available_size)
+ });
+ let inline_size = tentative_inline_size
+ .clamp_between_extremums(min_box_size.inline, max_box_size.inline);
+
+ // Calculate block size.
+ // https://drafts.csswg.org/css2/#block-root-margin
+ // FIXME(pcwalton): Is a tree rank of zero correct here?
+ let containing_block_for_children = ContainingBlock {
+ inline_size,
+ block_size: box_size.block,
+ style: &non_replaced.style,
+ };
+ let independent_layout = non_replaced.layout(
+ layout_context,
+ &mut positioning_context,
+ &containing_block_for_children,
+ 0,
+ );
+ content_size = Vec2 {
+ inline: inline_size,
+ block: box_size
+ .block
+ .auto_is(|| independent_layout.content_block_size),
+ };
+ fragments = independent_layout.fragments;
+ },
+ IndependentFormattingContext::Replaced(ref replaced) => {
+ // https://drafts.csswg.org/css2/#float-replaced-width
+ // https://drafts.csswg.org/css2/#inline-replaced-height
+ content_size = replaced.contents.used_size_as_if_inline_element(
+ &containing_block,
+ &replaced.style,
+ None,
+ &pbm,
+ );
+ fragments = replaced
+ .contents
+ .make_fragments(&replaced.style, content_size.clone());
+ },
+ };
+
+ let margin_box_start_corner = float_context.add_float(&PlacementInfo {
+ size: &content_size + &pbm_sums.sum(),
+ side: FloatSide::from_style(&style).expect("Float box wasn't floated!"),
+ clear: ClearSide::from_style(&style),
+ });
+
+ let content_rect = Rect {
+ start_corner: &margin_box_start_corner + &pbm_sums.start_offset(),
+ size: content_size.clone(),
+ };
+
+ // Clearance is handled internally by the float placement logic, so there's no need
+ // to store it explicitly in the fragment.
+ let clearance = Length::zero();
+
+ BoxFragment::new(
+ self.contents.base_fragment_info(),
+ style.clone(),
+ fragments,
+ content_rect,
+ pbm.padding,
+ pbm.border,
+ margin,
+ clearance,
+ CollapsedBlockMargins::zero(),
+ )
+ },
+ );
+ sequential_layout_state.push_float_fragment(ArcRefCell::new(Fragment::Box(box_fragment)));
+ }
+}
+
+// Float fragment storage
+
+// A persistent linked list that stores float fragments that need to be hoisted to their nearest
+// ancestor containing block.
+#[derive(Clone)]
+struct FloatFragmentList {
+ root: FloatFragmentLink,
+}
+
+// A single link in the float fragment list.
+#[derive(Clone)]
+struct FloatFragmentLink(Option<Arc<FloatFragmentNode>>);
+
+// A single node in the float fragment list.
+#[derive(Clone)]
+struct FloatFragmentNode {
+ // The fragment.
+ fragment: ArcRefCell<Fragment>,
+ // The next fragment (previous in document order).
+ next: FloatFragmentLink,
+}
+
+impl FloatFragmentList {
+ fn new() -> FloatFragmentList {
+ FloatFragmentList {
+ root: FloatFragmentLink(None),
+ }
+ }
+}
+
+// Sequential layout state
+
+// Layout state that we maintain when doing sequential traversals of the box tree in document
+// order.
+//
+// This data is only needed for float placement and float interaction, and as such is only present
+// if the current block formatting context contains floats.
+//
+// All coordinates here are relative to the start of the nearest ancestor block formatting context.
+//
+// This structure is expected to be cheap to clone, in order to allow for "snapshots" that enable
+// restarting layout at any point in the tree.
+#[derive(Clone)]
+pub(crate) struct SequentialLayoutState {
+ // Holds all floats in this block formatting context.
+ pub(crate) floats: FloatContext,
+ // A list of all float fragments in this block formatting context. These are gathered up and
+ // hoisted to the top of the BFC.
+ bfc_float_fragments: FloatFragmentList,
+ // The (logically) bottom border edge or top padding edge of the last in-flow block. Floats
+ // cannot be placed above this line.
+ //
+ // This is often, but not always, the same as the float ceiling. The float ceiling can be lower
+ // than this value because this value is calculated based on in-flow boxes only, while
+ // out-of-flow floats can affect the ceiling as well (see CSS 2.1 § 9.5.1 rule 6).
+ bfc_relative_block_position: Length,
+ // Any collapsible margins that we've encountered after `bfc_relative_block_position`.
+ current_margin: CollapsedMargin,
+}
+
+impl SequentialLayoutState {
+ // Creates a new empty `SequentialLayoutState`.
+ pub(crate) fn new() -> SequentialLayoutState {
+ SequentialLayoutState {
+ floats: FloatContext::new(),
+ current_margin: CollapsedMargin::zero(),
+ bfc_relative_block_position: Length::zero(),
+ bfc_float_fragments: FloatFragmentList::new(),
+ }
+ }
+
+ // Moves the current block position (logically) down by `block_distance`.
+ //
+ // Floats may not be placed higher than the current block position.
+ pub(crate) fn advance_block_position(&mut self, block_distance: Length) {
+ self.bfc_relative_block_position += block_distance;
+ self.floats.lower_ceiling(self.bfc_relative_block_position);
+ }
+
+ // Collapses margins, moving the block position down by the collapsed value of `current_margin`
+ // and resetting `current_margin` to zero.
+ //
+ // Call this method before laying out children when it is known that the start margin of the
+ // current fragment can't collapse with the margins of any of its children.
+ pub(crate) fn collapse_margins(&mut self) {
+ self.advance_block_position(self.current_margin.solve());
+ self.current_margin = CollapsedMargin::zero();
+ }
+
+ // Returns the amount of clearance that a block with the given `clear` value at the current
+ // `bfc_relative_block_position` (with top margin included in `current_margin` if applicable)
+ // needs to have.
+ //
+ // https://www.w3.org/TR/2011/REC-CSS2-20110607/visuren.html#flow-control
+ pub(crate) fn calculate_clearance(&self, clear_side: ClearSide) -> Length {
+ if clear_side == ClearSide::None {
+ return Length::zero();
+ }
+
+ let hypothetical_block_position =
+ self.bfc_relative_block_position + self.current_margin.solve();
+ let clear_position = match clear_side {
+ ClearSide::None => unreachable!(),
+ ClearSide::Left => self
+ .floats
+ .clear_left_position
+ .max(hypothetical_block_position),
+ ClearSide::Right => self
+ .floats
+ .clear_right_position
+ .max(hypothetical_block_position),
+ ClearSide::Both => self
+ .floats
+ .clear_left_position
+ .max(self.floats.clear_right_position)
+ .max(hypothetical_block_position),
+ };
+ clear_position - hypothetical_block_position
+ }
+
+ /// Adds a new adjoining margin.
+ pub(crate) fn adjoin_assign(&mut self, margin: &CollapsedMargin) {
+ self.current_margin.adjoin_assign(margin)
+ }
+
+ /// Adds the float fragment to this list.
+ pub(crate) fn push_float_fragment(&mut self, new_float_fragment: ArcRefCell<Fragment>) {
+ self.bfc_float_fragments.root.0 = Some(Arc::new(FloatFragmentNode {
+ fragment: new_float_fragment,
+ next: FloatFragmentLink(self.bfc_float_fragments.root.0.take()),
+ }));
+ }
+
+ /// Adds the float fragments we've been building up to the given vector.
+ pub(crate) fn add_float_fragments_to_list(&self, fragment_list: &mut Vec<Fragment>) {
+ let start_index = fragment_list.len();
+ let mut link = &self.bfc_float_fragments.root;
+ while let Some(ref node) = link.0 {
+ fragment_list.push(Fragment::HoistedFloat(HoistedFloatFragment {
+ fragment: node.fragment.clone(),
+ }));
+ link = &node.next;
+ }
+ fragment_list[start_index..].reverse();
+ }
}
diff --git a/components/layout_2020/flow/inline.rs b/components/layout_2020/flow/inline.rs
index c59ffca9215..4bf9ec5012a 100644
--- a/components/layout_2020/flow/inline.rs
+++ b/components/layout_2020/flow/inline.rs
@@ -4,7 +4,7 @@
use crate::cell::ArcRefCell;
use crate::context::LayoutContext;
-use crate::flow::float::FloatBox;
+use crate::flow::float::{FloatBox, SequentialLayoutState};
use crate::flow::FlowLayout;
use crate::formatting_contexts::IndependentFormattingContext;
use crate::fragment_tree::BaseFragmentInfo;
@@ -99,6 +99,7 @@ struct InlineFormattingContextState<'box_tree, 'a, 'b> {
inline_position: Length,
partial_inline_boxes_stack: Vec<PartialInlineBoxFragment<'box_tree>>,
current_nesting_level: InlineNestingLevelState<'box_tree>,
+ sequential_layout_state: Option<&'a mut SequentialLayoutState>,
}
impl<'box_tree, 'a, 'b> InlineFormattingContextState<'box_tree, 'a, 'b> {
@@ -271,6 +272,7 @@ impl InlineFormattingContext {
positioning_context: &mut PositioningContext,
containing_block: &ContainingBlock,
tree_rank: usize,
+ sequential_layout_state: Option<&mut SequentialLayoutState>,
) -> FlowLayout {
let mut ifc = InlineFormattingContextState {
positioning_context,
@@ -298,8 +300,15 @@ impl InlineFormattingContext {
positioning_context: None,
text_decoration_line: self.text_decoration_line,
},
+ sequential_layout_state,
};
+ // FIXME(pcwalton): This assumes that margins never collapse through inline formatting
+ // contexts (i.e. that inline formatting contexts are never empty). Is that right?
+ if let Some(ref mut sequential_layout_state) = ifc.sequential_layout_state {
+ sequential_layout_state.collapse_margins();
+ }
+
loop {
if let Some(child) = ifc.current_nesting_level.remaining_boxes.next() {
match &mut *child.borrow_mut() {
@@ -342,8 +351,16 @@ impl InlineFormattingContext {
.fragments_so_far
.push(Fragment::AbsoluteOrFixedPositioned(hoisted_fragment));
},
- InlineLevelBox::OutOfFlowFloatBox(_box_) => {
- // TODO
+ InlineLevelBox::OutOfFlowFloatBox(box_) => {
+ box_.layout(
+ layout_context,
+ ifc.positioning_context,
+ containing_block,
+ ifc.sequential_layout_state.as_mut().map(|c| &mut **c),
+ );
+ ifc.current_nesting_level
+ .fragments_so_far
+ .push(Fragment::Float);
},
}
} else
@@ -360,6 +377,7 @@ impl InlineFormattingContext {
ifc.lines.finish_line(
&mut ifc.current_nesting_level,
containing_block,
+ ifc.sequential_layout_state,
ifc.inline_position,
);
return FlowLayout {
@@ -377,6 +395,7 @@ impl Lines {
&mut self,
top_nesting_level: &mut InlineNestingLevelState,
containing_block: &ContainingBlock,
+ mut sequential_layout_state: Option<&mut SequentialLayoutState>,
line_content_inline_size: Length,
) {
let mut line_contents = std::mem::take(&mut top_nesting_level.fragments_so_far);
@@ -430,7 +449,11 @@ impl Lines {
inline: containing_block.inline_size,
block: line_block_size,
};
+
self.next_line_block_position += size.block;
+ if let Some(ref mut sequential_layout_state) = sequential_layout_state {
+ sequential_layout_state.advance_block_position(size.block);
+ }
self.fragments
.push(Fragment::Anonymous(AnonymousFragment::new(
@@ -519,6 +542,7 @@ impl<'box_tree> PartialInlineBoxFragment<'box_tree> {
self.padding.clone(),
self.border.clone(),
self.margin.clone(),
+ Length::zero(),
CollapsedBlockMargins::zero(),
);
let last_fragment = self.last_box_tree_fragment && !at_line_break;
@@ -583,6 +607,7 @@ fn layout_atomic(
pbm.padding,
pbm.border,
margin,
+ Length::zero(),
CollapsedBlockMargins::zero(),
)
},
@@ -658,6 +683,7 @@ fn layout_atomic(
pbm.padding,
pbm.border,
margin,
+ Length::zero(),
CollapsedBlockMargins::zero(),
)
},
@@ -861,8 +887,12 @@ impl TextRun {
partial.parent_nesting_level.inline_start = Length::zero();
nesting_level = &mut partial.parent_nesting_level;
}
- ifc.lines
- .finish_line(nesting_level, ifc.containing_block, ifc.inline_position);
+ ifc.lines.finish_line(
+ nesting_level,
+ ifc.containing_block,
+ ifc.sequential_layout_state.as_mut().map(|c| &mut **c),
+ ifc.inline_position,
+ );
ifc.inline_position = Length::zero();
}
}
diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs
index 73630acf7bd..f2e6283a3ec 100644
--- a/components/layout_2020/flow/mod.rs
+++ b/components/layout_2020/flow/mod.rs
@@ -6,15 +6,13 @@
use crate::cell::ArcRefCell;
use crate::context::LayoutContext;
-use crate::flow::float::{FloatBox, FloatContext};
+use crate::flow::float::{ClearSide, FloatBox, SequentialLayoutState};
use crate::flow::inline::InlineFormattingContext;
use crate::formatting_contexts::{
IndependentFormattingContext, IndependentLayout, NonReplacedFormattingContext,
};
use crate::fragment_tree::BaseFragmentInfo;
-use crate::fragments::{
- AnonymousFragment, BoxFragment, CollapsedBlockMargins, CollapsedMargin, Fragment,
-};
+use crate::fragments::{BoxFragment, CollapsedBlockMargins, CollapsedMargin, Fragment};
use crate::geom::flow_relative::{Rect, Sides, Vec2};
use crate::positioned::{AbsolutelyPositionedBox, PositioningContext};
use crate::replaced::ReplacedContent;
@@ -78,26 +76,31 @@ impl BlockFormattingContext {
containing_block: &ContainingBlock,
tree_rank: usize,
) -> IndependentLayout {
- let mut float_context;
- let float_context = if self.contains_floats {
- float_context = FloatContext::new();
- Some(&mut float_context)
+ let mut sequential_layout_state = if self.contains_floats || !layout_context.use_rayon {
+ Some(SequentialLayoutState::new())
} else {
None
};
- let flow_layout = self.contents.layout(
+
+ let mut flow_layout = self.contents.layout(
layout_context,
positioning_context,
containing_block,
tree_rank,
- float_context,
+ sequential_layout_state.as_mut(),
CollapsibleWithParentStartMargin(false),
);
- assert!(
+ debug_assert!(
!flow_layout
.collapsible_margins_in_children
.collapsed_through
);
+
+ // FIXME(pcwalton): Relative positioning of ancestors should affect descendant floats.
+ if let Some(ref sequential_layout_state) = sequential_layout_state {
+ sequential_layout_state.add_float_fragments_to_list(&mut flow_layout.fragments);
+ }
+
IndependentLayout {
fragments: flow_layout.fragments,
content_block_size: flow_layout.content_block_size +
@@ -113,7 +116,7 @@ impl BlockContainer {
positioning_context: &mut PositioningContext,
containing_block: &ContainingBlock,
tree_rank: usize,
- float_context: Option<&mut FloatContext>,
+ sequential_layout_state: Option<&mut SequentialLayoutState>,
collapsible_with_parent_start_margin: CollapsibleWithParentStartMargin,
) -> FlowLayout {
match self {
@@ -123,7 +126,7 @@ impl BlockContainer {
child_boxes,
containing_block,
tree_rank,
- float_context,
+ sequential_layout_state,
collapsible_with_parent_start_margin,
),
BlockContainer::InlineFormattingContext(ifc) => ifc.layout(
@@ -131,6 +134,7 @@ impl BlockContainer {
positioning_context,
containing_block,
tree_rank,
+ sequential_layout_state,
),
}
}
@@ -169,130 +173,110 @@ fn layout_block_level_children(
child_boxes: &[ArcRefCell<BlockLevelBox>],
containing_block: &ContainingBlock,
tree_rank: usize,
- mut float_context: Option<&mut FloatContext>,
+ mut sequential_layout_state: Option<&mut SequentialLayoutState>,
collapsible_with_parent_start_margin: CollapsibleWithParentStartMargin,
) -> FlowLayout {
- fn place_block_level_fragment(fragment: &mut Fragment, placement_state: &mut PlacementState) {
- match fragment {
- Fragment::Box(fragment) => {
- let fragment_block_margins = &fragment.block_margins_collapsed_with_children;
- let fragment_block_size = fragment.padding.block_sum() +
- fragment.border.block_sum() +
- fragment.content_rect.size.block;
-
- if placement_state.next_in_flow_margin_collapses_with_parent_start_margin {
- assert_eq!(placement_state.current_margin.solve(), Length::zero());
- placement_state
- .start_margin
- .adjoin_assign(&fragment_block_margins.start);
- if fragment_block_margins.collapsed_through {
- placement_state
- .start_margin
- .adjoin_assign(&fragment_block_margins.end);
- return;
- }
- placement_state.next_in_flow_margin_collapses_with_parent_start_margin = false;
- } else {
- placement_state
- .current_margin
- .adjoin_assign(&fragment_block_margins.start);
- }
- fragment.content_rect.start_corner.block += placement_state.current_margin.solve() +
- placement_state.current_block_direction_position;
- if fragment_block_margins.collapsed_through {
- placement_state
- .current_margin
- .adjoin_assign(&fragment_block_margins.end);
- return;
- }
- placement_state.current_block_direction_position +=
- placement_state.current_margin.solve() + fragment_block_size;
- placement_state.current_margin = fragment_block_margins.end;
- },
- Fragment::AbsoluteOrFixedPositioned(fragment) => {
- let offset = Vec2 {
- block: placement_state.current_margin.solve() +
- placement_state.current_block_direction_position,
- inline: Length::new(0.),
- };
- fragment.borrow_mut().adjust_offsets(offset);
- },
- Fragment::Anonymous(_) => {},
- _ => unreachable!(),
- }
+ match sequential_layout_state {
+ Some(ref mut sequential_layout_state) => layout_block_level_children_sequentially(
+ layout_context,
+ positioning_context,
+ child_boxes,
+ containing_block,
+ tree_rank,
+ sequential_layout_state,
+ collapsible_with_parent_start_margin,
+ ),
+ None => layout_block_level_children_in_parallel(
+ layout_context,
+ positioning_context,
+ child_boxes,
+ containing_block,
+ tree_rank,
+ collapsible_with_parent_start_margin,
+ ),
}
+}
- struct PlacementState {
- next_in_flow_margin_collapses_with_parent_start_margin: bool,
- start_margin: CollapsedMargin,
- current_margin: CollapsedMargin,
- current_block_direction_position: Length,
- }
+fn layout_block_level_children_in_parallel(
+ layout_context: &LayoutContext,
+ positioning_context: &mut PositioningContext,
+ child_boxes: &[ArcRefCell<BlockLevelBox>],
+ containing_block: &ContainingBlock,
+ tree_rank: usize,
+ collapsible_with_parent_start_margin: CollapsibleWithParentStartMargin,
+) -> FlowLayout {
+ let mut placement_state = PlacementState::new(collapsible_with_parent_start_margin);
- let mut placement_state = PlacementState {
- next_in_flow_margin_collapses_with_parent_start_margin:
- collapsible_with_parent_start_margin.0,
- start_margin: CollapsedMargin::zero(),
- current_margin: CollapsedMargin::zero(),
- current_block_direction_position: Length::zero(),
- };
let fragments = positioning_context.adjust_static_positions(tree_rank, |positioning_context| {
- if float_context.is_some() || !layout_context.use_rayon {
- // Because floats are involved, we do layout for this block formatting context
- // in tree order without parallelism. This enables mutable access
- // to a `FloatContext` that tracks every float encountered so far (again in tree order).
- child_boxes
- .iter()
- .enumerate()
- .map(|(tree_rank, box_)| {
- let mut fragment = box_.borrow_mut().layout(
+ let collects_for_nearest_positioned_ancestor =
+ positioning_context.collects_for_nearest_positioned_ancestor();
+ let mut fragments: Vec<Fragment> = child_boxes
+ .par_iter()
+ .enumerate()
+ .mapfold_reduce_into(
+ positioning_context,
+ |positioning_context, (tree_rank, box_)| {
+ box_.borrow_mut().layout(
layout_context,
positioning_context,
containing_block,
tree_rank,
- float_context.as_mut().map(|c| &mut **c),
- );
- place_block_level_fragment(&mut fragment, &mut placement_state);
- fragment
- })
- .collect()
- } else {
- let collects_for_nearest_positioned_ancestor =
- positioning_context.collects_for_nearest_positioned_ancestor();
- let mut fragments = child_boxes
- .par_iter()
- .enumerate()
- .mapfold_reduce_into(
- positioning_context,
- |positioning_context, (tree_rank, box_)| {
- box_.borrow_mut().layout(
- layout_context,
- positioning_context,
- containing_block,
- tree_rank,
- /* float_context = */ None,
- )
- },
- || PositioningContext::new_for_rayon(collects_for_nearest_positioned_ancestor),
- PositioningContext::append,
- )
- .collect();
- for fragment in &mut fragments {
- place_block_level_fragment(fragment, &mut placement_state)
- }
- fragments
+ /* sequential_layout_state = */ None,
+ )
+ },
+ || PositioningContext::new_for_rayon(collects_for_nearest_positioned_ancestor),
+ PositioningContext::append,
+ )
+ .collect();
+ for fragment in fragments.iter_mut() {
+ placement_state.place_fragment(fragment);
}
+ fragments
});
FlowLayout {
fragments,
content_block_size: placement_state.current_block_direction_position,
- collapsible_margins_in_children: CollapsedBlockMargins {
- collapsed_through: placement_state
- .next_in_flow_margin_collapses_with_parent_start_margin,
- start: placement_state.start_margin,
- end: placement_state.current_margin,
- },
+ collapsible_margins_in_children: placement_state.collapsible_margins_in_children(),
+ }
+}
+
+fn layout_block_level_children_sequentially(
+ layout_context: &LayoutContext,
+ positioning_context: &mut PositioningContext,
+ child_boxes: &[ArcRefCell<BlockLevelBox>],
+ containing_block: &ContainingBlock,
+ tree_rank: usize,
+ sequential_layout_state: &mut SequentialLayoutState,
+ collapsible_with_parent_start_margin: CollapsibleWithParentStartMargin,
+) -> FlowLayout {
+ let mut placement_state = PlacementState::new(collapsible_with_parent_start_margin);
+
+ let fragments = positioning_context.adjust_static_positions(tree_rank, |positioning_context| {
+ // Because floats are involved, we do layout for this block formatting context in tree
+ // order without parallelism. This enables mutable access to a `SequentialLayoutState` that
+ // tracks every float encountered so far (again in tree order).
+ child_boxes
+ .iter()
+ .enumerate()
+ .map(|(tree_rank, child_box)| {
+ let mut fragment = child_box.borrow_mut().layout(
+ layout_context,
+ positioning_context,
+ containing_block,
+ tree_rank,
+ Some(&mut *sequential_layout_state),
+ );
+ placement_state.place_fragment(&mut fragment);
+ fragment
+ })
+ .collect()
+ });
+
+ FlowLayout {
+ fragments,
+ content_block_size: placement_state.current_block_direction_position,
+ collapsible_margins_in_children: placement_state.collapsible_margins_in_children(),
}
}
@@ -303,7 +287,7 @@ impl BlockLevelBox {
positioning_context: &mut PositioningContext,
containing_block: &ContainingBlock,
tree_rank: usize,
- float_context: Option<&mut FloatContext>,
+ sequential_layout_state: Option<&mut SequentialLayoutState>,
) -> Fragment {
match self {
BlockLevelBox::SameFormattingContextBlock {
@@ -323,7 +307,7 @@ impl BlockLevelBox {
style,
NonReplacedContents::SameFormattingContextBlock(contents),
tree_rank,
- float_context,
+ sequential_layout_state,
)
},
)),
@@ -339,6 +323,7 @@ impl BlockLevelBox {
replaced.base_fragment_info,
&replaced.style,
&replaced.contents,
+ sequential_layout_state,
)
},
))
@@ -359,7 +344,7 @@ impl BlockLevelBox {
non_replaced,
),
tree_rank,
- float_context,
+ sequential_layout_state,
)
},
))
@@ -379,11 +364,14 @@ impl BlockLevelBox {
positioning_context.push(hoisted_box);
Fragment::AbsoluteOrFixedPositioned(hoisted_fragment)
},
- BlockLevelBox::OutOfFlowFloatBox(_box_) => {
- // FIXME: call layout_maybe_position_relative_fragment here
- Fragment::Anonymous(AnonymousFragment::no_op(
- containing_block.style.writing_mode,
- ))
+ BlockLevelBox::OutOfFlowFloatBox(box_) => {
+ box_.layout(
+ layout_context,
+ positioning_context,
+ containing_block,
+ sequential_layout_state,
+ );
+ Fragment::Float
},
}
}
@@ -425,7 +413,7 @@ fn layout_in_flow_non_replaced_block_level(
style: &Arc<ComputedValues>,
block_level_kind: NonReplacedContents,
tree_rank: usize,
- float_context: Option<&mut FloatContext>,
+ mut sequential_layout_state: Option<&mut SequentialLayoutState>,
) -> BoxFragment {
let pbm = style.padding_border_margin(containing_block);
let box_size = style.content_box_size(containing_block, &pbm);
@@ -479,37 +467,76 @@ fn layout_in_flow_non_replaced_block_level(
block_size,
style,
};
+
// https://drafts.csswg.org/css-writing-modes/#orthogonal-flows
assert_eq!(
containing_block.style.writing_mode, containing_block_for_children.style.writing_mode,
"Mixed writing modes are not supported yet"
);
+ let block_is_same_formatting_context = match block_level_kind {
+ NonReplacedContents::SameFormattingContextBlock(_) => true,
+ NonReplacedContents::EstablishesAnIndependentFormattingContext(_) => false,
+ };
+
+ let start_margin_can_collapse_with_children = block_is_same_formatting_context &&
+ pbm.padding.block_start == Length::zero() &&
+ pbm.border.block_start == Length::zero();
+ let end_margin_can_collapse_with_children = block_is_same_formatting_context &&
+ pbm.padding.block_end == Length::zero() &&
+ pbm.border.block_end == Length::zero() &&
+ block_size == LengthOrAuto::Auto &&
+ min_box_size.block == Length::zero();
+
+ let mut clearance = Length::zero();
+ let old_inline_walls;
+ match sequential_layout_state {
+ None => old_inline_walls = None,
+ Some(ref mut sequential_layout_state) => {
+ sequential_layout_state.adjoin_assign(&CollapsedMargin::new(margin.block_start));
+ if !start_margin_can_collapse_with_children {
+ sequential_layout_state.collapse_margins();
+ }
+
+ // Introduce clearance if necessary.
+ let clear_side = ClearSide::from_style(style);
+ clearance = sequential_layout_state.calculate_clearance(clear_side);
+
+ // NB: This will be a no-op if we're collapsing margins with our children since that
+ // can only happen if we have no block-start padding and border.
+ sequential_layout_state.advance_block_position(
+ pbm.padding.block_start + pbm.border.block_start + clearance,
+ );
+
+ // Store our old inline walls so we can reset them later.
+ old_inline_walls = Some(sequential_layout_state.floats.walls);
+ sequential_layout_state.floats.walls.left +=
+ pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start;
+ sequential_layout_state.floats.walls.right =
+ sequential_layout_state.floats.walls.left + inline_size;
+ },
+ };
+
let mut block_margins_collapsed_with_children = CollapsedBlockMargins::from_margin(&margin);
let fragments;
let mut content_block_size;
match block_level_kind {
NonReplacedContents::SameFormattingContextBlock(contents) => {
- let start_margin_can_collapse_with_children = pbm.padding.block_start == Length::zero() &&
- pbm.border.block_start == Length::zero();
- let end_margin_can_collapse_with_children = pbm.padding.block_end == Length::zero() &&
- pbm.border.block_end == Length::zero() &&
- block_size == LengthOrAuto::Auto &&
- min_box_size.block == Length::zero();
-
let flow_layout = contents.layout(
layout_context,
positioning_context,
&containing_block_for_children,
tree_rank,
- float_context,
+ sequential_layout_state.as_mut().map(|x| &mut **x),
CollapsibleWithParentStartMargin(start_margin_can_collapse_with_children),
);
+
fragments = flow_layout.fragments;
content_block_size = flow_layout.content_block_size;
- let mut collapsible_margins_in_children = flow_layout.collapsible_margins_in_children;
+ // Update margins.
+ let mut collapsible_margins_in_children = flow_layout.collapsible_margins_in_children;
if start_margin_can_collapse_with_children {
block_margins_collapsed_with_children
.start
@@ -546,12 +573,31 @@ fn layout_in_flow_non_replaced_block_level(
content_block_size = independent_layout.content_block_size;
},
};
+
let block_size = block_size.auto_is(|| {
content_block_size.clamp_between_extremums(min_box_size.block, max_box_size.block)
});
+
+ if let Some(ref mut sequential_layout_state) = sequential_layout_state {
+ // Now that we're done laying out our children, we can restore the old inline walls.
+ sequential_layout_state.floats.walls = old_inline_walls.unwrap();
+
+ // Account for padding and border. We also might have to readjust the
+ // `bfc_relative_block_position` if it was different from the content size (i.e. was
+ // non-`auto` and/or was affected by min/max block size).
+ sequential_layout_state.advance_block_position(
+ (block_size - content_block_size) + pbm.padding.block_end + pbm.border.block_end,
+ );
+
+ if !end_margin_can_collapse_with_children {
+ sequential_layout_state.collapse_margins();
+ }
+ sequential_layout_state.adjoin_assign(&CollapsedMargin::new(margin.block_end));
+ }
+
let content_rect = Rect {
start_corner: Vec2 {
- block: pbm.padding.block_start + pbm.border.block_start,
+ block: pbm.padding.block_start + pbm.border.block_start + clearance,
inline: pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start,
},
size: Vec2 {
@@ -559,6 +605,7 @@ fn layout_in_flow_non_replaced_block_level(
inline: inline_size,
},
};
+
BoxFragment::new(
base_fragment_info,
style.clone(),
@@ -567,6 +614,7 @@ fn layout_in_flow_non_replaced_block_level(
pbm.padding,
pbm.border,
margin,
+ clearance,
block_margins_collapsed_with_children,
)
}
@@ -579,6 +627,7 @@ fn layout_in_flow_replaced_block_level<'a>(
base_fragment_info: BaseFragmentInfo,
style: &Arc<ComputedValues>,
replaced: &ReplacedContent,
+ mut sequential_layout_state: Option<&mut SequentialLayoutState>,
) -> BoxFragment {
let pbm = style.padding_border_margin(containing_block);
let size = replaced.used_size_as_if_inline_element(containing_block, style, None, &pbm);
@@ -592,14 +641,24 @@ fn layout_in_flow_replaced_block_level<'a>(
block_end: pbm.margin.block_end.auto_is(Length::zero),
};
let fragments = replaced.make_fragments(style, size.clone());
+
+ let mut clearance = Length::zero();
+ if let Some(ref mut sequential_layout_state) = sequential_layout_state {
+ sequential_layout_state.collapse_margins();
+ clearance = sequential_layout_state.calculate_clearance(ClearSide::from_style(style));
+ sequential_layout_state
+ .advance_block_position(pbm.border.block_sum() + pbm.padding.block_sum() + size.block);
+ };
+
let content_rect = Rect {
start_corner: Vec2 {
- block: pbm.padding.block_start + pbm.border.block_start,
+ block: pbm.padding.block_start + pbm.border.block_start + clearance,
inline: pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start,
},
size,
};
let block_margins_collapsed_with_children = CollapsedBlockMargins::from_margin(&margin);
+
BoxFragment::new(
base_fragment_info,
style.clone(),
@@ -608,6 +667,7 @@ fn layout_in_flow_replaced_block_level<'a>(
pbm.padding,
pbm.border,
margin,
+ Length::zero(),
block_margins_collapsed_with_children,
)
}
@@ -624,3 +684,81 @@ fn solve_inline_margins_for_in_flow_block_level(
(LengthOrAuto::LengthPercentage(start), _) => (start, available - start),
}
}
+
+// State that we maintain when placing blocks.
+//
+// In parallel mode, this placement is done after all child blocks are laid out. In sequential
+// mode, this is done right after each block is laid out.
+pub(crate) struct PlacementState {
+ next_in_flow_margin_collapses_with_parent_start_margin: bool,
+ start_margin: CollapsedMargin,
+ current_margin: CollapsedMargin,
+ current_block_direction_position: Length,
+}
+
+impl PlacementState {
+ fn new(
+ collapsible_with_parent_start_margin: CollapsibleWithParentStartMargin,
+ ) -> PlacementState {
+ PlacementState {
+ next_in_flow_margin_collapses_with_parent_start_margin:
+ collapsible_with_parent_start_margin.0,
+ start_margin: CollapsedMargin::zero(),
+ current_margin: CollapsedMargin::zero(),
+ current_block_direction_position: Length::zero(),
+ }
+ }
+
+ fn place_fragment(&mut self, fragment: &mut Fragment) {
+ match fragment {
+ Fragment::Box(fragment) => {
+ let fragment_block_margins = &fragment.block_margins_collapsed_with_children;
+ let fragment_block_size = fragment.clearance +
+ fragment.padding.block_sum() +
+ fragment.border.block_sum() +
+ fragment.content_rect.size.block;
+
+ if self.next_in_flow_margin_collapses_with_parent_start_margin {
+ debug_assert_eq!(self.current_margin.solve(), Length::zero());
+ self.start_margin
+ .adjoin_assign(&fragment_block_margins.start);
+ if fragment_block_margins.collapsed_through {
+ self.start_margin.adjoin_assign(&fragment_block_margins.end);
+ return;
+ }
+ self.next_in_flow_margin_collapses_with_parent_start_margin = false;
+ } else {
+ self.current_margin
+ .adjoin_assign(&fragment_block_margins.start);
+ }
+ fragment.content_rect.start_corner.block +=
+ self.current_margin.solve() + self.current_block_direction_position;
+ if fragment_block_margins.collapsed_through {
+ self.current_margin
+ .adjoin_assign(&fragment_block_margins.end);
+ return;
+ }
+ self.current_block_direction_position +=
+ self.current_margin.solve() + fragment_block_size;
+ self.current_margin = fragment_block_margins.end;
+ },
+ Fragment::AbsoluteOrFixedPositioned(fragment) => {
+ let offset = Vec2 {
+ block: self.current_margin.solve() + self.current_block_direction_position,
+ inline: Length::new(0.),
+ };
+ fragment.borrow_mut().adjust_offsets(offset);
+ },
+ Fragment::Anonymous(_) | Fragment::Float => {},
+ _ => unreachable!(),
+ }
+ }
+
+ fn collapsible_margins_in_children(&self) -> CollapsedBlockMargins {
+ CollapsedBlockMargins {
+ collapsed_through: self.next_in_flow_margin_collapses_with_parent_start_margin,
+ start: self.start_margin,
+ end: self.current_margin,
+ }
+ }
+}
diff --git a/components/layout_2020/flow/root.rs b/components/layout_2020/flow/root.rs
index 5006b65a48b..446fe002bc4 100644
--- a/components/layout_2020/flow/root.rs
+++ b/components/layout_2020/flow/root.rs
@@ -446,6 +446,8 @@ impl FragmentTree {
Fragment::Text(fragment) => fragment
.rect
.to_physical(fragment.parent_style.writing_mode, &containing_block),
+ Fragment::HoistedFloat(_) |
+ Fragment::Float |
Fragment::AbsoluteOrFixedPositioned(_) |
Fragment::Image(_) |
Fragment::IFrame(_) |
@@ -526,6 +528,8 @@ impl FragmentTree {
Fragment::AbsoluteOrFixedPositioned(_) |
Fragment::Image(_) |
Fragment::IFrame(_) |
+ Fragment::Float |
+ Fragment::HoistedFloat(_) |
Fragment::Anonymous(_) => return None,
};
None::<()>
diff --git a/components/layout_2020/fragments.rs b/components/layout_2020/fragments.rs
index 4dbacf10182..f557d16db7e 100644
--- a/components/layout_2020/fragments.rs
+++ b/components/layout_2020/fragments.rs
@@ -26,6 +26,11 @@ use webrender_api::{FontInstanceKey, ImageKey};
#[derive(Serialize)]
pub(crate) enum Fragment {
Box(BoxFragment),
+ // The original document position of a float in the document tree.
+ Float,
+ // A float hoisted up from its original position (where a placeholder `Fragment::Float` is) to
+ // its containing block.
+ HoistedFloat(HoistedFloatFragment),
Anonymous(AnonymousFragment),
/// Absolute and fixed position fragments are hoisted up so that they
/// are children of the BoxFragment that establishes their containing
@@ -40,6 +45,13 @@ pub(crate) enum Fragment {
IFrame(IFrameFragment),
}
+// A float hoisted up from its original position (where a placeholder `Fragment::Float` is) to its
+// containing block.
+#[derive(Serialize)]
+pub(crate) struct HoistedFloatFragment {
+ pub fragment: ArcRefCell<Fragment>,
+}
+
#[derive(Serialize)]
pub(crate) struct BoxFragment {
pub base: BaseFragment,
@@ -57,6 +69,8 @@ pub(crate) struct BoxFragment {
pub border: Sides<Length>,
pub margin: Sides<Length>,
+ pub clearance: Length,
+
pub block_margins_collapsed_with_children: CollapsedBlockMargins,
/// The scrollable overflow of this box fragment.
@@ -67,13 +81,18 @@ pub(crate) struct BoxFragment {
}
#[derive(Serialize)]
+pub(crate) struct FloatFragment {
+ pub box_fragment: BoxFragment,
+}
+
+#[derive(Serialize)]
pub(crate) struct CollapsedBlockMargins {
pub collapsed_through: bool,
pub start: CollapsedMargin,
pub end: CollapsedMargin,
}
-#[derive(Clone, Copy, Serialize)]
+#[derive(Clone, Copy, Debug, Serialize)]
pub(crate) struct CollapsedMargin {
max_positive: Length,
min_negative: Length,
@@ -152,6 +171,8 @@ impl Fragment {
pub fn offset_inline(&mut self, offset: &Length) {
let position = match self {
Fragment::Box(f) => &mut f.content_rect.start_corner,
+ Fragment::HoistedFloat(_) |
+ Fragment::Float |
Fragment::AbsoluteOrFixedPositioned(_) => return,
Fragment::Anonymous(f) => &mut f.rect.start_corner,
Fragment::Text(f) => &mut f.rect.start_corner,
@@ -166,10 +187,12 @@ impl Fragment {
Some(match self {
Fragment::Box(fragment) => &fragment.base,
Fragment::Text(fragment) => &fragment.base,
+ Fragment::Float => return None,
Fragment::AbsoluteOrFixedPositioned(_) => return None,
Fragment::Anonymous(fragment) => &fragment.base,
Fragment::Image(fragment) => &fragment.base,
Fragment::IFrame(fragment) => &fragment.base,
+ Fragment::HoistedFloat(_) => return None,
})
}
@@ -180,6 +203,8 @@ impl Fragment {
pub fn print(&self, tree: &mut PrintTree) {
match self {
Fragment::Box(fragment) => fragment.print(tree),
+ Fragment::HoistedFloat(fragment) => fragment.print(tree),
+ Fragment::Float => tree.add_item(format!("Float")),
Fragment::AbsoluteOrFixedPositioned(_) => {
tree.add_item("AbsoluteOrFixedPositioned".to_string());
},
@@ -196,7 +221,10 @@ impl Fragment {
) -> PhysicalRect<Length> {
match self {
Fragment::Box(fragment) => fragment.scrollable_overflow_for_parent(&containing_block),
- Fragment::AbsoluteOrFixedPositioned(_) => PhysicalRect::zero(),
+ Fragment::HoistedFloat(fragment) => {
+ (*fragment.fragment.borrow()).scrollable_overflow(&containing_block)
+ },
+ Fragment::Float | Fragment::AbsoluteOrFixedPositioned(_) => PhysicalRect::zero(),
Fragment::Anonymous(fragment) => fragment.scrollable_overflow.clone(),
Fragment::Text(fragment) => fragment
.rect
@@ -266,17 +294,16 @@ impl Fragment {
}
}
-impl AnonymousFragment {
- pub fn no_op(mode: WritingMode) -> Self {
- Self {
- base: BaseFragment::anonymous(),
- children: vec![],
- rect: Rect::zero(),
- mode,
- scrollable_overflow: PhysicalRect::zero(),
- }
+impl HoistedFloatFragment {
+ #[allow(dead_code)]
+ pub fn print(&self, tree: &mut PrintTree) {
+ tree.new_level(format!("HoistedFloatFragment"));
+ self.fragment.borrow().print(tree);
+ tree.end_level();
}
+}
+impl AnonymousFragment {
pub fn new(rect: Rect<Length>, children: Vec<Fragment>, mode: WritingMode) -> Self {
// FIXME(mrobinson, bug 25564): We should be using the containing block
// here to properly convert scrollable overflow to physical geometry.
@@ -325,6 +352,7 @@ impl BoxFragment {
padding: Sides<Length>,
border: Sides<Length>,
margin: Sides<Length>,
+ clearance: Length,
block_margins_collapsed_with_children: CollapsedBlockMargins,
) -> BoxFragment {
let position = style.get_box().position;
@@ -344,6 +372,7 @@ impl BoxFragment {
padding,
border,
margin,
+ clearance,
block_margins_collapsed_with_children,
PhysicalSize::new(width_overconstrained, height_overconstrained),
)
@@ -357,6 +386,7 @@ impl BoxFragment {
padding: Sides<Length>,
border: Sides<Length>,
margin: Sides<Length>,
+ clearance: Length,
block_margins_collapsed_with_children: CollapsedBlockMargins,
overconstrained: PhysicalSize<bool>,
) -> BoxFragment {
@@ -379,6 +409,7 @@ impl BoxFragment {
padding,
border,
margin,
+ clearance,
block_margins_collapsed_with_children,
scrollable_overflow_from_children,
overconstrained,
diff --git a/components/layout_2020/geom.rs b/components/layout_2020/geom.rs
index 7d687069d49..768f7aaf80d 100644
--- a/components/layout_2020/geom.rs
+++ b/components/layout_2020/geom.rs
@@ -251,6 +251,16 @@ impl<T> flow_relative::Sides<T> {
self.block_start + self.block_end
}
+ pub fn sum(&self) -> flow_relative::Vec2<T::Output>
+ where
+ T: Add + Copy,
+ {
+ flow_relative::Vec2 {
+ inline: self.inline_sum(),
+ block: self.block_sum(),
+ }
+ }
+
pub fn to_physical(&self, mode: WritingMode) -> PhysicalSides<T>
where
T: Clone,
@@ -290,6 +300,18 @@ impl<T> flow_relative::Sides<T> {
}
}
+impl<T> flow_relative::Sides<T>
+where
+ T: Copy,
+{
+ pub fn start_offset(&self) -> flow_relative::Vec2<T> {
+ flow_relative::Vec2 {
+ inline: self.inline_start,
+ block: self.block_start,
+ }
+ }
+}
+
impl flow_relative::Sides<&'_ LengthPercentage> {
pub fn percentages_relative_to(&self, basis: Length) -> flow_relative::Sides<Length> {
self.map(|s| s.percentage_relative_to(basis))
diff --git a/components/layout_2020/positioned.rs b/components/layout_2020/positioned.rs
index 727fa618292..2ac43c95057 100644
--- a/components/layout_2020/positioned.rs
+++ b/components/layout_2020/positioned.rs
@@ -651,6 +651,7 @@ impl HoistedAbsolutelyPositionedBox {
pbm.padding,
pbm.border,
margin,
+ Length::zero(),
CollapsedBlockMargins::zero(),
physical_overconstrained,
)
@@ -793,7 +794,7 @@ fn adjust_static_positions(
let child_fragment_rect = match &child_fragments[original_tree_rank] {
Fragment::Box(b) => &b.content_rect,
- Fragment::AbsoluteOrFixedPositioned(_) => continue,
+ Fragment::AbsoluteOrFixedPositioned(_) | Fragment::Float => continue,
Fragment::Anonymous(a) => &a.rect,
_ => unreachable!(),
};
diff --git a/components/layout_2020/query.rs b/components/layout_2020/query.rs
index 3fd02a1597c..a0b3ce6a41a 100644
--- a/components/layout_2020/query.rs
+++ b/components/layout_2020/query.rs
@@ -434,6 +434,8 @@ fn process_offset_parent_query_inner(
Fragment::AbsoluteOrFixedPositioned(_) |
Fragment::Image(_) |
Fragment::IFrame(_) |
+ Fragment::Float |
+ Fragment::HoistedFloat(_) |
Fragment::Anonymous(_) => unreachable!(),
};
let border_box = fragment_relative_rect.translate(containing_block.origin.to_vector());
@@ -510,6 +512,8 @@ fn process_offset_parent_query_inner(
Fragment::Text(_) |
Fragment::Image(_) |
Fragment::IFrame(_) |
+ Fragment::Float |
+ Fragment::HoistedFloat(_) |
Fragment::Anonymous(_) => None,
};
@@ -561,6 +565,8 @@ fn process_offset_parent_query_inner(
Fragment::Text(_) |
Fragment::Image(_) |
Fragment::IFrame(_) |
+ Fragment::Float |
+ Fragment::HoistedFloat(_) |
Fragment::Anonymous(_) => None,
}
})
diff --git a/components/layout_2020/tests/floats.rs b/components/layout_2020/tests/floats.rs
index cae402ac316..affc67cdecf 100644
--- a/components/layout_2020/tests/floats.rs
+++ b/components/layout_2020/tests/floats.rs
@@ -9,7 +9,7 @@ extern crate lazy_static;
use euclid::num::Zero;
use layout::flow::float::{ClearSide, FloatBand, FloatBandNode, FloatBandTree, FloatContext};
-use layout::flow::float::{FloatSide, PlacementInfo};
+use layout::flow::float::{FloatSide, InlineWalls, PlacementInfo};
use layout::geom::flow_relative::{Rect, Vec2};
use quickcheck::{Arbitrary, Gen};
use std::f32;
@@ -57,9 +57,7 @@ impl<'a> Drop for PanicMsgSuppressor<'a> {
struct FloatBandWrapper(FloatBand);
impl Arbitrary for FloatBandWrapper {
- fn arbitrary<G>(generator: &mut G) -> FloatBandWrapper
- where
- G: Gen,
+ fn arbitrary(generator: &mut Gen) -> FloatBandWrapper
{
let top: u32 = Arbitrary::arbitrary(generator);
let left: Option<u32> = Arbitrary::arbitrary(generator);
@@ -81,9 +79,7 @@ struct FloatRangeInput {
}
impl Arbitrary for FloatRangeInput {
- fn arbitrary<G>(generator: &mut G) -> FloatRangeInput
- where
- G: Gen,
+ fn arbitrary(generator: &mut Gen) -> FloatRangeInput
{
let start_index: u32 = Arbitrary::arbitrary(generator);
let band_count: u32 = Arbitrary::arbitrary(generator);
@@ -341,19 +337,20 @@ struct FloatInput {
// The float may be placed no higher than this line. This simulates the effect of line boxes
// per CSS 2.1 § 9.5.1 rule 6.
ceiling: u32,
+ /// Distances from the logical left side of the block formatting context to the logical sides
+ /// of the current containing block.
+ walls: InlineWalls,
}
impl Arbitrary for FloatInput {
- fn arbitrary<G>(generator: &mut G) -> FloatInput
- where
- G: Gen,
+ fn arbitrary(generator: &mut Gen) -> FloatInput
{
let width: u32 = Arbitrary::arbitrary(generator);
let height: u32 = Arbitrary::arbitrary(generator);
let is_left: bool = Arbitrary::arbitrary(generator);
let ceiling: u32 = Arbitrary::arbitrary(generator);
- let left_wall: u32 = Arbitrary::arbitrary(generator);
- let right_wall: u32 = Arbitrary::arbitrary(generator);
+ let left: u32 = Arbitrary::arbitrary(generator);
+ let right: u32 = Arbitrary::arbitrary(generator);
let clear: u8 = Arbitrary::arbitrary(generator);
FloatInput {
info: PlacementInfo {
@@ -367,10 +364,12 @@ impl Arbitrary for FloatInput {
FloatSide::Right
},
clear: new_clear_side(clear),
- left_wall: Length::new(left_wall as f32),
- right_wall: Length::new(right_wall as f32),
},
ceiling,
+ walls: InlineWalls {
+ left: Length::new(left as f32),
+ right: Length::new(right as f32),
+ },
}
}
@@ -389,12 +388,12 @@ impl Arbitrary for FloatInput {
this.info.clear = new_clear_side(clear_side);
shrunk = true;
}
- if let Some(left_wall) = self.info.left_wall.px().shrink().next() {
- this.info.left_wall = Length::new(left_wall);
+ if let Some(left) = self.walls.left.px().shrink().next() {
+ this.walls.left = Length::new(left);
shrunk = true;
}
- if let Some(right_wall) = self.info.right_wall.px().shrink().next() {
- this.info.right_wall = Length::new(right_wall);
+ if let Some(right) = self.walls.right.px().shrink().next() {
+ this.walls.right = Length::new(right);
shrunk = true;
}
if let Some(ceiling) = self.ceiling.shrink().next() {
@@ -430,6 +429,7 @@ struct PlacedFloat {
origin: Vec2<Length>,
info: PlacementInfo,
ceiling: Length,
+ walls: InlineWalls,
}
impl Drop for FloatPlacement {
@@ -442,8 +442,12 @@ impl Drop for FloatPlacement {
eprintln!("Failing float placement:");
for placed_float in &self.placed_floats {
eprintln!(
- " * {:?} @ {:?}, {:?}",
- placed_float.info, placed_float.origin, placed_float.ceiling
+ " * {:?} @ {:?}, T {:?} L {:?} R {:?}",
+ placed_float.info,
+ placed_float.origin,
+ placed_float.ceiling,
+ placed_float.walls.left,
+ placed_float.walls.right,
);
}
eprintln!("Bands:\n{:?}\n", self.float_context.bands);
@@ -466,10 +470,12 @@ impl FloatPlacement {
for float in floats {
let ceiling = Length::new(float.ceiling as f32);
float_context.lower_ceiling(ceiling);
+ float_context.walls = float.walls;
placed_floats.push(PlacedFloat {
origin: float_context.add_float(&float.info),
info: float.info,
ceiling,
+ walls: float.walls,
})
}
FloatPlacement {
@@ -488,9 +494,9 @@ impl FloatPlacement {
fn check_floats_rule_1(placement: &FloatPlacement) {
for placed_float in &placement.placed_floats {
match placed_float.info.side {
- FloatSide::Left => assert!(placed_float.origin.inline >= placed_float.info.left_wall),
+ FloatSide::Left => assert!(placed_float.origin.inline >= placed_float.walls.left),
FloatSide::Right => {
- assert!(placed_float.rect().max_inline_position() <= placed_float.info.right_wall)
+ assert!(placed_float.rect().max_inline_position() <= placed_float.walls.right)
},
}
}
@@ -596,12 +602,12 @@ fn check_floats_rule_7(placement: &FloatPlacement) {
// Only consider floats that stick out.
match placed_float.info.side {
FloatSide::Left => {
- if placed_float.rect().max_inline_position() <= placed_float.info.right_wall {
+ if placed_float.rect().max_inline_position() <= placed_float.walls.right {
continue;
}
},
FloatSide::Right => {
- if placed_float.origin.inline >= placed_float.info.left_wall {
+ if placed_float.origin.inline >= placed_float.walls.left {
continue;
}
},
diff --git a/components/style/properties/longhands/box.mako.rs b/components/style/properties/longhands/box.mako.rs
index 62c3da725f5..3c3532bea7a 100644
--- a/components/style/properties/longhands/box.mako.rs
+++ b/components/style/properties/longhands/box.mako.rs
@@ -66,8 +66,8 @@ ${helpers.predefined_type(
"Float",
"computed::Float::None",
engines="gecko servo-2013 servo-2020",
- servo_2020_pref="layout.2020.unimplemented",
initial_specified_value="specified::Float::None",
+ servo_2020_pref="layout.floats.enabled",
spec="https://drafts.csswg.org/css-box/#propdef-float",
animation_value_type="discrete",
servo_restyle_damage="rebuild_and_reflow",
@@ -78,7 +78,8 @@ ${helpers.predefined_type(
"clear",
"Clear",
"computed::Clear::None",
- engines="gecko servo-2013",
+ engines="gecko servo-2013 servo-2020",
+ servo_2020_pref="layout.floats.enabled",
animation_value_type="discrete",
gecko_ffi_name="mBreakType",
spec="https://drafts.csswg.org/css-box/#propdef-clear",
diff --git a/components/style/values/computed/length.rs b/components/style/values/computed/length.rs
index 02b42b48241..f455da5f676 100644
--- a/components/style/values/computed/length.rs
+++ b/components/style/values/computed/length.rs
@@ -18,7 +18,7 @@ use crate::values::{specified, CSSFloat};
use crate::Zero;
use app_units::Au;
use std::fmt::{self, Write};
-use std::ops::{Add, AddAssign, Div, Mul, MulAssign, Neg, Sub};
+use std::ops::{Add, AddAssign, Div, Mul, MulAssign, Neg, Sub, SubAssign};
use style_traits::{CSSPixel, CssWriter, ToCss};
pub use super::image::Image;
@@ -399,6 +399,13 @@ impl Sub for CSSPixelLength {
}
}
+impl SubAssign for CSSPixelLength {
+ #[inline]
+ fn sub_assign(&mut self, other: Self) {
+ self.0 -= other.0;
+ }
+}
+
impl From<CSSPixelLength> for Au {
#[inline]
fn from(len: CSSPixelLength) -> Self {
diff --git a/resources/prefs.json b/resources/prefs.json
index f093171c6ee..1ffe6001776 100644
--- a/resources/prefs.json
+++ b/resources/prefs.json
@@ -100,6 +100,7 @@
"layout.animations.test.enabled": false,
"layout.columns.enabled": false,
"layout.flexbox.enabled": false,
+ "layout.floats.enabled": false,
"layout.threads": 3,
"layout.viewport.enabled": false,
"layout.writing-mode.enabled": false,
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/__dir__.ini b/tests/wpt/metadata-layout-2020/css/CSS2/__dir__.ini
new file mode 100644
index 00000000000..43a774a6216
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/__dir__.ini
@@ -0,0 +1 @@
+prefs: ["layout.floats.enabled:true"]
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-fit-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-fit-006.xht.ini
deleted file mode 100644
index a306acbd9b6..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-fit-006.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[c414-flt-fit-006.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-wrap-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-wrap-001.xht.ini
deleted file mode 100644
index b07643272b6..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-wrap-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[c414-flt-wrap-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/css1/c5525-fltwidth-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/css1/c5525-fltwidth-001.xht.ini
new file mode 100644
index 00000000000..87f64e42a64
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/css1/c5525-fltwidth-001.xht.ini
@@ -0,0 +1,2 @@
+[c5525-fltwidth-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/adjacent-floats-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/adjacent-floats-001.xht.ini
deleted file mode 100644
index 25e42ff4489..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/adjacent-floats-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[adjacent-floats-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-002.xht.ini
deleted file mode 100644
index 263945fcd72..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-003.xht.ini
deleted file mode 100644
index c9d70d54fc2..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-003.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-003.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-applies-to-000.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-applies-to-000.xht.ini
deleted file mode 100644
index 178da45626e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-applies-to-000.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-applies-to-000.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-applies-to-009.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-applies-to-009.xht.ini
deleted file mode 100644
index 7ea0dbf7cb3..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-applies-to-009.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-applies-to-009.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-001.xht.ini
deleted file mode 100644
index 0e8e0e0ee53..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-clearance-calculation-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-002.xht.ini
deleted file mode 100644
index e5285972074..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-clearance-calculation-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-004.xht.ini
deleted file mode 100644
index 6e5799fc585..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-004.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-clearance-calculation-004.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-005.xht.ini
deleted file mode 100644
index 7be06937891..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-005.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-clearance-calculation-005.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-default-inheritance-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-default-inheritance-001.xht.ini
deleted file mode 100644
index e6429447b76..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-default-inheritance-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-default-inheritance-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-001.xht.ini
deleted file mode 100644
index 129cffa434c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-float-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-002.xht.ini
deleted file mode 100644
index c68786b2faf..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-float-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-004.xht.ini
deleted file mode 100644
index 827fb8b043a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-004.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-float-004.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-005.xht.ini
deleted file mode 100644
index 835feca1dca..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-005.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-float-005.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-006.xht.ini
deleted file mode 100644
index 27f26309c4d..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-006.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-float-006.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-007.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-007.xht.ini
deleted file mode 100644
index 60cb4e21a6f..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-007.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-float-007.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-008.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-008.xht.ini
deleted file mode 100644
index ae6f85d2fe8..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-008.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-float-008.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-009.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-009.xht.ini
deleted file mode 100644
index 89180886c24..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-float-009.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-float-009.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-initial-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-initial-001.xht.ini
deleted file mode 100644
index 9bfe5f3baef..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-initial-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-initial-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-no-interpolation.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-no-interpolation.html.ini
index 63d771b53d7..d1834521a82 100644
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-no-interpolation.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-no-interpolation.html.ini
@@ -1,25 +1,4 @@
[clear-no-interpolation.html]
- [CSS Transitions: property <clear> from [initial\] to [both\] at (-0.3) should be [initial\]]
- expected: FAIL
-
- [CSS Transitions: property <clear> from [initial\] to [both\] at (0) should be [initial\]]
- expected: FAIL
-
- [CSS Transitions: property <clear> from [initial\] to [both\] at (0.3) should be [initial\]]
- expected: FAIL
-
- [CSS Transitions: property <clear> from [initial\] to [both\] at (0.5) should be [both\]]
- expected: FAIL
-
- [CSS Transitions: property <clear> from [initial\] to [both\] at (0.6) should be [both\]]
- expected: FAIL
-
- [CSS Transitions: property <clear> from [initial\] to [both\] at (1) should be [both\]]
- expected: FAIL
-
- [CSS Transitions: property <clear> from [initial\] to [both\] at (1.5) should be [both\]]
- expected: FAIL
-
[CSS Transitions with transition: all: property <clear> from [initial\] to [both\] at (-0.3) should be [both\]]
expected: FAIL
@@ -29,39 +8,6 @@
[CSS Transitions with transition: all: property <clear> from [initial\] to [both\] at (0.3) should be [both\]]
expected: FAIL
- [CSS Transitions with transition: all: property <clear> from [initial\] to [both\] at (0.5) should be [both\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <clear> from [initial\] to [both\] at (0.6) should be [both\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <clear> from [initial\] to [both\] at (1) should be [both\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <clear> from [initial\] to [both\] at (1.5) should be [both\]]
- expected: FAIL
-
- [CSS Animations: property <clear> from [initial\] to [both\] at (-0.3) should be [initial\]]
- expected: FAIL
-
- [CSS Animations: property <clear> from [initial\] to [both\] at (0) should be [initial\]]
- expected: FAIL
-
- [CSS Animations: property <clear> from [initial\] to [both\] at (0.3) should be [initial\]]
- expected: FAIL
-
- [CSS Animations: property <clear> from [initial\] to [both\] at (0.5) should be [both\]]
- expected: FAIL
-
- [CSS Animations: property <clear> from [initial\] to [both\] at (0.6) should be [both\]]
- expected: FAIL
-
- [CSS Animations: property <clear> from [initial\] to [both\] at (1) should be [both\]]
- expected: FAIL
-
- [CSS Animations: property <clear> from [initial\] to [both\] at (1.5) should be [both\]]
- expected: FAIL
-
[Web Animations: property <clear> from [initial\] to [both\] at (-0.3) should be [initial\]]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-on-child-with-margins-2.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-on-child-with-margins-2.html.ini
deleted file mode 100644
index bd217127549..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-on-child-with-margins-2.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-on-child-with-margins-2.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-on-parent-and-child.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-on-parent-and-child.html.ini
deleted file mode 100644
index 415e4eb73a9..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-on-parent-and-child.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-on-parent-and-child.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-with-top-margin-after-cleared-empty-block.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-with-top-margin-after-cleared-empty-block.html.ini
new file mode 100644
index 00000000000..c1602cdda56
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-with-top-margin-after-cleared-empty-block.html.ini
@@ -0,0 +1,2 @@
+[clear-with-top-margin-after-cleared-empty-block.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clearance-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clearance-006.xht.ini
deleted file mode 100644
index 2535d0e4f9c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clearance-006.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clearance-006.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-001a.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-001a.xht.ini
deleted file mode 100644
index f21a6c98c3a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-001a.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-001a.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-004a.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-004a.xht.ini
deleted file mode 100644
index de0c81bbade..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-004a.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-004a.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-005.xht.ini
deleted file mode 100644
index a883902a478..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-005.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-005.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-006.xht.ini
deleted file mode 100644
index 8a0aad4475a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-006.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-006.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-007.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-007.xht.ini
deleted file mode 100644
index 4deb4443f9f..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-007.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-007.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-008.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-008.xht.ini
deleted file mode 100644
index 17db21e0d48..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-008.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-008.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-008a.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-008a.xht.ini
deleted file mode 100644
index ac207eaf406..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-008a.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-008a.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-009.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-009.xht.ini
deleted file mode 100644
index 62561de0f67..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-009.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-009.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-012.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-012.xht.ini
deleted file mode 100644
index 273de32776e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-012.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-012.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-015.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-015.xht.ini
deleted file mode 100644
index 93b007b2849..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-applies-to-015.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-applies-to-015.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-height-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-height-001.xht.ini
deleted file mode 100644
index 86a252266e8..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-height-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-non-replaced-height-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-001.xht.ini
deleted file mode 100644
index 2a53227a5da..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-non-replaced-width-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-003.xht.ini
deleted file mode 100644
index 5aae804edb7..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-003.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-non-replaced-width-003.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-004.xht.ini
deleted file mode 100644
index ba7944663aa..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-004.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-non-replaced-width-004.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-005.xht.ini
deleted file mode 100644
index 7b141145aec..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-non-replaced-width-005.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-non-replaced-width-005.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-height-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-height-001.xht.ini
new file mode 100644
index 00000000000..a04702deda6
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-height-001.xht.ini
@@ -0,0 +1,2 @@
+[float-replaced-height-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-003.xht.ini
deleted file mode 100644
index 00a2629e480..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-003.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-replaced-width-003.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-004.xht.ini
deleted file mode 100644
index 3cd20e6c979..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-004.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-replaced-width-004.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-006.xht.ini
deleted file mode 100644
index f7a953c673c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-006.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-replaced-width-006.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-011.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-011.xht.ini
deleted file mode 100644
index bf876293d1c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-replaced-width-011.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-replaced-width-011.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-001.xht.ini
deleted file mode 100644
index d8f17a07194..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-002.xht.ini
deleted file mode 100644
index 6c0961e88f6..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-003.xht.ini
deleted file mode 100644
index 4ea240af765..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-003.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-003.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-004.xht.ini
deleted file mode 100644
index b1d5785a3d3..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-004.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-004.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-007.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-007.xht.ini
deleted file mode 100644
index c8d3156abcb..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-007.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-007.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-008.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-008.xht.ini
deleted file mode 100644
index b4997d88ab0..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-008.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-008.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-009.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-009.xht.ini
deleted file mode 100644
index cefc075835d..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-009.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-009.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-023.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-023.xht.ini
deleted file mode 100644
index d2970edef2e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-023.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-023.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-024.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-024.xht.ini
deleted file mode 100644
index a35e3d8c551..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-024.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-024.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-025.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-025.xht.ini
deleted file mode 100644
index d31574fc40a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-025.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-025.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-028.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-028.xht.ini
deleted file mode 100644
index de3e7f49b02..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-028.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-028.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-041.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-041.xht.ini
deleted file mode 100644
index b21db4dcaa7..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-041.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-041.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-043.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-043.xht.ini
deleted file mode 100644
index d53c0472c86..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-043.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-043.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-119.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-119.xht.ini
deleted file mode 100644
index 59e958ba061..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-119.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-119.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-120.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-120.xht.ini
deleted file mode 100644
index ffa3032e124..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-120.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-120.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-121.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-121.xht.ini
deleted file mode 100644
index a446bc1d86e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-121.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-121.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-123.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-123.xht.ini
deleted file mode 100644
index d8a11c28602..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-123.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-123.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-132.xht.ini
index 00b1a83c511..981a921e1e3 100644
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/float-005.xht.ini
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-132.xht.ini
@@ -1,2 +1,2 @@
-[float-005.xht]
+[floats-132.xht]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-135.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-135.xht.ini
deleted file mode 100644
index 13e9f34b789..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-135.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-135.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-139.xht.ini
index 363f550fa3b..326d5e0545f 100644
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-004.xht.ini
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-139.xht.ini
@@ -1,2 +1,2 @@
-[clear-004.xht]
+[floats-139.xht]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-141.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-141.xht.ini
deleted file mode 100644
index 0ad11b3c5cb..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-141.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-141.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-144.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-144.xht.ini
deleted file mode 100644
index d41b1141704..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-144.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-144.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-146.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-146.xht.ini
deleted file mode 100644
index 447aaf2c7f1..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-146.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-146.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-147.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-147.xht.ini
deleted file mode 100644
index fc980a2963e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-147.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-147.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-154.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-154.xht.ini
deleted file mode 100644
index b79217cfa4c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-154.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-154.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-bfc-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-bfc-001.xht.ini
new file mode 100644
index 00000000000..fe8adde8fbd
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-bfc-001.xht.ini
@@ -0,0 +1,2 @@
+[floats-bfc-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-002.html.ini
deleted file mode 100644
index e2c2ea977c9..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-002.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-clear-multicol-002.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-003.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-003.html.ini
deleted file mode 100644
index 35dfeadcc27..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-003.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-clear-multicol-003.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-balancing-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-balancing-002.html.ini
deleted file mode 100644
index 2cf5b77669a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-balancing-002.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-clear-multicol-balancing-002.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-balancing-003.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-balancing-003.html.ini
deleted file mode 100644
index f9262541fde..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/floats-clear-multicol-balancing-003.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-clear-multicol-balancing-003.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-018.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-018.xht.ini
new file mode 100644
index 00000000000..27f65ceefa2
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-018.xht.ini
@@ -0,0 +1,2 @@
+[margin-collapse-018.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-023.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-023.xht.ini
deleted file mode 100644
index 7ab6857b82e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-023.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-collapse-023.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-027.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-027.xht.ini
new file mode 100644
index 00000000000..519aa8a80eb
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-027.xht.ini
@@ -0,0 +1,2 @@
+[margin-collapse-027.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-165.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-165.xht.ini
deleted file mode 100644
index 4591f167f7e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-165.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-collapse-165.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-166.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-166.xht.ini
deleted file mode 100644
index 65dcb5d674c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/margin-collapse-166.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-collapse-166.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/no-clearance-due-to-large-margin-after-left-right.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/no-clearance-due-to-large-margin-after-left-right.html.ini
deleted file mode 100644
index d4a609c9975..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/no-clearance-due-to-large-margin-after-left-right.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[no-clearance-due-to-large-margin-after-left-right.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/second-float-inside-empty-cleared-block-after-margin.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/second-float-inside-empty-cleared-block-after-margin.html.ini
deleted file mode 100644
index 6ad7741c4ee..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/second-float-inside-empty-cleared-block-after-margin.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[second-float-inside-empty-cleared-block-after-margin.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/second-float-inside-empty-cleared-block.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/second-float-inside-empty-cleared-block.html.ini
deleted file mode 100644
index 7797a77875a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/second-float-inside-empty-cleared-block.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[second-float-inside-empty-cleared-block.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/computed-float-position-absolute.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/computed-float-position-absolute.html.ini
deleted file mode 100644
index 89b04db1041..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/computed-float-position-absolute.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[computed-float-position-absolute.html]
- [The computed value of float with absolute positioning when there is no box should be "none"]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-no-interpolation.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-no-interpolation.html.ini
index e22dbec9c1d..d731172896e 100644
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-no-interpolation.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-no-interpolation.html.ini
@@ -1,25 +1,4 @@
[float-no-interpolation.html]
- [CSS Transitions: property <float> from [initial\] to [right\] at (-0.3) should be [initial\]]
- expected: FAIL
-
- [CSS Transitions: property <float> from [initial\] to [right\] at (0) should be [initial\]]
- expected: FAIL
-
- [CSS Transitions: property <float> from [initial\] to [right\] at (0.3) should be [initial\]]
- expected: FAIL
-
- [CSS Transitions: property <float> from [initial\] to [right\] at (0.5) should be [right\]]
- expected: FAIL
-
- [CSS Transitions: property <float> from [initial\] to [right\] at (0.6) should be [right\]]
- expected: FAIL
-
- [CSS Transitions: property <float> from [initial\] to [right\] at (1) should be [right\]]
- expected: FAIL
-
- [CSS Transitions: property <float> from [initial\] to [right\] at (1.5) should be [right\]]
- expected: FAIL
-
[CSS Transitions with transition: all: property <float> from [initial\] to [right\] at (-0.3) should be [right\]]
expected: FAIL
@@ -29,27 +8,6 @@
[CSS Transitions with transition: all: property <float> from [initial\] to [right\] at (0.3) should be [right\]]
expected: FAIL
- [CSS Transitions with transition: all: property <float> from [initial\] to [right\] at (0.5) should be [right\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <float> from [initial\] to [right\] at (0.6) should be [right\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <float> from [initial\] to [right\] at (1) should be [right\]]
- expected: FAIL
-
- [CSS Transitions with transition: all: property <float> from [initial\] to [right\] at (1.5) should be [right\]]
- expected: FAIL
-
- [CSS Animations: property <float> from [initial\] to [right\] at (-0.3) should be [initial\]]
- expected: FAIL
-
- [CSS Animations: property <float> from [initial\] to [right\] at (0) should be [initial\]]
- expected: FAIL
-
- [CSS Animations: property <float> from [initial\] to [right\] at (0.3) should be [initial\]]
- expected: FAIL
-
[CSS Animations: property <float> from [initial\] to [right\] at (0.5) should be [right\]]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-1.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-1.html.ini
deleted file mode 100644
index fb33bc321dd..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-1.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-nowrap-1.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-3-ref.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-3-ref.html.ini
deleted file mode 100644
index 6d647b8e949..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-3-ref.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float-nowrap-3-ref.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-4.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-4.html.ini
new file mode 100644
index 00000000000..5ccf375acb2
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-4.html.ini
@@ -0,0 +1,2 @@
+[float-nowrap-4.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-6.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-6.html.ini
new file mode 100644
index 00000000000..7b863cf49e6
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-nowrap-6.html.ini
@@ -0,0 +1,2 @@
+[float-nowrap-6.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-root.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-root.html.ini
new file mode 100644
index 00000000000..8bb5b681b05
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-root.html.ini
@@ -0,0 +1,2 @@
+[float-root.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-table-align-left-quirk.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-table-align-left-quirk.html.ini
new file mode 100644
index 00000000000..700de2902b4
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-table-align-left-quirk.html.ini
@@ -0,0 +1,2 @@
+[float-table-align-left-quirk.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-under-flatten-under-preserve-3d.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-under-flatten-under-preserve-3d.html.ini
new file mode 100644
index 00000000000..34417d4fee3
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/float-under-flatten-under-preserve-3d.html.ini
@@ -0,0 +1,2 @@
+[float-under-flatten-under-preserve-3d.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-in-table-caption-001.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-in-table-caption-001.html.ini
new file mode 100644
index 00000000000..86715ffc9c2
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-in-table-caption-001.html.ini
@@ -0,0 +1,2 @@
+[floats-in-table-caption-001.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-004.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-004.html.ini
new file mode 100644
index 00000000000..a7de7bbf707
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-004.html.ini
@@ -0,0 +1,2 @@
+[floats-placement-004.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-006.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-006.html.ini
deleted file mode 100644
index a57179657f7..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-006.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-placement-006.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001a.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001a.xht.ini
new file mode 100644
index 00000000000..b0c8a8783e5
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001a.xht.ini
@@ -0,0 +1,2 @@
+[floats-placement-vertical-001a.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001b.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001b.xht.ini
new file mode 100644
index 00000000000..bd706c1a2cb
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001b.xht.ini
@@ -0,0 +1,2 @@
+[floats-placement-vertical-001b.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001c.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001c.xht.ini
new file mode 100644
index 00000000000..ef7c5a18c80
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-001c.xht.ini
@@ -0,0 +1,2 @@
+[floats-placement-vertical-001c.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-003.xht.ini
new file mode 100644
index 00000000000..6b7cb570a8a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-vertical-003.xht.ini
@@ -0,0 +1,2 @@
+[floats-placement-vertical-003.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-rule3-outside-left-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-rule3-outside-left-001.xht.ini
deleted file mode 100644
index f919d0205c5..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-rule3-outside-left-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-rule3-outside-left-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-rule3-outside-right-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-rule3-outside-right-001.xht.ini
deleted file mode 100644
index fdbae1835ea..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-rule3-outside-right-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-rule3-outside-right-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-outside-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-outside-001.xht.ini
deleted file mode 100644
index 4b1faaafa76..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-outside-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-wrap-bfc-outside-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html.ini
new file mode 100644
index 00000000000..01db57e6795
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html.ini
@@ -0,0 +1,2 @@
+[floats-wrap-bfc-with-margin-004.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-with-margin-005.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-with-margin-005.html.ini
new file mode 100644
index 00000000000..9b3070b4f24
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-wrap-bfc-with-margin-005.html.ini
@@ -0,0 +1,2 @@
+[floats-wrap-bfc-with-margin-005.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-001.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-001.html.ini
new file mode 100644
index 00000000000..0842d0b5727
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-001.html.ini
@@ -0,0 +1,3 @@
+[hit-test-floats-001.html]
+ [hit-test-floats-001]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini
deleted file mode 100644
index 968f62a2553..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[hit-test-floats-002.html]
- [Hit test float]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini
new file mode 100644
index 00000000000..13bd6abf376
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini
@@ -0,0 +1,3 @@
+[hit-test-floats-004.html]
+ [Miss float below something else]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-005.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-005.html.ini
new file mode 100644
index 00000000000..147f062e548
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-005.html.ini
@@ -0,0 +1,3 @@
+[hit-test-floats-005.html]
+ [Miss clipped float]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/negative-margin-float-positioning.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/negative-margin-float-positioning.html.ini
deleted file mode 100644
index fdf1350fbbf..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/negative-margin-float-positioning.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[negative-margin-float-positioning.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/new-fc-separates-from-float.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/new-fc-separates-from-float.html.ini
deleted file mode 100644
index 75f0028b81a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/new-fc-separates-from-float.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[new-fc-separates-from-float.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-space-between-floats-003.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-space-between-floats-003.html.ini
deleted file mode 100644
index a89593d4655..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-space-between-floats-003.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[zero-space-between-floats-003.html]
- [#container 1]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-space-between-floats-004.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-space-between-floats-004.html.ini
deleted file mode 100644
index 94dca9dcbce..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-space-between-floats-004.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[zero-space-between-floats-004.html]
- [#container 1]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-width-floats.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-width-floats.html.ini
deleted file mode 100644
index e20b1a193ff..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/zero-width-floats.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[zero-width-floats.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/linebox/inline-negative-margin-001.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/linebox/inline-negative-margin-001.html.ini
index b85cf0ffe88..ecd4976bf3a 100644
--- a/tests/wpt/metadata-layout-2020/css/CSS2/linebox/inline-negative-margin-001.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/linebox/inline-negative-margin-001.html.ini
@@ -1,4 +1,16 @@
[inline-negative-margin-001.html]
+ [[data-expected-height\] 3]
+ expected: FAIL
+
+ [[data-expected-height\] 4]
+ expected: FAIL
+
+ [[data-expected-height\] 5]
+ expected: FAIL
+
+ [[data-expected-height\] 6]
+ expected: FAIL
+
[[data-expected-height\] 7]
expected: FAIL
@@ -19,3 +31,18 @@
[[data-expected-height\] 13]
expected: FAIL
+
+ [[data-expected-height\] 9]
+ expected: FAIL
+
+ [[data-expected-height\] 10]
+ expected: FAIL
+
+ [[data-expected-height\] 11]
+ expected: FAIL
+
+ [[data-expected-height\] 12]
+ expected: FAIL
+
+ [[data-expected-height\] 13]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/linebox/line-height-128.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/linebox/line-height-128.xht.ini
deleted file mode 100644
index 29d228868d7..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/linebox/line-height-128.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[line-height-128.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-collapse-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-collapse-006.xht.ini
deleted file mode 100644
index 3706bb99942..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-collapse-006.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-collapse-006.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-collapse-007.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-collapse-007.xht.ini
deleted file mode 100644
index 3422b2ee707..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-collapse-007.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-collapse-007.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-004.xht.ini
deleted file mode 100644
index 7a1e53412a9..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-004.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-004.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-005.xht.ini
deleted file mode 100644
index 8069814c4e3..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-005.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-005.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-006.xht.ini
deleted file mode 100644
index 6df5258dc80..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-006.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-006.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-007.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-007.xht.ini
deleted file mode 100644
index 92df59a061f..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-007.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-007.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-016.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-016.xht.ini
deleted file mode 100644
index 07370bc8140..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-016.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-016.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-017.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-017.xht.ini
deleted file mode 100644
index 379749f53e1..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-017.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-017.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-018.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-018.xht.ini
deleted file mode 100644
index 8f2fed4551a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-018.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-018.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-028.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-028.xht.ini
deleted file mode 100644
index 45dca77c9d1..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-028.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-028.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-029.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-029.xht.ini
deleted file mode 100644
index 2f20b359ea7..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-029.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-029.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-030.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-030.xht.ini
deleted file mode 100644
index 340780bd716..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-030.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-030.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-040.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-040.xht.ini
deleted file mode 100644
index 546e4d196b2..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-040.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-040.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-041.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-041.xht.ini
deleted file mode 100644
index cf179026181..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-041.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-041.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-042.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-042.xht.ini
deleted file mode 100644
index 1a92ab4c601..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-042.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-042.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-052.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-052.xht.ini
deleted file mode 100644
index 8e2d7de69db..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-052.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-052.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-053.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-053.xht.ini
deleted file mode 100644
index f782dac7f59..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-053.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-053.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-054.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-054.xht.ini
deleted file mode 100644
index a5f6b22cbd6..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-054.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-054.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-064.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-064.xht.ini
deleted file mode 100644
index 11fb5cf3d6f..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-064.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-064.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-065.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-065.xht.ini
deleted file mode 100644
index e03ce9bbdfd..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-065.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-065.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-066.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-066.xht.ini
deleted file mode 100644
index 53aae08ae86..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-066.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-066.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-076.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-076.xht.ini
deleted file mode 100644
index 84a97c682f8..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-076.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-076.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-077.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-077.xht.ini
deleted file mode 100644
index b6c3eeed513..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-077.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-077.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-078.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-078.xht.ini
deleted file mode 100644
index e3627308d32..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-078.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-078.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-088.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-088.xht.ini
deleted file mode 100644
index 529bbd42d35..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-088.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-088.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-089.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-089.xht.ini
deleted file mode 100644
index ee7a9e5f88b..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-089.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-089.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-090.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-090.xht.ini
deleted file mode 100644
index 5d344138fef..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-090.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-090.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-109.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-109.xht.ini
deleted file mode 100644
index c814c13837d..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-109.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-109.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-110.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-110.xht.ini
deleted file mode 100644
index 997363df3bc..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-110.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-110.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-111.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-111.xht.ini
deleted file mode 100644
index 4730c3a161c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-111.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-111.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-112.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-112.xht.ini
deleted file mode 100644
index ab10c5fef78..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-112.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-112.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-009.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-009.xht.ini
deleted file mode 100644
index ed820db11cd..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-009.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-applies-to-009.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-012.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-012.xht.ini
deleted file mode 100644
index b98b4c70413..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-012.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-applies-to-012.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-013.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-013.xht.ini
deleted file mode 100644
index 95164bb539e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-013.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-applies-to-013.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-014.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-014.xht.ini
deleted file mode 100644
index a7503323a33..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-014.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-applies-to-014.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-015.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-015.xht.ini
deleted file mode 100644
index d16a888aadc..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/margin-right-applies-to-015.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-right-applies-to-015.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-009.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-009.xht.ini
deleted file mode 100644
index 01df4e1b273..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-009.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[padding-right-applies-to-009.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-013.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-013.xht.ini
deleted file mode 100644
index 6ec4984e6ad..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-013.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[padding-right-applies-to-013.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-014.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-014.xht.ini
deleted file mode 100644
index 5934a3c1d25..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/margin-padding-clear/padding-right-applies-to-014.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[padding-right-applies-to-014.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-context-height-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-context-height-001.xht.ini
new file mode 100644
index 00000000000..6efb0c8c2c6
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-context-height-001.xht.ini
@@ -0,0 +1,2 @@
+[block-formatting-context-height-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-context-height-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-context-height-002.xht.ini
new file mode 100644
index 00000000000..78396ee399c
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-context-height-002.xht.ini
@@ -0,0 +1,2 @@
+[block-formatting-context-height-002.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-contexts-008.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-contexts-008.xht.ini
deleted file mode 100644
index a76ac3c0bff..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-contexts-008.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[block-formatting-contexts-008.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-contexts-016.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-contexts-016.xht.ini
deleted file mode 100644
index 5ec72be121c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-formatting-contexts-016.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[block-formatting-contexts-016.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html.ini
new file mode 100644
index 00000000000..585f7f61434
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html.ini
@@ -0,0 +1,3 @@
+[block-in-inline-hittest-float-001.html]
+ [block-in-inline-hittest-float-001]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-in-inline-margins-004.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-in-inline-margins-004.html.ini
new file mode 100644
index 00000000000..c951562bd42
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-in-inline-margins-004.html.ini
@@ -0,0 +1,2 @@
+[block-in-inline-margins-004.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-non-replaced-height-011.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-non-replaced-height-011.xht.ini
deleted file mode 100644
index 9a6c179052f..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/block-non-replaced-height-011.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[block-non-replaced-height-011.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/margin-collapse-through-percentage-padding.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/margin-collapse-through-percentage-padding.html.ini
deleted file mode 100644
index 5100ee5c5a1..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/margin-collapse-through-percentage-padding.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[margin-collapse-through-percentage-padding.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/max-width-110.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/max-width-110.xht.ini
deleted file mode 100644
index fe45cea6bd3..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/max-width-110.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[max-width-110.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/min-height-106.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/min-height-106.xht.ini
new file mode 100644
index 00000000000..bed0c772d23
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/min-height-106.xht.ini
@@ -0,0 +1,2 @@
+[min-height-106.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/width-non-replaced-inline-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/width-non-replaced-inline-001.xht.ini
new file mode 100644
index 00000000000..4890f7308ad
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/width-non-replaced-inline-001.xht.ini
@@ -0,0 +1,2 @@
+[width-non-replaced-inline-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/abspos-028.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/abspos-028.xht.ini
deleted file mode 100644
index 904d7e5379c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/abspos-028.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[abspos-028.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/line-break-after-leading-float.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/line-break-after-leading-float.html.ini
deleted file mode 100644
index b4455bd8387..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/line-break-after-leading-float.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[line-break-after-leading-float.html]
- [Checks line wrapping after leading floating objects.]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/position-relative-018.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/position-relative-018.xht.ini
deleted file mode 100644
index c6ad434264c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/position-relative-018.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[position-relative-018.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/positioning-float-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/positioning-float-002.xht.ini
deleted file mode 100644
index 1fa701e8c6d..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/positioning-float-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[positioning-float-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/values/units-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/values/units-005.xht.ini
deleted file mode 100644
index d1604bb0585..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/values/units-005.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[units-005.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-003.xht.ini
new file mode 100644
index 00000000000..1eb716de2a9
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-003.xht.ini
@@ -0,0 +1,2 @@
+[stack-floats-003.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-004.xht.ini
new file mode 100644
index 00000000000..0e8029cf3cb
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-004.xht.ini
@@ -0,0 +1,2 @@
+[stack-floats-004.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini b/tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini
index 2f5ce8f80b3..7bd1c2d4164 100644
--- a/tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini
@@ -1,3 +1,2 @@
[element-replacement-on-replaced-element.tentative.html]
- expected:
- if os == "linux": FAIL
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/__dir__.ini b/tests/wpt/mozilla/meta-layout-2020/css/__dir__.ini
new file mode 100644
index 00000000000..43a774a6216
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/__dir__.ini
@@ -0,0 +1 @@
+prefs: ["layout.floats.enabled:true"]
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/abs_float_pref_width.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/abs_float_pref_width.html.ini
deleted file mode 100644
index c6455058c8c..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/css/abs_float_pref_width.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[abs_float_pref_width.html]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/background_position_shorthand.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/background_position_shorthand.html.ini
new file mode 100644
index 00000000000..032c59f959f
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/background_position_shorthand.html.ini
@@ -0,0 +1,2 @@
+[background_position_shorthand.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_a.html.ini
new file mode 100644
index 00000000000..766e4b3cd9d
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_a.html.ini
@@ -0,0 +1,2 @@
+[block_formatting_context_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_cleared_float_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_cleared_float_a.html.ini
new file mode 100644
index 00000000000..6248b681b95
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_cleared_float_a.html.ini
@@ -0,0 +1,2 @@
+[block_formatting_context_cleared_float_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_complex_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_complex_a.html.ini
new file mode 100644
index 00000000000..5498e467c6e
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_complex_a.html.ini
@@ -0,0 +1,2 @@
+[block_formatting_context_complex_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_containing_floats_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_containing_floats_a.html.ini
new file mode 100644
index 00000000000..433da844606
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_containing_floats_a.html.ini
@@ -0,0 +1,2 @@
+[block_formatting_context_containing_floats_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_float_inorder_interaction_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_float_inorder_interaction_a.html.ini
new file mode 100644
index 00000000000..d4170437ae9
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_float_inorder_interaction_a.html.ini
@@ -0,0 +1,2 @@
+[block_formatting_context_float_inorder_interaction_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_float_placement_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_float_placement_a.html.ini
new file mode 100644
index 00000000000..21e5b2e4fb5
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_float_placement_a.html.ini
@@ -0,0 +1,2 @@
+[block_formatting_context_float_placement_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_margin_inout_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_margin_inout_a.html.ini
deleted file mode 100644
index 7bb6c05416f..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_margin_inout_a.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[block_formatting_context_margin_inout_a.html]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_max_width_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_max_width_a.html.ini
deleted file mode 100644
index 72df7976703..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_max_width_a.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[block_formatting_context_max_width_a.html]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_relative_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_relative_a.html.ini
new file mode 100644
index 00000000000..27d6a36d72e
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_relative_a.html.ini
@@ -0,0 +1,2 @@
+[block_formatting_context_relative_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_translation_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_translation_a.html.ini
new file mode 100644
index 00000000000..787730d24d0
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/block_formatting_context_translation_a.html.ini
@@ -0,0 +1,2 @@
+[block_formatting_context_translation_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/box_sizing_sanity_check_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/box_sizing_sanity_check_a.html.ini
new file mode 100644
index 00000000000..4b2eb3c32dc
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/box_sizing_sanity_check_a.html.ini
@@ -0,0 +1,2 @@
+[box_sizing_sanity_check_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/clear_generated_content_table_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/clear_generated_content_table_a.html.ini
new file mode 100644
index 00000000000..c1692bba6b2
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/clear_generated_content_table_a.html.ini
@@ -0,0 +1,2 @@
+[clear_generated_content_table_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/first_child_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/first_child_pseudo_a.html.ini
new file mode 100644
index 00000000000..d3a6e42c59e
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/first_child_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[first_child_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/first_of_type_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/first_of_type_pseudo_a.html.ini
new file mode 100644
index 00000000000..a00dc9daf30
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/first_of_type_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[first_of_type_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/fixed_width_overrides_child_intrinsic_width_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/fixed_width_overrides_child_intrinsic_width_a.html.ini
new file mode 100644
index 00000000000..85e60ef47e5
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/fixed_width_overrides_child_intrinsic_width_a.html.ini
@@ -0,0 +1,2 @@
+[fixed_width_overrides_child_intrinsic_width_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/float-abspos.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/float-abspos.html.ini
deleted file mode 100644
index 6481296787a..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/css/float-abspos.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[float-abspos.html]
- [A positioned element's float value computes to none]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/float_clearance_intrinsic_width_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/float_clearance_intrinsic_width_a.html.ini
new file mode 100644
index 00000000000..f8d91241d5a
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/float_clearance_intrinsic_width_a.html.ini
@@ -0,0 +1,2 @@
+[float_clearance_intrinsic_width_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/float_cleared_with_just_height.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/float_cleared_with_just_height.html.ini
deleted file mode 100644
index f3653948489..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/css/float_cleared_with_just_height.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[float_cleared_with_just_height.html]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/float_intrinsic_height.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/float_intrinsic_height.html.ini
new file mode 100644
index 00000000000..195358c73b4
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/float_intrinsic_height.html.ini
@@ -0,0 +1,2 @@
+[float_intrinsic_height.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/float_relative_to_position.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/float_relative_to_position.html.ini
deleted file mode 100644
index ccb4cd7daaf..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/css/float_relative_to_position.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[float_relative_to_position.html]
- [Tests the relationship between float and position]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/float_under_top_margin_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/float_under_top_margin_a.html.ini
new file mode 100644
index 00000000000..4ff77391b71
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/float_under_top_margin_a.html.ini
@@ -0,0 +1,2 @@
+[float_under_top_margin_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/floated_list_item_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/floated_list_item_a.html.ini
new file mode 100644
index 00000000000..0b72c548d71
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/floated_list_item_a.html.ini
@@ -0,0 +1,2 @@
+[floated_list_item_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/floated_negative_margins_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/floated_negative_margins_a.html.ini
new file mode 100644
index 00000000000..318e3cca6ea
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/floated_negative_margins_a.html.ini
@@ -0,0 +1,2 @@
+[floated_negative_margins_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/floated_table_with_margin_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/floated_table_with_margin_a.html.ini
new file mode 100644
index 00000000000..06ce4557c80
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/floated_table_with_margin_a.html.ini
@@ -0,0 +1,2 @@
+[floated_table_with_margin_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/floats_margin_collapse_with_clearance_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/floats_margin_collapse_with_clearance_a.html.ini
deleted file mode 100644
index ce0ab0b1ec1..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/css/floats_margin_collapse_with_clearance_a.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats_margin_collapse_with_clearance_a.html]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/floats_percentage_width_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/floats_percentage_width_a.html.ini
new file mode 100644
index 00000000000..9822997db62
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/floats_percentage_width_a.html.ini
@@ -0,0 +1,2 @@
+[floats_percentage_width_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/incremental_float_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/incremental_float_a.html.ini
new file mode 100644
index 00000000000..49abdc5cab9
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/incremental_float_a.html.ini
@@ -0,0 +1,2 @@
+[incremental_float_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/input_alignment_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/input_alignment_a.html.ini
deleted file mode 100644
index 0e2cd2e610f..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/css/input_alignment_a.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[input_alignment_a.html]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/intrinsic_border_box.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/intrinsic_border_box.html.ini
new file mode 100644
index 00000000000..fc40b2cc92b
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/intrinsic_border_box.html.ini
@@ -0,0 +1,2 @@
+[intrinsic_border_box.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/last_child_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/last_child_pseudo_a.html.ini
new file mode 100644
index 00000000000..58734a20997
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/last_child_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[last_child_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/last_of_type_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/last_of_type_pseudo_a.html.ini
new file mode 100644
index 00000000000..b96002a4a13
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/last_of_type_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[last_of_type_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/negative_margin_uncle_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/negative_margin_uncle_a.html.ini
new file mode 100644
index 00000000000..2e06085fa09
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/negative_margin_uncle_a.html.ini
@@ -0,0 +1,2 @@
+[negative_margin_uncle_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/nth_child_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/nth_child_pseudo_a.html.ini
new file mode 100644
index 00000000000..1c7622d3563
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/nth_child_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[nth_child_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/nth_last_child_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/nth_last_child_pseudo_a.html.ini
new file mode 100644
index 00000000000..56966cd3d78
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/nth_last_child_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[nth_last_child_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/nth_last_of_type_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/nth_last_of_type_pseudo_a.html.ini
new file mode 100644
index 00000000000..94178c8d4d1
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/nth_last_of_type_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[nth_last_of_type_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/nth_of_type_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/nth_of_type_pseudo_a.html.ini
new file mode 100644
index 00000000000..f8216f754f9
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/nth_of_type_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[nth_of_type_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/only_child_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/only_child_pseudo_a.html.ini
new file mode 100644
index 00000000000..5d9266f67b9
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/only_child_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[only_child_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/only_of_type_pseudo_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/only_of_type_pseudo_a.html.ini
new file mode 100644
index 00000000000..8a6734a8266
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/only_of_type_pseudo_a.html.ini
@@ -0,0 +1,2 @@
+[only_of_type_pseudo_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/percentage_height_float_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/percentage_height_float_a.html.ini
new file mode 100644
index 00000000000..81adaf011d0
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/percentage_height_float_a.html.ini
@@ -0,0 +1,2 @@
+[percentage_height_float_a.html]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/css/table_float_translation_a.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/table_float_translation_a.html.ini
new file mode 100644
index 00000000000..dfe4ec5cf4d
--- /dev/null
+++ b/tests/wpt/mozilla/meta-layout-2020/css/table_float_translation_a.html.ini
@@ -0,0 +1,2 @@
+[table_float_translation_a.html]
+ expected: FAIL