Commit 78c68989 authored by Yoshifumi Inoue's avatar Yoshifumi Inoue Committed by Commit Bot

[EditingNG] Calculate baseline for empty editable

This patch changes |NGBlockLayoutAlgorithm::Layout()| to calculate baseline
offset for empty line then set it |NGPhysicalBoxFragment| to allow flex layout
algorithm to use valid baseline offset, e.g. "align-items: baseline" CSS
property.

This patch also introduces |LayoutBlock::BaselineForEmptyLine()| to share
baseline offset calculation with legacy latyout.

Note: The test[1][2] verify this change.

[1] third_party/blink/web_tests/css3/flexbox/baseline-for-empty-line.html
[2] third_party/blink/web_tests/inline-block/contenteditable-baseline.html

Bug: 707656
Change-Id: I2a19fb3e457925c03b34ee509b80ba15dff523b9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2259675
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Commit-Queue: Koji Ishii <kojii@chromium.org>
Reviewed-by: default avatarKent Tamura <tkent@chromium.org>
Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Auto-Submit: Yoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#781280}
parent ad9b27ef
...@@ -1708,9 +1708,15 @@ LayoutUnit LayoutBlock::EmptyLineBaseline( ...@@ -1708,9 +1708,15 @@ LayoutUnit LayoutBlock::EmptyLineBaseline(
LineDirectionMode line_direction) const { LineDirectionMode line_direction) const {
if (!HasLineIfEmpty()) if (!HasLineIfEmpty())
return LayoutUnit(-1); return LayoutUnit(-1);
const auto baseline_offset = BaselineForEmptyLine(line_direction);
return baseline_offset ? *baseline_offset : LayoutUnit(-1);
}
base::Optional<LayoutUnit> LayoutBlock::BaselineForEmptyLine(
LineDirectionMode line_direction) const {
const SimpleFontData* font_data = FirstLineStyle()->GetFont().PrimaryFont(); const SimpleFontData* font_data = FirstLineStyle()->GetFont().PrimaryFont();
if (!font_data) if (!font_data)
return LayoutUnit(-1); return base::nullopt;
const auto& font_metrics = font_data->GetFontMetrics(); const auto& font_metrics = font_data->GetFontMetrics();
const LayoutUnit line_height = const LayoutUnit line_height =
LineHeight(true, line_direction, kPositionOfInteriorLineBoxes); LineHeight(true, line_direction, kPositionOfInteriorLineBoxes);
......
...@@ -402,6 +402,10 @@ class CORE_EXPORT LayoutBlock : public LayoutBox { ...@@ -402,6 +402,10 @@ class CORE_EXPORT LayoutBlock : public LayoutBox {
MinMaxSizes PreferredLogicalWidths() const override; MinMaxSizes PreferredLogicalWidths() const override;
virtual bool HasLineIfEmpty() const; virtual bool HasLineIfEmpty() const;
// Returns baseline offset if we can get |SimpleFontData| from primary font.
// Or returns no value if we can't get font data.
base::Optional<LayoutUnit> BaselineForEmptyLine(
LineDirectionMode line_direction) const;
protected: protected:
virtual void AdjustInlineDirectionLineBounds( virtual void AdjustInlineDirectionLineBounds(
...@@ -477,6 +481,9 @@ class CORE_EXPORT LayoutBlock : public LayoutBox { ...@@ -477,6 +481,9 @@ class CORE_EXPORT LayoutBlock : public LayoutBox {
hit_test_action == kHitTestChildBlockBackground; hit_test_action == kHitTestChildBlockBackground;
} }
// Returns baseline offset of this block if is empty editable or having
// CSS property "--internal-empty-line-height"fabricated", otherwise
// returns |LayoutUnit(-1)|.
LayoutUnit EmptyLineBaseline(LineDirectionMode line_direction) const; LayoutUnit EmptyLineBaseline(LineDirectionMode line_direction) const;
private: private:
......
...@@ -732,6 +732,15 @@ inline scoped_refptr<const NGLayoutResult> NGBlockLayoutAlgorithm::Layout( ...@@ -732,6 +732,15 @@ inline scoped_refptr<const NGLayoutResult> NGBlockLayoutAlgorithm::Layout(
intrinsic_block_size_ += intrinsic_block_size_ +=
std::max(intrinsic_block_size_, std::max(intrinsic_block_size_,
Node().GetLayoutBox()->LogicalHeightForEmptyLine()); Node().GetLayoutBox()->LogicalHeightForEmptyLine());
// Test [1][2] require baseline offset for empty editable.
// [1] css3/flexbox/baseline-for-empty-line.html
// [2] inline-block/contenteditable-baseline.html
const LayoutBlock* const layout_block =
To<LayoutBlock>(Node().GetLayoutBox());
if (auto baseline_offset = layout_block->BaselineForEmptyLine(
layout_block->IsHorizontalWritingMode() ? kHorizontalLine
: kVerticalLine))
container_builder_.SetBaseline(*baseline_offset);
} }
// Collapse annotation overflow and padding. // Collapse annotation overflow and padding.
......
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