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

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

Issue 2568743005: Place the out of flow positioned blocks (Closed)
Patch Set: skip failing tests 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 side-by-side diff with in-line comments
Download patch
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 a0be5806ffdf5106d4a64d02a5c9f5bb48bc40ea..8a359b3bce1ee40eea0e2e118d2aee04b5c709e0 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
@@ -12,6 +12,7 @@
#include "core/layout/ng/ng_fragment.h"
#include "core/layout/ng/ng_layout_opportunity_iterator.h"
#include "core/layout/ng/ng_length_utils.h"
+#include "core/layout/ng/ng_out_of_flow_layout_part.h"
#include "core/layout/ng/ng_units.h"
#include "core/style/ComputedStyle.h"
#include "platform/LengthFunctions.h"
@@ -292,15 +293,13 @@ NGLayoutStatus NGBlockLayoutAlgorithm::Layout(
}
case kStatePrepareForChildLayout: {
if (current_child_) {
- // TODO(atotic): uncomment this code when implementing oof layout.
- // This code cannot be turned on because it prevents layout of
- // oof children, and non-layedout objects trigger a DCHECK.
- // EPosition position = current_child_->Style()->position();
- // if ((position == AbsolutePosition || position == FixedPosition)) {
- // builder_->AddOutOfFlowCandidateChild(current_child_,
- // GetChildSpaceOffset());
- // }
- // else
+ EPosition position = current_child_->Style()->position();
+ if ((position == AbsolutePosition || position == FixedPosition)) {
+ builder_->AddOutOfFlowChildCandidate(current_child_,
+ GetChildSpaceOffset());
+ current_child_ = current_child_->NextSibling();
+ return kNotFinished;
+ }
space_for_current_child_ = CreateConstraintSpaceForCurrentChild();
*algorithm_out = NGLayoutInputNode::AlgorithmForInputNode(
current_child_, space_for_current_child_);
@@ -308,7 +307,21 @@ NGLayoutStatus NGBlockLayoutAlgorithm::Layout(
return kChildAlgorithmRequired;
}
- layout_state_ = kStateFinalize;
+ // Prepare for kStateOutOfFlowLayout
+ content_size_ += border_and_padding_.block_end;
+
+ // Recompute the block-axis size now that we know our content size.
+ LayoutUnit block_size = ComputeBlockSizeForFragment(
+ ConstraintSpace(), Style(), content_size_);
+ builder_->SetBlockSize(block_size);
+
+ // Out of flow setup.
+ out_of_flow_layout_ = new NGOutOfFlowLayoutPart(style_, builder_->Size());
+ builder_->GetAndClearOutOfFlowDescendantCandidates(
+ &out_of_flow_candidates_, &out_of_flow_candidate_positions_);
+ out_of_flow_candidate_positions_index_ = 0;
+ current_child_ = nullptr;
+ layout_state_ = kStateOutOfFlowLayout;
return kNotFinished;
}
case kStateChildLayout: {
@@ -326,15 +339,12 @@ NGLayoutStatus NGBlockLayoutAlgorithm::Layout(
layout_state_ = kStatePrepareForChildLayout;
return kNotFinished;
}
+ case kStateOutOfFlowLayout:
+ if (LayoutOutOfFlowChild())
+ layout_state_ = kStateFinalize;
+ return kNotFinished;
case kStateFinalize: {
- content_size_ += border_and_padding_.block_end;
-
- // Recompute the block-axis size now that we know our content size.
- LayoutUnit block_size = ComputeBlockSizeForFragment(
- ConstraintSpace(), Style(), content_size_);
-
- builder_->SetBlockSize(block_size)
- .SetInlineOverflow(max_inline_size_)
+ builder_->SetInlineOverflow(max_inline_size_)
.SetBlockOverflow(content_size_);
*fragment_out = builder_->ToFragment();
layout_state_ = kStateInit;
@@ -363,6 +373,34 @@ void NGBlockLayoutAlgorithm::FinishCurrentChildLayout(
builder_->AddChild(fragment, fragment_offset);
}
+bool NGBlockLayoutAlgorithm::LayoutOutOfFlowChild() {
+ if (!current_child_) {
+ if (out_of_flow_candidates_.isEmpty()) {
+ out_of_flow_layout_ = nullptr;
+ out_of_flow_candidate_positions_.clear();
+ return true;
+ }
+ current_child_ = out_of_flow_candidates_.first();
+ out_of_flow_candidates_.removeFirst();
+ NGStaticPosition position = out_of_flow_candidate_positions_
+ [out_of_flow_candidate_positions_index_++];
+
+ if (!out_of_flow_layout_->StartLayout(current_child_, position)) {
+ builder_->AddOutOfFlowDescendant(current_child_, position);
+ current_child_ = nullptr;
+ return false;
+ }
+ }
+ NGFragmentBase* fragment;
+ NGLogicalOffset offset;
+ if (out_of_flow_layout_->Layout(&fragment, &offset) == kNewFragment) {
+ // TODO(atotic) Need to adjust size of overflow rect per spec.
+ builder_->AddChild(fragment, offset);
+ current_child_ = nullptr;
+ }
+ return false;
+}
+
NGBoxStrut NGBlockLayoutAlgorithm::CollapseMargins(
const NGBoxStrut& margins,
const NGFragment& fragment) {
@@ -523,6 +561,8 @@ DEFINE_TRACE(NGBlockLayoutAlgorithm) {
visitor->trace(space_for_current_child_);
visitor->trace(current_child_);
visitor->trace(current_minmax_child_);
+ visitor->trace(out_of_flow_layout_);
+ visitor->trace(out_of_flow_candidates_);
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698