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

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

Issue 2805283003: Inline algorithm should take into account the wrapper's clearance line. (Closed)
Patch Set: git rebase-update Created 3 years, 8 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
« no previous file with comments | « third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
index 143ac82a9d6a2f11a23304b9d07aab17ac55dcf0..b29bc274af2cac09089e2054cb0b6e449fd3226e 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
@@ -24,6 +24,16 @@
namespace blink {
namespace {
+// Adjusts {@code offset} to the clearance line.
+void AdjustToClearance(const WTF::Optional<LayoutUnit>& clearance_offset,
+ NGLogicalOffset* offset) {
+ DCHECK(offset);
+ if (clearance_offset) {
+ offset->block_offset =
+ std::max(clearance_offset.value(), offset->block_offset);
+ }
+}
+
// Returns if a child may be affected by its clear property. I.e. it will
// actually clear a float.
bool ClearanceMayAffectLayout(
@@ -63,6 +73,17 @@ bool IsOutOfSpace(const NGConstraintSpace& space, LayoutUnit content_size) {
} // namespace
+void MaybeUpdateFragmentBfcOffset(const NGConstraintSpace& space,
+ const NGLogicalOffset& offset,
+ NGFragmentBuilder* builder) {
+ DCHECK(builder);
+ if (!builder->BfcOffset()) {
+ NGLogicalOffset mutable_offset(offset);
+ AdjustToClearance(space.ClearanceOffset(), &mutable_offset);
+ builder->SetBfcOffset(mutable_offset);
+ }
+}
+
NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm(NGBlockNode* node,
NGConstraintSpace* space,
NGBlockBreakToken* break_token)
@@ -120,18 +141,6 @@ NGLogicalOffset NGBlockLayoutAlgorithm::CalculateLogicalOffset(
return {inline_offset, block_offset};
}
-void NGBlockLayoutAlgorithm::UpdateFragmentBfcOffset(
- const NGLogicalOffset& offset) {
- if (!builder_.BfcOffset()) {
- NGLogicalOffset bfc_offset = offset;
- if (ConstraintSpace().ClearanceOffset()) {
- bfc_offset.block_offset = std::max(
- ConstraintSpace().ClearanceOffset().value(), offset.block_offset);
- }
- builder_.SetBfcOffset(bfc_offset);
- }
-}
-
RefPtr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
WTF::Optional<MinMaxContentSize> min_max_size;
if (NeedMinMaxContentSize(ConstraintSpace(), Style()))
@@ -179,14 +188,16 @@ RefPtr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
// border/padding between them.
if (border_and_padding_.block_start) {
curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
- UpdateFragmentBfcOffset(curr_bfc_offset_);
+ MaybeUpdateFragmentBfcOffset(ConstraintSpace(), curr_bfc_offset_,
+ &builder_);
curr_margin_strut_ = NGMarginStrut();
}
// If a new formatting context hits the if branch above then the BFC offset is
// still {} as the margin strut from the constraint space must also be empty.
if (ConstraintSpace().IsNewFormattingContext()) {
- UpdateFragmentBfcOffset(curr_bfc_offset_);
+ MaybeUpdateFragmentBfcOffset(ConstraintSpace(), curr_bfc_offset_,
+ &builder_);
DCHECK_EQ(curr_margin_strut_, NGMarginStrut());
DCHECK_EQ(builder_.BfcOffset().value(), NGLogicalOffset());
curr_bfc_offset_ = {};
@@ -248,7 +259,8 @@ RefPtr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
// Non-empty blocks always know their position in space:
if (size.block_size) {
curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
- UpdateFragmentBfcOffset(curr_bfc_offset_);
+ MaybeUpdateFragmentBfcOffset(ConstraintSpace(), curr_bfc_offset_,
+ &builder_);
PositionPendingFloats(curr_bfc_offset_.block_offset,
MutableConstraintSpace(), &builder_);
}
@@ -297,8 +309,9 @@ void NGBlockLayoutAlgorithm::PrepareChildLayout(NGLayoutInputNode* child) {
if (should_position_pending_floats) {
LayoutUnit origin_point_block_offset =
curr_bfc_offset_.block_offset + curr_margin_strut_.Sum();
- UpdateFragmentBfcOffset(
- {curr_bfc_offset_.inline_offset, origin_point_block_offset});
+ MaybeUpdateFragmentBfcOffset(
+ ConstraintSpace(),
+ {curr_bfc_offset_.inline_offset, origin_point_block_offset}, &builder_);
PositionPendingFloats(origin_point_block_offset, MutableConstraintSpace(),
&builder_);
}
@@ -331,7 +344,8 @@ void NGBlockLayoutAlgorithm::PrepareChildLayout(NGLayoutInputNode* child) {
// their BFC offset for fragmentation purposes.
if (should_collapse_margins) {
curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
- UpdateFragmentBfcOffset(curr_bfc_offset_);
+ MaybeUpdateFragmentBfcOffset(ConstraintSpace(), curr_bfc_offset_,
+ &builder_);
PositionPendingFloats(curr_bfc_offset_.block_offset,
MutableConstraintSpace(), &builder_);
curr_margin_strut_ = {};
@@ -383,7 +397,8 @@ void NGBlockLayoutAlgorithm::FinishChildLayout(
} else if (fragment.BfcOffset()) {
// Fragment that knows its offset can be used to set parent's BFC position.
curr_bfc_offset_.block_offset = fragment.BfcOffset().value().block_offset;
- UpdateFragmentBfcOffset(curr_bfc_offset_);
+ MaybeUpdateFragmentBfcOffset(ConstraintSpace(), curr_bfc_offset_,
+ &builder_);
PositionPendingFloats(curr_bfc_offset_.block_offset,
MutableConstraintSpace(), &builder_);
bfc_offset = curr_bfc_offset_;
@@ -491,7 +506,8 @@ RefPtr<NGConstraintSpace> NGBlockLayoutAlgorithm::CreateConstraintSpaceForChild(
if (child->IsInline()) {
// TODO(kojii): Setup space_builder_ appropriately for inline child.
- space_builder_.SetBfcOffset(curr_bfc_offset_);
+ space_builder_.SetBfcOffset(curr_bfc_offset_)
+ .SetClearanceOffset(ConstraintSpace().ClearanceOffset());
return space_builder_.ToConstraintSpace(
FromPlatformWritingMode(Style().GetWritingMode()));
}
« no previous file with comments | « third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698