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

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

Issue 2770483002: CS of out-of-flow positioned objects should have is_new_fc == true (Closed)
Patch Set: update TestExpectations 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/layout/ng/ng_block_layout_algorithm.h" 5 #include "core/layout/ng/ng_block_layout_algorithm.h"
6 6
7 #include "core/layout/ng/ng_absolute_utils.h" 7 #include "core/layout/ng/ng_absolute_utils.h"
8 #include "core/layout/ng/ng_block_break_token.h" 8 #include "core/layout/ng/ng_block_break_token.h"
9 #include "core/layout/ng/ng_block_child_iterator.h" 9 #include "core/layout/ng/ng_block_child_iterator.h"
10 #include "core/layout/ng/ng_box_fragment.h" 10 #include "core/layout/ng/ng_box_fragment.h"
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 180
181 // Margins collapsing: 181 // Margins collapsing:
182 // Do not collapse margins between parent and its child if there is 182 // Do not collapse margins between parent and its child if there is
183 // border/padding between them. 183 // border/padding between them.
184 if (border_and_padding_.block_start) { 184 if (border_and_padding_.block_start) {
185 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum(); 185 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
186 UpdateFragmentBfcOffset(curr_bfc_offset_); 186 UpdateFragmentBfcOffset(curr_bfc_offset_);
187 curr_margin_strut_ = NGMarginStrut(); 187 curr_margin_strut_ = NGMarginStrut();
188 } 188 }
189 189
190 // Block that establishes a new BFC knows its BFC offset == {}
191 // If a new formatting context hits the if branch above then the BFC offset is 190 // If a new formatting context hits the if branch above then the BFC offset is
192 // still {} as the margin strut from the constraint space must also be empty. 191 // still {} as the margin strut from the constraint space must also be empty.
193 if (ConstraintSpace().IsNewFormattingContext()) { 192 if (ConstraintSpace().IsNewFormattingContext()) {
194 UpdateFragmentBfcOffset(curr_bfc_offset_); 193 UpdateFragmentBfcOffset(curr_bfc_offset_);
195 DCHECK_EQ(builder_.BfcOffset().value(), NGLogicalOffset());
196 DCHECK_EQ(curr_margin_strut_, NGMarginStrut()); 194 DCHECK_EQ(curr_margin_strut_, NGMarginStrut());
195 // TODO(glebl): Uncomment the line below once we add the fragmentation
196 // support for floats.
197 // DCHECK_EQ(builder_.BfcOffset().value(), NGLogicalOffset());
198 curr_bfc_offset_ = {};
197 } 199 }
198 200
199 curr_bfc_offset_.block_offset += content_size_; 201 curr_bfc_offset_.block_offset += content_size_;
200 202
201 while (child) { 203 while (child) {
202 if (child->Type() == NGLayoutInputNode::kLegacyBlock) { 204 if (child->Type() == NGLayoutInputNode::kLegacyBlock) {
203 NGBlockNode* current_block_child = toNGBlockNode(child); 205 NGBlockNode* current_block_child = toNGBlockNode(child);
204 EPosition position = current_block_child->Style().position(); 206 EPosition position = current_block_child->Style().position();
205 if (position == EPosition::kAbsolute || position == EPosition::kFixed) { 207 if (position == EPosition::kAbsolute || position == EPosition::kFixed) {
206 NGLogicalOffset offset = {border_and_padding_.inline_start, 208 NGLogicalOffset offset = {border_and_padding_.inline_start,
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 // Pull out unpositioned floats to the current fragment. This may needed if 340 // Pull out unpositioned floats to the current fragment. This may needed if
339 // for example the child fragment could not position its floats because it's 341 // for example the child fragment could not position its floats because it's
340 // empty and therefore couldn't determine its position in space. 342 // empty and therefore couldn't determine its position in space.
341 builder_.MutableUnpositionedFloats().appendVector( 343 builder_.MutableUnpositionedFloats().appendVector(
342 layout_result->UnpositionedFloats()); 344 layout_result->UnpositionedFloats());
343 345
344 if (child->Type() == NGLayoutInputNode::kLegacyBlock && 346 if (child->Type() == NGLayoutInputNode::kLegacyBlock &&
345 toNGBlockNode(child)->Style().isFloating()) { 347 toNGBlockNode(child)->Style().isFloating()) {
346 RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create( 348 RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create(
347 child_space, constraint_space_, toNGBlockNode(child)->Style(), 349 child_space, constraint_space_, toNGBlockNode(child)->Style(),
348 curr_child_margins_, layout_result->PhysicalFragment().get()); 350 curr_child_margins_, child_space->AvailableSize(),
351 layout_result->PhysicalFragment().get());
349 builder_.AddUnpositionedFloat(floating_object); 352 builder_.AddUnpositionedFloat(floating_object);
350 // No need to postpone the positioning if we know the correct offset. 353 // No need to postpone the positioning if we know the correct offset.
351 if (builder_.BfcOffset()) { 354 if (builder_.BfcOffset()) {
352 NGLogicalOffset origin_point = curr_bfc_offset_; 355 NGLogicalOffset origin_point = curr_bfc_offset_;
353 // Adjust origin point to the margins of the last child. 356 // Adjust origin point to the margins of the last child.
354 // Example: <div style="margin-bottom: 20px"><float></div> 357 // Example: <div style="margin-bottom: 20px"><float></div>
355 // <div style="margin-bottom: 30px"></div> 358 // <div style="margin-bottom: 30px"></div>
356 origin_point.block_offset += curr_margin_strut_.Sum(); 359 origin_point.block_offset += curr_margin_strut_.Sum();
357 PositionPendingFloats(origin_point.block_offset, MutableConstraintSpace(), 360 PositionPendingFloats(origin_point.block_offset, MutableConstraintSpace(),
358 &builder_); 361 &builder_);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 if (!child_style.isFloating()) { 471 if (!child_style.isFloating()) {
469 ApplyAutoMargins(space, child_style, child_inline_size, &margins); 472 ApplyAutoMargins(space, child_style, child_inline_size, &margins);
470 } 473 }
471 return margins; 474 return margins;
472 } 475 }
473 476
474 RefPtr<NGConstraintSpace> NGBlockLayoutAlgorithm::CreateConstraintSpaceForChild( 477 RefPtr<NGConstraintSpace> NGBlockLayoutAlgorithm::CreateConstraintSpaceForChild(
475 NGLayoutInputNode* child) { 478 NGLayoutInputNode* child) {
476 DCHECK(child); 479 DCHECK(child);
477 480
478 if (child->Type() == NGLayoutInputNode::kLegacyInline) { 481 const ComputedStyle& child_style = child->Style();
482 bool is_new_bfc =
483 IsNewFormattingContextForBlockLevelChild(ConstraintSpace(), child_style);
484 space_builder_.SetIsNewFormattingContext(is_new_bfc)
485 .SetBfcOffset(curr_bfc_offset_);
486
487 if (child->IsInline()) {
479 // TODO(kojii): Setup space_builder_ appropriately for inline child. 488 // TODO(kojii): Setup space_builder_ appropriately for inline child.
480 space_builder_.SetBfcOffset(curr_bfc_offset_); 489 space_builder_.SetBfcOffset(curr_bfc_offset_);
481 return space_builder_.ToConstraintSpace( 490 return space_builder_.ToConstraintSpace(
482 FromPlatformWritingMode(Style().getWritingMode())); 491 FromPlatformWritingMode(Style().getWritingMode()));
483 } 492 }
484 493
485 const ComputedStyle& child_style = toNGBlockNode(child)->Style(); 494 space_builder_
486
487 bool is_new_bfc = IsNewFormattingContextForInFlowBlockLevelChild(
488 ConstraintSpace(), child_style);
489 space_builder_.SetIsNewFormattingContext(is_new_bfc)
490 .SetBfcOffset(curr_bfc_offset_)
491 .SetClearanceOffset( 495 .SetClearanceOffset(
492 GetClearanceOffset(constraint_space_->Exclusions(), child_style)) 496 GetClearanceOffset(constraint_space_->Exclusions(), child_style))
493 .SetIsShrinkToFit(ShouldShrinkToFit(ConstraintSpace(), child_style)) 497 .SetIsShrinkToFit(ShouldShrinkToFit(ConstraintSpace(), child_style))
494 .SetTextDirection(child_style.direction()); 498 .SetTextDirection(child_style.direction());
495 499
496 // Float's margins are not included in child's space because: 500 // Float's margins are not included in child's space because:
497 // 1) Floats do not participate in margins collapsing. 501 // 1) Floats do not participate in margins collapsing.
498 // 2) Floats margins are used separately to calculate floating exclusions. 502 // 2) Floats margins are used separately to calculate floating exclusions.
499 space_builder_.SetMarginStrut(child_style.isFloating() ? NGMarginStrut() 503 space_builder_.SetMarginStrut(child_style.isFloating() ? NGMarginStrut()
500 : curr_margin_strut_); 504 : curr_margin_strut_);
501 505
502 LayoutUnit space_available; 506 LayoutUnit space_available;
503 if (constraint_space_->HasBlockFragmentation()) { 507 if (constraint_space_->HasBlockFragmentation()) {
504 space_available = ConstraintSpace().FragmentainerSpaceAvailable(); 508 space_available = ConstraintSpace().FragmentainerSpaceAvailable();
505 // If a block establishes a new formatting context we must know our 509 // If a block establishes a new formatting context we must know our
506 // position in the formatting context, and are able to adjust the 510 // position in the formatting context, and are able to adjust the
507 // fragmentation line. 511 // fragmentation line.
508 if (is_new_bfc) { 512 if (is_new_bfc) {
509 DCHECK(builder_.BfcOffset()); 513 DCHECK(builder_.BfcOffset());
510 space_available -= curr_bfc_offset_.block_offset; 514 space_available -= curr_bfc_offset_.block_offset;
515 // TODO(glebl): We need to reset BFCOffset in ToConstraintSpace() after we
516 // started handling the fragmentation for floats.
517 space_builder_.SetBfcOffset(NGLogicalOffset());
511 } 518 }
512 } 519 }
513 space_builder_.SetFragmentainerSpaceAvailable(space_available); 520 space_builder_.SetFragmentainerSpaceAvailable(space_available);
514 521
515 return space_builder_.ToConstraintSpace( 522 return space_builder_.ToConstraintSpace(
516 FromPlatformWritingMode(child_style.getWritingMode())); 523 FromPlatformWritingMode(child_style.getWritingMode()));
517 } 524 }
518 } // namespace blink 525 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/BUILD.gn ('k') | third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698