Commit c866b5b0 authored by Kent Tamura's avatar Kent Tamura Committed by Commit Bot

Fieldset NG: Support inline margins for LEGEND

This CL adds legend-align-expected.txt, which introduces two more PASSes
and no new FAILs.

Bug: 875235
Change-Id: Ied5ea8dbe44ebedc4590d6e2f7e337f6dadb144a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2336313
Commit-Queue: Kent Tamura <tkent@chromium.org>
Reviewed-by: default avatarMorten Stenshorne <mstensho@chromium.org>
Cr-Commit-Position: refs/heads/master@{#794832}
parent 852c1e7d
...@@ -19,6 +19,43 @@ ...@@ -19,6 +19,43 @@
namespace blink { namespace blink {
namespace {
enum class LegendBlockAlignment {
kStart,
kCenter,
kEnd,
};
// This function is very similar to BlockAlignment() in ng_length_utils.cc, but
// it supports text-align:left/center/right.
inline LegendBlockAlignment ComputeLegendBlockAlignment(
const ComputedStyle& legend_style,
const ComputedStyle& fieldset_style) {
bool start_auto = legend_style.MarginStartUsing(fieldset_style).IsAuto();
bool end_auto = legend_style.MarginEndUsing(fieldset_style).IsAuto();
if (start_auto || end_auto) {
if (start_auto) {
return end_auto ? LegendBlockAlignment::kCenter
: LegendBlockAlignment::kEnd;
}
return LegendBlockAlignment::kStart;
}
const bool is_ltr = fieldset_style.IsLeftToRightDirection();
switch (legend_style.GetTextAlign()) {
case ETextAlign::kLeft:
return is_ltr ? LegendBlockAlignment::kStart : LegendBlockAlignment::kEnd;
case ETextAlign::kRight:
return is_ltr ? LegendBlockAlignment::kEnd : LegendBlockAlignment::kStart;
case ETextAlign::kCenter:
return LegendBlockAlignment::kCenter;
default:
return LegendBlockAlignment::kStart;
}
}
} // namespace
NGFieldsetLayoutAlgorithm::NGFieldsetLayoutAlgorithm( NGFieldsetLayoutAlgorithm::NGFieldsetLayoutAlgorithm(
const NGLayoutAlgorithmParams& params) const NGLayoutAlgorithmParams& params)
: NGLayoutAlgorithm(params), : NGLayoutAlgorithm(params),
...@@ -329,7 +366,7 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutLegend( ...@@ -329,7 +366,7 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutLegend(
LayoutUnit legend_inline_start = ComputeLegendInlineOffset( LayoutUnit legend_inline_start = ComputeLegendInlineOffset(
legend.Style(), legend.Style(),
NGFragment(writing_mode_, result->PhysicalFragment()).InlineSize(), NGFragment(writing_mode_, result->PhysicalFragment()).InlineSize(),
legend_margins, BorderScrollbarPadding().inline_start, legend_margins, Style(), BorderScrollbarPadding().inline_start,
ChildAvailableSize().inline_size); ChildAvailableSize().inline_size);
// NOTE: For painting purposes, this must be kept in sync with: // NOTE: For painting purposes, this must be kept in sync with:
...@@ -344,22 +381,21 @@ LayoutUnit NGFieldsetLayoutAlgorithm::ComputeLegendInlineOffset( ...@@ -344,22 +381,21 @@ LayoutUnit NGFieldsetLayoutAlgorithm::ComputeLegendInlineOffset(
const ComputedStyle& legend_style, const ComputedStyle& legend_style,
LayoutUnit legend_border_box_inline_size, LayoutUnit legend_border_box_inline_size,
const NGBoxStrut& legend_margins, const NGBoxStrut& legend_margins,
const ComputedStyle& fieldset_style,
LayoutUnit fieldset_border_padding_inline_start, LayoutUnit fieldset_border_padding_inline_start,
LayoutUnit fieldset_content_inline_size) { LayoutUnit fieldset_content_inline_size) {
const ETextAlign align = legend_style.GetTextAlign(); LayoutUnit legend_inline_start =
const ETextAlign align_end = legend_style.IsLeftToRightDirection() fieldset_border_padding_inline_start + legend_margins.inline_start;
? ETextAlign::kRight // The following logic is very similar to ResolveInlineMargins(), but it uses
: ETextAlign::kLeft; // ComputeLegendBlockAlignment().
LayoutUnit legend_inline_start = fieldset_border_padding_inline_start; const LayoutUnit available_space =
if (align == ETextAlign::kCenter) { fieldset_content_inline_size - legend_border_box_inline_size;
legend_inline_start += if (available_space > LayoutUnit()) {
(fieldset_content_inline_size - legend_border_box_inline_size) / 2; auto alignment = ComputeLegendBlockAlignment(legend_style, fieldset_style);
} else if (align == align_end) { if (alignment == LegendBlockAlignment::kCenter)
legend_inline_start += fieldset_content_inline_size - legend_inline_start += available_space / 2;
legend_border_box_inline_size - else if (alignment == LegendBlockAlignment::kEnd)
legend_margins.inline_end; legend_inline_start += available_space - legend_margins.inline_end;
} else {
legend_inline_start += legend_margins.inline_start;
} }
return legend_inline_start; return legend_inline_start;
} }
......
...@@ -31,6 +31,7 @@ class CORE_EXPORT NGFieldsetLayoutAlgorithm ...@@ -31,6 +31,7 @@ class CORE_EXPORT NGFieldsetLayoutAlgorithm
const ComputedStyle& legend_style, const ComputedStyle& legend_style,
LayoutUnit legend_border_box_inline_size, LayoutUnit legend_border_box_inline_size,
const NGBoxStrut& legend_margins, const NGBoxStrut& legend_margins,
const ComputedStyle& fieldset_style,
LayoutUnit fieldset_border_padding_inline_start, LayoutUnit fieldset_border_padding_inline_start,
LayoutUnit fieldset_content_inline_size); LayoutUnit fieldset_content_inline_size);
......
...@@ -86,7 +86,7 @@ void NGFieldsetPainter::PaintFieldsetDecorationBackground( ...@@ -86,7 +86,7 @@ void NGFieldsetPainter::PaintFieldsetDecorationBackground(
NGFieldsetLayoutAlgorithm::ComputeLegendInlineOffset( NGFieldsetLayoutAlgorithm::ComputeLegendInlineOffset(
(*legend)->Style(), (*legend)->Style(),
legend_border_box.size.ConvertToLogical(writing_mode).inline_size, legend_border_box.size.ConvertToLogical(writing_mode).inline_size,
legend_margins, border_padding.inline_start, legend_margins, style, border_padding.inline_start,
fieldset_content_inline_size), fieldset_content_inline_size),
legend_margins.block_start}; legend_margins.block_start};
legend_border_box.offset = offset.ConvertToPhysical( legend_border_box.offset = offset.ConvertToPhysical(
......
...@@ -1307,9 +1307,6 @@ virtual/layout_ng_fragment_traversal/external/wpt/css/CSS2/text/* [ Skip ] ...@@ -1307,9 +1307,6 @@ virtual/layout_ng_fragment_traversal/external/wpt/css/CSS2/text/* [ Skip ]
# Fieldset in NG # Fieldset in NG
# #
crbug.com/875235 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-align.html [ Failure ]
crbug.com/875235 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html [ Failure ]
crbug.com/875235 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-margin-inline.html [ Failure ]
### virtual/layout_ng_fieldset/fast/forms/fieldset/ ### virtual/layout_ng_fieldset/fast/forms/fieldset/
crbug.com/875235 virtual/layout_ng_fieldset/fast/forms/fieldset/legend-small-after-margin-before-border-horizontal-mode.html [ Failure ] crbug.com/875235 virtual/layout_ng_fieldset/fast/forms/fieldset/legend-small-after-margin-before-border-horizontal-mode.html [ Failure ]
......
This is a testharness.js-based test.
PASS div[align=left] legend
PASS div[align=center] legend
PASS div[align=right] legend
PASS div[align=justify] legend
FAIL div[style="text-align: center"] legend assert_equals: expected legend[align=left] expected 24 but got 394
FAIL div[style="text-align: center"][align=center] legend assert_equals: expected legend[align=left] expected 24 but got 394
PASS legend[style="margin: 0 auto"]
PASS legend[style="margin: 0 0 0 auto"]
PASS fieldset[dir=rtl] legend
FAIL fieldset[dir=rtl] legend[style="text-align: left"] assert_equals: expected legend[align=right] expected 764 but got 24
Harness: the test ran to completion.
This is a testharness.js-based test.
PASS div[align=left] legend
PASS div[align=center] legend
PASS div[align=right] legend
PASS div[align=justify] legend
FAIL div[style="text-align: center"] legend assert_equals: expected legend[align=left] expected 24 but got 394
FAIL div[style="text-align: center"][align=center] legend assert_equals: expected legend[align=left] expected 24 but got 394
PASS legend[style="margin: 0 auto"]
PASS legend[style="margin: 0 0 0 auto"]
PASS fieldset[dir=rtl] legend
FAIL fieldset[dir=rtl] legend[style="text-align: left"] assert_equals: expected legend[align=right] expected 764 but got 24
Harness: the test ran to completion.
This is a testharness.js-based test.
PASS div[align=left] legend
PASS div[align=center] legend
PASS div[align=right] legend
PASS div[align=justify] legend
FAIL div[style="text-align: center"] legend assert_equals: expected legend[align=left] expected 24 but got 395
FAIL div[style="text-align: center"][align=center] legend assert_equals: expected legend[align=left] expected 24 but got 395
PASS legend[style="margin: 0 auto"]
PASS legend[style="margin: 0 0 0 auto"]
PASS fieldset[dir=rtl] legend
FAIL fieldset[dir=rtl] legend[style="text-align: left"] assert_equals: expected legend[align=right] expected 765 but got 24
Harness: the test ran to completion.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment