Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1515)

Unified Diff: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_box_state.cc

Issue 2910133002: [LayoutNG] Handle empty inlines and border edges (Closed)
Patch Set: Rebase Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_box_state.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_box_state.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_box_state.cc
index 64cdfd1c7d16995848abbe47921e0aee80b733df..5a5b9895d107d439c3e83c19cbb1d2feefa1ec18 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_box_state.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_box_state.cc
@@ -4,6 +4,7 @@
#include "core/layout/ng/inline/ng_inline_box_state.h"
+#include "core/layout/ng/inline/ng_inline_item_result.h"
#include "core/layout/ng/inline/ng_inline_node.h"
#include "core/layout/ng/inline/ng_line_box_fragment_builder.h"
#include "core/layout/ng/inline/ng_text_fragment_builder.h"
@@ -38,16 +39,6 @@ void NGInlineBoxState::AccumulateUsedFonts(const NGInlineItem& item,
}
}
-void NGInlineBoxState::SetNeedsBoxFragment(
- LayoutUnit position,
- LayoutUnit borders_paddings_block_start,
- LayoutUnit borders_paddings_block_height) {
- needs_box_fragment = true;
- line_left_position = position;
- this->borders_paddings_block_start = borders_paddings_block_start;
- this->borders_paddings_block_height = borders_paddings_block_height;
-}
-
NGInlineBoxState* NGInlineLayoutStateStack::OnBeginPlaceItems(
const ComputedStyle* line_style,
FontBaseline baseline_type) {
@@ -61,6 +52,8 @@ NGInlineBoxState* NGInlineLayoutStateStack::OnBeginPlaceItems(
for (auto& box : stack_) {
box.fragment_start = 0;
box.metrics = NGLineHeightMetrics();
+ // Existing box states are wrapped boxes, and hence no left edges.
+ box.border_edges.line_left = false;
DCHECK(box.pending_descendants.IsEmpty());
}
}
@@ -92,9 +85,8 @@ NGInlineBoxState* NGInlineLayoutStateStack::OnCloseTag(
const NGInlineItem& item,
NGLineBoxFragmentBuilder* line_box,
NGInlineBoxState* box,
- FontBaseline baseline_type,
- LayoutUnit position) {
- EndBoxState(box, line_box, baseline_type, position);
+ FontBaseline baseline_type) {
+ EndBoxState(box, line_box, baseline_type);
// TODO(kojii): When the algorithm restarts from a break token, the stack may
// underflow. We need either synthesize a missing box state, or push all
// parents on initialize.
@@ -108,7 +100,8 @@ void NGInlineLayoutStateStack::OnEndPlaceItems(
LayoutUnit position) {
for (auto it = stack_.rbegin(); it != stack_.rend(); ++it) {
NGInlineBoxState* box = &(*it);
- EndBoxState(box, line_box, baseline_type, position);
+ box->line_right_position = position;
+ EndBoxState(box, line_box, baseline_type);
}
if (!box_placeholders_.IsEmpty())
@@ -120,10 +113,9 @@ void NGInlineLayoutStateStack::OnEndPlaceItems(
void NGInlineLayoutStateStack::EndBoxState(NGInlineBoxState* box,
NGLineBoxFragmentBuilder* line_box,
- FontBaseline baseline_type,
- LayoutUnit position) {
+ FontBaseline baseline_type) {
if (box->needs_box_fragment)
- AddBoxFragmentPlaceholder(box, line_box, baseline_type, position);
+ AddBoxFragmentPlaceholder(box, line_box, baseline_type);
PositionPending position_pending =
ApplyBaselineShift(box, line_box, baseline_type);
@@ -134,6 +126,36 @@ void NGInlineLayoutStateStack::EndBoxState(NGInlineBoxState* box,
}
}
+void NGInlineBoxState::SetNeedsBoxFragment(
+ const NGInlineItem& item,
+ const NGInlineItemResult& item_result,
+ LayoutUnit position) {
+ needs_box_fragment = true;
+ line_left_position = position + item_result.margins.inline_start;
+ borders_paddings_block_start = item_result.borders_paddings_block_start;
+ borders_paddings_block_end = item_result.borders_paddings_block_end;
+ // We have left edge on open tag, and if the box is not a continuation.
+ // TODO(kojii): Needs review when we change SplitInlines().
+ bool has_line_left_edge = item.Style()->IsLeftToRightDirection()
+ ? item.HasStartEdge()
+ : item.HasEndEdge();
+ border_edges = {true, false, true, has_line_left_edge};
+}
+
+void NGInlineBoxState::SetLineRightForBoxFragment(
+ const NGInlineItem& item,
+ const NGInlineItemResult& item_result,
+ LayoutUnit position) {
+ DCHECK(needs_box_fragment);
+ line_right_position = position - item_result.margins.inline_end;
+ // We have right edge on close tag, and if the box does not have a
+ // continuation.
+ // TODO(kojii): Needs review when we change SplitInlines().
+ border_edges.line_right = item.Style()->IsLeftToRightDirection()
+ ? item.HasEndEdge()
+ : item.HasStartEdge();
+}
+
// Crete a placeholder for a box fragment.
// We keep a flat list of fragments because it is more suitable for operations
// such as ApplyBaselineShift. Later, CreateBoxFragments() creates box fragments
@@ -141,16 +163,14 @@ void NGInlineLayoutStateStack::EndBoxState(NGInlineBoxState* box,
void NGInlineLayoutStateStack::AddBoxFragmentPlaceholder(
NGInlineBoxState* box,
NGLineBoxFragmentBuilder* line_box,
- FontBaseline baseline_type,
- LayoutUnit position) {
- if (box->fragment_start == line_box->Children().size()) {
- // Don't create a placeholder if the inline box is empty.
+ FontBaseline baseline_type) {
+ LayoutUnit inline_size = box->line_right_position - box->line_left_position;
+ if (box->fragment_start == line_box->Children().size() && inline_size <= 0) {
+ // Don't create a box if the inline box is "empty".
+ // Inline boxes with inline margins/borders/paddings are not "empty",
+ // but background doesn't make difference in this context.
// Whether to create this box or not affects layout when the line contains
// only this box, since this box participates the line height.
- // TODO(kojii): Testing indicates that we should create a box if it has
- // borders, but not for backgrounds. But creating such a RootInlineBox needs
- // additional code. The plan is to enable such line box when NG paint is
- // enabled.
return;
}
@@ -165,9 +185,9 @@ void NGInlineLayoutStateStack::AddBoxFragmentPlaceholder(
// direction is already included into positions in NGLineBreaker.
NGLogicalRect bounds(
box->line_left_position,
- -metrics.ascent - box->borders_paddings_block_start,
- position - box->line_left_position,
- metrics.LineHeight() + box->borders_paddings_block_height);
+ -metrics.ascent - box->borders_paddings_block_start, inline_size,
+ metrics.LineHeight() + box->borders_paddings_block_start +
+ box->borders_paddings_block_end);
// The start is marked only in BoxFragmentPlaceholder, while end is marked
// in both BoxFragmentPlaceholder and the list itself.
@@ -180,8 +200,9 @@ void NGInlineLayoutStateStack::AddBoxFragmentPlaceholder(
// The "null" is added to the list to compute baseline shift of the box
// separately from text fragments.
unsigned fragment_end = line_box->Children().size();
- box_placeholders_.push_back(BoxFragmentPlaceholder{
- box->fragment_start, fragment_end, box->item, bounds.size});
+ box_placeholders_.push_back(
+ BoxFragmentPlaceholder{box->fragment_start, fragment_end, box->item,
+ bounds.size, box->border_edges});
line_box->AddChild(nullptr, bounds.offset);
}
@@ -216,6 +237,10 @@ void NGInlineLayoutStateStack::CreateBoxFragments(
box.SetWritingMode(line_box->WritingMode());
box.SetDirection(placeholder.item->Direction());
+ // Inline boxes have block start/end borders, even when its containing block
+ // was fragmented. Fragmenting a line box in block direction is not
+ // supported today.
+ box.SetBorderEdges(placeholder.border_edges);
box.SetSize(placeholder.size);
// TODO(kojii): Overflow size should be computed from children.
box.SetOverflowSize(placeholder.size);

Powered by Google App Engine
This is Rietveld 408576698