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

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

Issue 2693193002: [LayoutNG] A different approach to multi-col. (Closed)
Patch Set: 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 dfbad215933f77e5736b1095a01879700ee78459..e9a0484f1aaddb4f8b401d4c6e76957b11b61bc8 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,21 +4,26 @@
#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 {
// TODO(ikilpatrick): Make writing mode and direction be in the constructor.
NGFragmentBuilder::NGFragmentBuilder(NGPhysicalFragment::NGFragmentType type,
- LayoutObject* layout_object)
+ NGLayoutInputNode* node)
: type_(type),
writing_mode_(kHorizontalTopBottom),
direction_(TextDirection::kLtr),
- layout_object_(layout_object) {}
+ node_(node),
+ did_break_(false) {
+ child_break_tokens_ = new HeapVector<Member<NGBreakToken>>();
+}
NGFragmentBuilder& NGFragmentBuilder::SetWritingMode(
NGWritingMode writing_mode) {
@@ -67,6 +72,13 @@ NGFragmentBuilder& NGFragmentBuilder::AddChild(
OutOfFlowPlacement{child_offset, oof_position});
}
+ DCHECK(child->BreakToken());
+ if (!child->BreakToken()->IsFinished()) {
+ // We have an unfinished child, we must produce an unfinished break token.
+ did_break_ = true;
+ }
+
+ child_break_tokens_->push_back(child->BreakToken());
children_.push_back(std::move(child));
offsets_.push_back(child_offset);
@@ -148,9 +160,6 @@ RefPtr<NGPhysicalBoxFragment> 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) {
@@ -162,6 +171,20 @@ RefPtr<NGPhysicalBoxFragment> 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()), LayoutUnit(0),
+ used_block_size_, *child_break_tokens_.get());
+ } else {
+ if (node_->Type() == NGLayoutInputNode::kLegacyBlock) {
+ break_token = new NGBlockBreakToken(toNGBlockNode(node_.get()));
+ } else {
+ break_token =
+ new NGBreakToken(NGBreakToken::kTextBreakToken, true, node_);
+ }
+ }
+
for (size_t i = 0; i < positioned_floats_.size(); ++i) {
Persistent<NGFloatingObject>& floating_object = positioned_floats_[i];
NGPhysicalFragment* floating_fragment = floating_object->fragment.get();
@@ -171,10 +194,10 @@ RefPtr<NGPhysicalBoxFragment> NGFragmentBuilder::ToBoxFragment() {
}
return adoptRef(new NGPhysicalBoxFragment(
- layout_object_, physical_size, overflow_.ConvertToPhysical(writing_mode_),
- children_, out_of_flow_descendants_, out_of_flow_positions_,
- unpositioned_floats_, positioned_floats_, bfc_offset_, end_margin_strut_,
- break_token));
+ node_->GetLayoutObject(), physical_size,
+ overflow_.ConvertToPhysical(writing_mode_), children_,
+ out_of_flow_descendants_, out_of_flow_positions_, unpositioned_floats_,
+ positioned_floats_, bfc_offset_, end_margin_strut_, break_token));
}
RefPtr<NGPhysicalTextFragment> NGFragmentBuilder::ToTextFragment(
@@ -189,12 +212,15 @@ RefPtr<NGPhysicalTextFragment> NGFragmentBuilder::ToTextFragment(
Vector<Persistent<NGFloatingObject>> empty_unpositioned_floats;
Vector<Persistent<NGFloatingObject>> empty_positioned_floats;
+ Persistent<NGBreakToken> break_token =
+ new NGBreakToken(NGBreakToken::kTextBreakToken, true, node_);
+
return adoptRef(new NGPhysicalTextFragment(
- layout_object_, node, index, start_offset, end_offset,
+ node_->GetLayoutObject(), node, index, start_offset, end_offset,
size_.ConvertToPhysical(writing_mode_),
overflow_.ConvertToPhysical(writing_mode_), out_of_flow_descendants_,
out_of_flow_positions_, empty_unpositioned_floats,
- empty_positioned_floats));
+ empty_positioned_floats, break_token));
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698