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 2646853006: [LayoutNG] Pull out of flow candidate loop into out of flow layout part. (Closed)
Patch Set: Created 3 years, 11 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_box_fragment.h" 9 #include "core/layout/ng/ng_box_fragment.h"
10 #include "core/layout/ng/ng_column_mapper.h" 10 #include "core/layout/ng/ng_column_mapper.h"
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 break; 307 break;
308 } 308 }
309 309
310 content_size_ += border_and_padding_.block_end; 310 content_size_ += border_and_padding_.block_end;
311 311
312 // Recompute the block-axis size now that we know our content size. 312 // Recompute the block-axis size now that we know our content size.
313 block_size = 313 block_size =
314 ComputeBlockSizeForFragment(ConstraintSpace(), Style(), content_size_); 314 ComputeBlockSizeForFragment(ConstraintSpace(), Style(), content_size_);
315 builder_->SetBlockSize(block_size); 315 builder_->SetBlockSize(block_size);
316 316
317 // Out of flow setup.
318 out_of_flow_layout_ = new NGOutOfFlowLayoutPart(&Style(), builder_->Size());
319 builder_->GetAndClearOutOfFlowDescendantCandidates(
320 &out_of_flow_candidates_, &out_of_flow_candidate_positions_);
321 out_of_flow_candidate_positions_index_ = 0;
322 current_child_ = nullptr; 317 current_child_ = nullptr;
323 318
324 while (!LayoutOutOfFlowChild()) 319 // Layout our absolute and fixed positioned children.
325 continue; 320 NGOutOfFlowLayoutPart(Style(), builder_).Run();
326 321
327 builder_->SetInlineOverflow(max_inline_size_).SetBlockOverflow(content_size_); 322 builder_->SetInlineOverflow(max_inline_size_).SetBlockOverflow(content_size_);
328 323
329 if (ConstraintSpace().HasBlockFragmentation()) 324 if (ConstraintSpace().HasBlockFragmentation())
330 FinalizeForFragmentation(); 325 FinalizeForFragmentation();
331 326
332 *fragment_out = builder_->ToBoxFragment(); 327 *fragment_out = builder_->ToBoxFragment();
333 return kNewFragment; 328 return kNewFragment;
334 } 329 }
335 330
(...skipping 10 matching lines...) Expand all
346 &child_margins); 341 &child_margins);
347 fragment_offset = PositionFragment(*fragment, child_margins); 342 fragment_offset = PositionFragment(*fragment, child_margins);
348 } 343 }
349 if (fragmentainer_mapper_) 344 if (fragmentainer_mapper_)
350 fragmentainer_mapper_->ToVisualOffset(fragment_offset); 345 fragmentainer_mapper_->ToVisualOffset(fragment_offset);
351 else 346 else
352 fragment_offset.block_offset -= PreviousBreakOffset(); 347 fragment_offset.block_offset -= PreviousBreakOffset();
353 builder_->AddChild(fragment, fragment_offset); 348 builder_->AddChild(fragment, fragment_offset);
354 } 349 }
355 350
356 bool NGBlockLayoutAlgorithm::LayoutOutOfFlowChild() {
357 if (out_of_flow_candidates_.isEmpty()) {
358 out_of_flow_layout_ = nullptr;
359 out_of_flow_candidate_positions_.clear();
360 return true;
361 }
362 current_child_ = out_of_flow_candidates_.first();
363 out_of_flow_candidates_.removeFirst();
364 NGStaticPosition static_position = out_of_flow_candidate_positions_
365 [out_of_flow_candidate_positions_index_++];
366
367 if (IsContainingBlockForAbsoluteChild(Style(), *current_child_->Style())) {
368 NGFragment* fragment;
369 NGLogicalOffset offset;
370 out_of_flow_layout_->Layout(*current_child_, static_position, &fragment,
371 &offset);
372 // TODO(atotic) Need to adjust size of overflow rect per spec.
373 builder_->AddChild(fragment, offset);
374 } else {
375 builder_->AddOutOfFlowDescendant(current_child_, static_position);
376 }
377
378 return false;
379 }
380
381 bool NGBlockLayoutAlgorithm::ProceedToNextUnfinishedSibling( 351 bool NGBlockLayoutAlgorithm::ProceedToNextUnfinishedSibling(
382 NGPhysicalFragment* child_fragment) { 352 NGPhysicalFragment* child_fragment) {
383 DCHECK(current_child_); 353 DCHECK(current_child_);
384 NGBlockNode* finished_child = current_child_; 354 NGBlockNode* finished_child = current_child_;
385 current_child_ = current_child_->NextSibling(); 355 current_child_ = current_child_->NextSibling();
386 if (!ConstraintSpace().HasBlockFragmentation() && !fragmentainer_mapper_) 356 if (!ConstraintSpace().HasBlockFragmentation() && !fragmentainer_mapper_)
387 return true; 357 return true;
388 // If we're resuming layout after a fragmentainer break, we need to skip 358 // If we're resuming layout after a fragmentainer break, we need to skip
389 // siblings that we're done with. We may have been able to fully lay out some 359 // siblings that we're done with. We may have been able to fully lay out some
390 // node(s) preceding a node that we had to break inside (and therefore were 360 // node(s) preceding a node that we had to break inside (and therefore were
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 642
673 DEFINE_TRACE(NGBlockLayoutAlgorithm) { 643 DEFINE_TRACE(NGBlockLayoutAlgorithm) {
674 NGLayoutAlgorithm::trace(visitor); 644 NGLayoutAlgorithm::trace(visitor);
675 visitor->trace(first_child_); 645 visitor->trace(first_child_);
676 visitor->trace(constraint_space_); 646 visitor->trace(constraint_space_);
677 visitor->trace(break_token_); 647 visitor->trace(break_token_);
678 visitor->trace(builder_); 648 visitor->trace(builder_);
679 visitor->trace(space_builder_); 649 visitor->trace(space_builder_);
680 visitor->trace(space_for_current_child_); 650 visitor->trace(space_for_current_child_);
681 visitor->trace(current_child_); 651 visitor->trace(current_child_);
682 visitor->trace(out_of_flow_layout_);
683 visitor->trace(out_of_flow_candidates_);
684 visitor->trace(fragmentainer_mapper_); 652 visitor->trace(fragmentainer_mapper_);
685 } 653 }
686 654
687 } // namespace blink 655 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698