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 ef259608b6a7629e153cdb1c81ab18ab62122dbc..62a8508a2f8cf5a7ae2ab301b58c9f7fd68765b6 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 |
@@ -374,30 +374,33 @@ void NGBlockLayoutAlgorithm::FinishCurrentChildLayout(NGFragment* fragment) { |
} |
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; |
- } |
+ if (out_of_flow_candidates_.isEmpty()) { |
+ out_of_flow_layout_ = nullptr; |
+ out_of_flow_candidate_positions_.clear(); |
+ return true; |
} |
- NGFragment* fragment; |
- NGLogicalOffset offset; |
- if (out_of_flow_layout_->Layout(&fragment, &offset) == kNewFragment) { |
+ current_child_ = out_of_flow_candidates_.first(); |
+ out_of_flow_candidates_.removeFirst(); |
+ NGStaticPosition static_position = out_of_flow_candidate_positions_ |
+ [out_of_flow_candidate_positions_index_++]; |
+ |
+ EPosition position = current_child_->Style()->position(); |
+ bool contains_fixed = Style().canContainFixedPositionObjects(); |
+ bool contains_absolute = |
+ Style().canContainAbsolutePositionObjects() || contains_fixed; |
+ |
+ if ((contains_absolute && position == AbsolutePosition) || |
+ (contains_fixed && position == FixedPosition)) { |
+ NGFragment* fragment; |
+ NGLogicalOffset offset; |
+ out_of_flow_layout_->Layout(*current_child_, static_position, &fragment, |
+ &offset); |
// TODO(atotic) Need to adjust size of overflow rect per spec. |
atotic
2017/01/18 18:48:49
I think the code to decide whether NGBlockNode can
ikilpatrick
2017/01/18 19:32:13
Right, I've pulled it into a static method inside
|
builder_->AddChild(fragment, offset); |
- current_child_ = nullptr; |
+ } else { |
+ builder_->AddOutOfFlowDescendant(current_child_, static_position); |
} |
+ |
return false; |
} |