Commit 360dafd7 authored by Oriol Brufau's avatar Oriol Brufau Committed by Commit Bot

[css-pseudo] Add logic into LayoutOutsideListMarker

Outside list are block containers with some special logic. This patch
adds that logic into LayoutOutsideListMarker.

BUG=457718

Change-Id: I209913fd5228eaa69101a405cc8f77077ae6b96c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2252189
Commit-Queue: Oriol Brufau <obrufau@igalia.com>
Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/master@{#785917}
parent cd6b3ed6
...@@ -129,7 +129,7 @@ class CORE_EXPORT LayoutBlock : public LayoutBox { ...@@ -129,7 +129,7 @@ class CORE_EXPORT LayoutBlock : public LayoutBox {
LayoutUnit LineHeight( LayoutUnit LineHeight(
bool first_line, bool first_line,
LineDirectionMode, LineDirectionMode,
LinePositionMode = kPositionOnContainingLine) const final; LinePositionMode = kPositionOnContainingLine) const override;
LayoutUnit BaselinePosition( LayoutUnit BaselinePosition(
FontBaseline, FontBaseline,
bool first_line, bool first_line,
......
...@@ -227,6 +227,8 @@ bool LayoutListItem::PrepareForBlockDirectionAlign( ...@@ -227,6 +227,8 @@ bool LayoutListItem::PrepareForBlockDirectionAlign(
if (marker->IsListMarkerForNormalContent()) if (marker->IsListMarkerForNormalContent())
ToLayoutListMarker(marker)->UpdateMarginsAndContent(); ToLayoutListMarker(marker)->UpdateMarginsAndContent();
else if (marker->IsOutsideListMarkerForCustomContent())
ToLayoutOutsideListMarker(marker)->UpdateMargins();
return true; return true;
} }
return false; return false;
...@@ -299,6 +301,8 @@ bool LayoutListItem::UpdateMarkerLocation() { ...@@ -299,6 +301,8 @@ bool LayoutListItem::UpdateMarkerLocation() {
// block. // block.
if (marker->IsListMarkerForNormalContent()) if (marker->IsListMarkerForNormalContent())
ToLayoutListMarker(marker)->UpdateMarginsAndContent(); ToLayoutListMarker(marker)->UpdateMarginsAndContent();
else if (marker->IsOutsideListMarkerForCustomContent())
ToLayoutOutsideListMarker(marker)->UpdateMargins();
return true; return true;
} }
...@@ -386,8 +390,9 @@ void LayoutListItem::AlignMarkerInBlockDirection() { ...@@ -386,8 +390,9 @@ void LayoutListItem::AlignMarkerInBlockDirection() {
// instead. BaselinePosition is workable when marker is an image. // instead. BaselinePosition is workable when marker is an image.
// However, when marker is text, BaselinePosition contains lineheight // However, when marker is text, BaselinePosition contains lineheight
// information. So use marker_font_metrics.Ascent when marker is text. // information. So use marker_font_metrics.Ascent when marker is text.
bool is_image = marker->IsListMarkerForNormalContent() && bool is_image = marker->IsListMarkerForNormalContent()
ToLayoutListMarker(marker)->IsImage(); ? ToLayoutListMarker(marker)->IsImage()
: ToLayoutOutsideListMarker(marker)->IsMarkerImage();
if (is_image) { if (is_image) {
offset -= marker_inline_box->BaselinePosition(marker_root.BaselineType()); offset -= marker_inline_box->BaselinePosition(marker_root.BaselineType());
} else { } else {
...@@ -451,9 +456,10 @@ void LayoutListItem::UpdateOverflow() { ...@@ -451,9 +456,10 @@ void LayoutListItem::UpdateOverflow() {
// TODO(jchaffraix): Propagating the overflow to the line boxes seems // TODO(jchaffraix): Propagating the overflow to the line boxes seems
// pretty wrong (https://crbug.com/554160). // pretty wrong (https://crbug.com/554160).
// FIXME: Need to account for relative positioning in the layout overflow. // FIXME: Need to account for relative positioning in the layout overflow.
LayoutUnit marker_line_offset = marker->IsListMarkerForNormalContent() LayoutUnit marker_line_offset =
? ToLayoutListMarker(marker)->LineOffset() marker->IsListMarkerForNormalContent()
: LayoutUnit(0); ? ToLayoutListMarker(marker)->LineOffset()
: ToLayoutOutsideListMarker(marker)->ListItemInlineStartOffset();
if (StyleRef().IsLeftToRightDirection()) { if (StyleRef().IsLeftToRightDirection()) {
marker_line_offset = marker_line_offset =
std::min(marker_line_offset, std::min(marker_line_offset,
......
...@@ -11,4 +11,60 @@ LayoutOutsideListMarker::LayoutOutsideListMarker(Element* element) ...@@ -11,4 +11,60 @@ LayoutOutsideListMarker::LayoutOutsideListMarker(Element* element)
LayoutOutsideListMarker::~LayoutOutsideListMarker() = default; LayoutOutsideListMarker::~LayoutOutsideListMarker() = default;
bool LayoutOutsideListMarker::IsMarkerImage() const {
return list_marker_.IsMarkerImage(*this);
}
void LayoutOutsideListMarker::UpdateLayout() {
LayoutBlockFlow::UpdateLayout();
LayoutUnit block_offset = LogicalTop();
const LayoutBlockFlow* list_item = list_marker_.ListItemBlockFlow(*this);
for (LayoutBox* o = ParentBox(); o && o != list_item; o = o->ParentBox()) {
block_offset += o->LogicalTop();
}
if (list_item->StyleRef().IsLeftToRightDirection()) {
list_item_inline_start_offset_ = list_item->LogicalLeftOffsetForLine(
block_offset, kDoNotIndentText, LayoutUnit());
} else {
list_item_inline_start_offset_ = list_item->LogicalRightOffsetForLine(
block_offset, kDoNotIndentText, LayoutUnit());
}
UpdateMargins();
}
void LayoutOutsideListMarker::UpdateMargins() {
LayoutUnit margin_start;
LayoutUnit margin_end;
std::tie(margin_start, margin_end) = ListMarker::InlineMarginsForOutside(
StyleRef(), list_marker_.ListItem(*this)->StyleRef(),
PreferredLogicalWidths().min_size);
SetMarginStart(margin_start);
SetMarginEnd(margin_end);
}
LayoutUnit LayoutOutsideListMarker::LineHeight(
bool first_line,
LineDirectionMode direction,
LinePositionMode line_position_mode) const {
if (line_position_mode == kPositionOfInteriorLineBoxes) {
return list_marker_.ListItemBlockFlow(*this)->LineHeight(
first_line, direction, line_position_mode);
}
return LayoutBlockFlow::LineHeight(first_line, direction, line_position_mode);
}
LayoutUnit LayoutOutsideListMarker::BaselinePosition(
FontBaseline baseline_type,
bool first_line,
LineDirectionMode direction,
LinePositionMode line_position_mode) const {
if (line_position_mode == kPositionOfInteriorLineBoxes) {
return list_marker_.ListItemBlockFlow(*this)->BaselinePosition(
baseline_type, first_line, direction, line_position_mode);
}
return LayoutBlockFlow::BaselinePosition(baseline_type, first_line, direction,
line_position_mode);
}
} // namespace blink } // namespace blink
...@@ -20,6 +20,12 @@ class CORE_EXPORT LayoutOutsideListMarker final : public LayoutBlockFlow { ...@@ -20,6 +20,12 @@ class CORE_EXPORT LayoutOutsideListMarker final : public LayoutBlockFlow {
const char* GetName() const override { return "LayoutOutsideListMarker"; } const char* GetName() const override { return "LayoutOutsideListMarker"; }
bool IsMarkerImage() const;
LayoutUnit ListItemInlineStartOffset() const {
return list_item_inline_start_offset_;
}
void UpdateMargins();
const ListMarker& Marker() const { return list_marker_; } const ListMarker& Marker() const { return list_marker_; }
ListMarker& Marker() { return list_marker_; } ListMarker& Marker() { return list_marker_; }
...@@ -29,6 +35,19 @@ class CORE_EXPORT LayoutOutsideListMarker final : public LayoutBlockFlow { ...@@ -29,6 +35,19 @@ class CORE_EXPORT LayoutOutsideListMarker final : public LayoutBlockFlow {
LayoutBlockFlow::IsOfType(type); LayoutBlockFlow::IsOfType(type);
} }
void UpdateLayout() override;
LayoutUnit LineHeight(
bool first_line,
LineDirectionMode,
LinePositionMode = kPositionOnContainingLine) const override;
LayoutUnit BaselinePosition(
FontBaseline,
bool first_line,
LineDirectionMode,
LinePositionMode = kPositionOnContainingLine) const override;
LayoutUnit list_item_inline_start_offset_;
ListMarker list_marker_; ListMarker list_marker_;
}; };
......
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