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

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: fix comments Created 3 years, 9 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 == {} 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 191 // 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. 192 // still {} as the margin strut from the constraint space must also be empty.
193 if (ConstraintSpace().IsNewFormattingContext()) { 193 if (ConstraintSpace().IsNewFormattingContext()) {
194 UpdateFragmentBfcOffset(curr_bfc_offset_); 194 UpdateFragmentBfcOffset(curr_bfc_offset_);
195 DCHECK_EQ(builder_.BfcOffset().value(), NGLogicalOffset()); 195 DCHECK_EQ(builder_.BfcOffset().value(), NGLogicalOffset());
196 DCHECK_EQ(curr_margin_strut_, NGMarginStrut()); 196 DCHECK_EQ(curr_margin_strut_, NGMarginStrut());
197 curr_bfc_offset_ = {};
ikilpatrick 2017/03/24 21:17:34 can you add a todo here that this should be a DCHE
Gleb Lanbin 2017/03/24 21:49:36 Done.
197 } 198 }
198 199
199 curr_bfc_offset_.block_offset += content_size_; 200 curr_bfc_offset_.block_offset += content_size_;
200 201
201 while (child) { 202 while (child) {
202 if (child->Type() == NGLayoutInputNode::kLegacyBlock) { 203 if (child->Type() == NGLayoutInputNode::kLegacyBlock) {
203 NGBlockNode* current_block_child = toNGBlockNode(child); 204 NGBlockNode* current_block_child = toNGBlockNode(child);
204 EPosition position = current_block_child->Style().position(); 205 EPosition position = current_block_child->Style().position();
205 if (position == EPosition::kAbsolute || position == EPosition::kFixed) { 206 if (position == EPosition::kAbsolute || position == EPosition::kFixed) {
206 builder_.AddOutOfFlowChildCandidate(current_block_child, 207 builder_.AddOutOfFlowChildCandidate(current_block_child,
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 // Pull out unpositioned floats to the current fragment. This may needed if 341 // Pull out unpositioned floats to the current fragment. This may needed if
341 // for example the child fragment could not position its floats because it's 342 // for example the child fragment could not position its floats because it's
342 // empty and therefore couldn't determine its position in space. 343 // empty and therefore couldn't determine its position in space.
343 builder_.MutableUnpositionedFloats().appendVector( 344 builder_.MutableUnpositionedFloats().appendVector(
344 layout_result->UnpositionedFloats()); 345 layout_result->UnpositionedFloats());
345 346
346 if (child->Type() == NGLayoutInputNode::kLegacyBlock && 347 if (child->Type() == NGLayoutInputNode::kLegacyBlock &&
347 toNGBlockNode(child)->Style().isFloating()) { 348 toNGBlockNode(child)->Style().isFloating()) {
348 RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create( 349 RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create(
349 child_space, constraint_space_, toNGBlockNode(child)->Style(), 350 child_space, constraint_space_, toNGBlockNode(child)->Style(),
350 curr_child_margins_, layout_result->PhysicalFragment().get()); 351 curr_child_margins_, child_space->AvailableSize(),
352 layout_result->PhysicalFragment().get());
351 builder_.AddUnpositionedFloat(floating_object); 353 builder_.AddUnpositionedFloat(floating_object);
352 // No need to postpone the positioning if we know the correct offset. 354 // No need to postpone the positioning if we know the correct offset.
353 if (builder_.BfcOffset()) { 355 if (builder_.BfcOffset()) {
354 NGLogicalOffset origin_point = curr_bfc_offset_; 356 NGLogicalOffset origin_point = curr_bfc_offset_;
355 // Adjust origin point to the margins of the last child. 357 // Adjust origin point to the margins of the last child.
356 // Example: <div style="margin-bottom: 20px"><float></div> 358 // Example: <div style="margin-bottom: 20px"><float></div>
357 // <div style="margin-bottom: 30px"></div> 359 // <div style="margin-bottom: 30px"></div>
358 origin_point.block_offset += curr_margin_strut_.Sum(); 360 origin_point.block_offset += curr_margin_strut_.Sum();
359 PositionPendingFloats(origin_point.block_offset, MutableConstraintSpace(), 361 PositionPendingFloats(origin_point.block_offset, MutableConstraintSpace(),
360 &builder_); 362 &builder_);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 481
480 if (child->Type() == NGLayoutInputNode::kLegacyInline) { 482 if (child->Type() == NGLayoutInputNode::kLegacyInline) {
481 // TODO(kojii): Setup space_builder_ appropriately for inline child. 483 // TODO(kojii): Setup space_builder_ appropriately for inline child.
482 space_builder_.SetBfcOffset(curr_bfc_offset_); 484 space_builder_.SetBfcOffset(curr_bfc_offset_);
483 return space_builder_.ToConstraintSpace( 485 return space_builder_.ToConstraintSpace(
484 FromPlatformWritingMode(Style().getWritingMode())); 486 FromPlatformWritingMode(Style().getWritingMode()));
485 } 487 }
486 488
487 const ComputedStyle& child_style = toNGBlockNode(child)->Style(); 489 const ComputedStyle& child_style = toNGBlockNode(child)->Style();
488 490
489 bool is_new_bfc = IsNewFormattingContextForInFlowBlockLevelChild( 491 bool is_new_bfc =
490 ConstraintSpace(), child_style); 492 IsNewFormattingContextForBlockLevelChild(ConstraintSpace(), child_style);
491 space_builder_.SetIsNewFormattingContext(is_new_bfc) 493 space_builder_.SetIsNewFormattingContext(is_new_bfc)
492 .SetBfcOffset(curr_bfc_offset_) 494 .SetBfcOffset(curr_bfc_offset_)
493 .SetClearanceOffset( 495 .SetClearanceOffset(
494 GetClearanceOffset(constraint_space_->Exclusions(), child_style)) 496 GetClearanceOffset(constraint_space_->Exclusions(), child_style))
495 .SetIsShrinkToFit(ShouldShrinkToFit(ConstraintSpace(), child_style)) 497 .SetIsShrinkToFit(ShouldShrinkToFit(ConstraintSpace(), child_style))
496 .SetTextDirection(child_style.direction()); 498 .SetTextDirection(child_style.direction());
497 499
498 // Float's margins are not included in child's space because: 500 // Float's margins are not included in child's space because:
499 // 1) Floats do not participate in margins collapsing. 501 // 1) Floats do not participate in margins collapsing.
500 // 2) Floats margins are used separately to calculate floating exclusions. 502 // 2) Floats margins are used separately to calculate floating exclusions.
501 space_builder_.SetMarginStrut(child_style.isFloating() ? NGMarginStrut() 503 space_builder_.SetMarginStrut(child_style.isFloating() ? NGMarginStrut()
502 : curr_margin_strut_); 504 : curr_margin_strut_);
503 505
504 LayoutUnit space_available; 506 LayoutUnit space_available;
505 if (constraint_space_->HasBlockFragmentation()) { 507 if (constraint_space_->HasBlockFragmentation()) {
506 space_available = ConstraintSpace().FragmentainerSpaceAvailable(); 508 space_available = ConstraintSpace().FragmentainerSpaceAvailable();
507 // 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
508 // position in the formatting context, and are able to adjust the 510 // position in the formatting context, and are able to adjust the
509 // fragmentation line. 511 // fragmentation line.
510 if (is_new_bfc) { 512 if (is_new_bfc) {
511 DCHECK(builder_.BfcOffset()); 513 DCHECK(builder_.BfcOffset());
512 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());
513 } 518 }
514 } 519 }
515 space_builder_.SetFragmentainerSpaceAvailable(space_available); 520 space_builder_.SetFragmentainerSpaceAvailable(space_available);
516 521
517 return space_builder_.ToConstraintSpace( 522 return space_builder_.ToConstraintSpace(
518 FromPlatformWritingMode(child_style.getWritingMode())); 523 FromPlatformWritingMode(child_style.getWritingMode()));
519 } 524 }
520 } // namespace blink 525 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698