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

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

Issue 2714803002: [LayoutNG] Allow block-flow layout to be fragmented using new approach. (Closed)
Patch Set: rebase. Created 3 years, 10 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_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();

Powered by Google App Engine
This is Rietveld 408576698