Index: third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc |
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc b/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc |
index eb08d9a65501c8185d3f5c9296699e63b7547681..297186f446c6755b07183c90889d9e1d9059114c 100644 |
--- a/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc |
+++ b/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc |
@@ -4,11 +4,13 @@ |
#include "core/layout/ng/ng_fragment_builder.h" |
+#include "core/layout/ng/ng_block_break_token.h" |
#include "core/layout/ng/ng_block_node.h" |
#include "core/layout/ng/ng_break_token.h" |
#include "core/layout/ng/ng_fragment.h" |
#include "core/layout/ng/ng_physical_box_fragment.h" |
#include "core/layout/ng/ng_physical_text_fragment.h" |
+#include "platform/heap/Handle.h" |
namespace blink { |
@@ -18,7 +20,10 @@ NGFragmentBuilder::NGFragmentBuilder(NGPhysicalFragment::NGFragmentType type, |
: type_(type), |
writing_mode_(kHorizontalTopBottom), |
direction_(TextDirection::kLtr), |
- node_(node) {} |
+ node_(node), |
+ did_break_(false) { |
+ child_break_tokens_ = new HeapVector<Member<NGBreakToken>>(); |
+} |
NGFragmentBuilder& NGFragmentBuilder::SetWritingMode( |
NGWritingMode writing_mode) { |
@@ -76,6 +81,10 @@ NGFragmentBuilder& NGFragmentBuilder::AddChild( |
DCHECK_EQ(type_, NGPhysicalFragment::kFragmentBox) |
<< "Only box fragments can have children"; |
+ // Update if we have fragmented in this flow. |
+ did_break_ |= child->IsBox() && !child->BreakToken()->IsFinished(); |
+ |
+ child_break_tokens_->push_back(child->BreakToken()); |
children_.push_back(std::move(child)); |
offsets_.push_back(child_offset); |
@@ -157,9 +166,6 @@ RefPtr<NGLayoutResult> NGFragmentBuilder::ToBoxFragment() { |
DCHECK_EQ(type_, NGPhysicalFragment::kFragmentBox); |
DCHECK_EQ(offsets_.size(), children_.size()); |
- auto* break_token = break_token_.get(); |
- break_token_ = nullptr; |
- |
NGPhysicalSize physical_size = size_.ConvertToPhysical(writing_mode_); |
for (size_t i = 0; i < children_.size(); ++i) { |
@@ -171,6 +177,15 @@ RefPtr<NGLayoutResult> NGFragmentBuilder::ToBoxFragment() { |
Vector<Persistent<NGFloatingObject>> positioned_floats; |
positioned_floats.reserveCapacity(positioned_floats_.size()); |
+ Persistent<NGBreakToken> break_token; |
+ if (did_break_) { |
+ break_token = |
+ new NGBlockBreakToken(toNGBlockNode(node_.get()), used_block_size_, |
+ *child_break_tokens_.get()); |
+ } else { |
+ break_token = new NGBlockBreakToken(node_.get()); |
+ } |
+ |
for (size_t i = 0; i < positioned_floats_.size(); ++i) { |
Persistent<NGFloatingObject>& floating_object = positioned_floats_[i]; |
NGPhysicalFragment* floating_fragment = floating_object->fragment.get(); |