Commit 2c0fc741 authored by Yoshifumi Inoue's avatar Yoshifumi Inoue Committed by Commit Bot

Make NGInlineItemsBuilder to hold LayoutBlockFlow

This patch changes |NGInlineItemsBuilder| to hold |LayoutBlockFlow| to allow
member functions to use |LayoutBlockFlow| during collecting inline items for
preparation of the CL[1], e.g.
 - Use LayutBlockFlow in CollectInlinesInternal()
 - Use LayutBlockFlow::HasLineIfEmpty() in ExitBlock()[1]

[1] http://crrev.com/c/2139612 EditingNG All-In-One

Bug: 707656
Change-Id: Ie5a43f97e8ee7f2aa18e7024841fe9f4f48dfe54
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2237426
Auto-Submit: Yoshifumi Inoue <yosin@chromium.org>
Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Commit-Queue: Koji Ishii <kojii@chromium.org>
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#776490}
parent a3e0f57e
...@@ -44,10 +44,13 @@ class NGInlineItemsBuilderTemplate { ...@@ -44,10 +44,13 @@ class NGInlineItemsBuilderTemplate {
public: public:
// Create a builder that appends items to |items|. // Create a builder that appends items to |items|.
explicit NGInlineItemsBuilderTemplate(Vector<NGInlineItem>* items) NGInlineItemsBuilderTemplate(LayoutBlockFlow* block_flow,
: items_(items) {} Vector<NGInlineItem>* items)
: block_flow_(block_flow), items_(items) {}
~NGInlineItemsBuilderTemplate(); ~NGInlineItemsBuilderTemplate();
LayoutBlockFlow* GetLayoutBlockFlow() const { return block_flow_; }
String ToString(); String ToString();
// Returns whether the items contain any Bidi controls. // Returns whether the items contain any Bidi controls.
...@@ -146,6 +149,7 @@ class NGInlineItemsBuilderTemplate { ...@@ -146,6 +149,7 @@ class NGInlineItemsBuilderTemplate {
private: private:
static bool NeedsBoxInfo(); static bool NeedsBoxInfo();
LayoutBlockFlow* const block_flow_;
Vector<NGInlineItem>* items_; Vector<NGInlineItem>* items_;
StringBuilder text_; StringBuilder text_;
......
...@@ -29,6 +29,9 @@ class NGInlineItemsBuilderTest : public NGLayoutTest { ...@@ -29,6 +29,9 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
void SetUp() override { void SetUp() override {
NGLayoutTest::SetUp(); NGLayoutTest::SetUp();
style_ = ComputedStyle::Create(); style_ = ComputedStyle::Create();
block_flow_ = LayoutBlockFlow::CreateAnonymous(&GetDocument(), style_,
LegacyLayout::kAuto);
anonymous_objects_.push_back(block_flow_);
} }
void TearDown() override { void TearDown() override {
...@@ -37,6 +40,8 @@ class NGInlineItemsBuilderTest : public NGLayoutTest { ...@@ -37,6 +40,8 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
NGLayoutTest::TearDown(); NGLayoutTest::TearDown();
} }
LayoutBlockFlow* GetLayoutBlockFlow() const { return block_flow_; }
void SetWhiteSpace(EWhiteSpace whitespace) { void SetWhiteSpace(EWhiteSpace whitespace) {
style_->SetWhiteSpace(whitespace); style_->SetWhiteSpace(whitespace);
} }
...@@ -84,7 +89,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest { ...@@ -84,7 +89,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
const String& TestAppend(Vector<Input> inputs) { const String& TestAppend(Vector<Input> inputs) {
items_.clear(); items_.clear();
Vector<LayoutText*> anonymous_objects; Vector<LayoutText*> anonymous_objects;
NGInlineItemsBuilder builder(&items_); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items_);
for (Input& input : inputs) { for (Input& input : inputs) {
if (!input.layout_text) { if (!input.layout_text) {
input.layout_text = LayoutText::CreateEmptyAnonymous( input.layout_text = LayoutText::CreateEmptyAnonymous(
...@@ -135,7 +140,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest { ...@@ -135,7 +140,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
fake_data.is_bidi_enabled_ = has_bidi_controls; fake_data.is_bidi_enabled_ = has_bidi_controls;
Vector<NGInlineItem> reuse_items; Vector<NGInlineItem> reuse_items;
NGInlineItemsBuilder reuse_builder(&reuse_items); NGInlineItemsBuilder reuse_builder(GetLayoutBlockFlow(), &reuse_items);
for (Input& input : inputs) { for (Input& input : inputs) {
// Collect items for this LayoutObject. // Collect items for this LayoutObject.
DCHECK(input.layout_text); DCHECK(input.layout_text);
...@@ -166,6 +171,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest { ...@@ -166,6 +171,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
EXPECT_EQ(text_, reuse_text); EXPECT_EQ(text_, reuse_text);
} }
LayoutBlockFlow* block_flow_ = nullptr;
Vector<NGInlineItem> items_; Vector<NGInlineItem> items_;
String text_; String text_;
scoped_refptr<ComputedStyle> style_; scoped_refptr<ComputedStyle> style_;
...@@ -330,7 +336,7 @@ TEST_F(NGInlineItemsBuilderTest, CollapseEastAsianWidth) { ...@@ -330,7 +336,7 @@ TEST_F(NGInlineItemsBuilderTest, CollapseEastAsianWidth) {
#endif #endif
TEST_F(NGInlineItemsBuilderTest, OpaqueToSpaceCollapsing) { TEST_F(NGInlineItemsBuilderTest, OpaqueToSpaceCollapsing) {
NGInlineItemsBuilder builder(&items_); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items_);
AppendText("Hello ", &builder); AppendText("Hello ", &builder);
builder.AppendOpaque(NGInlineItem::kBidiControl, builder.AppendOpaque(NGInlineItem::kBidiControl,
kFirstStrongIsolateCharacter); kFirstStrongIsolateCharacter);
...@@ -342,7 +348,7 @@ TEST_F(NGInlineItemsBuilderTest, OpaqueToSpaceCollapsing) { ...@@ -342,7 +348,7 @@ TEST_F(NGInlineItemsBuilderTest, OpaqueToSpaceCollapsing) {
} }
TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) { TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) {
NGInlineItemsBuilder builder(&items_); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items_);
AppendText("Hello ", &builder); AppendText("Hello ", &builder);
AppendAtomicInline(&builder); AppendAtomicInline(&builder);
AppendText(" World", &builder); AppendText(" World", &builder);
...@@ -350,7 +356,7 @@ TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) { ...@@ -350,7 +356,7 @@ TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) {
} }
TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAfterObject) { TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAfterObject) {
NGInlineItemsBuilder builder(&items_); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items_);
AppendAtomicInline(&builder); AppendAtomicInline(&builder);
AppendText("\n", &builder); AppendText("\n", &builder);
AppendAtomicInline(&builder); AppendAtomicInline(&builder);
...@@ -402,7 +408,7 @@ TEST_F(NGInlineItemsBuilderTest, IgnorablePre) { ...@@ -402,7 +408,7 @@ TEST_F(NGInlineItemsBuilderTest, IgnorablePre) {
TEST_F(NGInlineItemsBuilderTest, Empty) { TEST_F(NGInlineItemsBuilderTest, Empty) {
Vector<NGInlineItem> items; Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
scoped_refptr<ComputedStyle> block_style(ComputedStyle::Create()); scoped_refptr<ComputedStyle> block_style(ComputedStyle::Create());
builder.EnterBlock(block_style.get()); builder.EnterBlock(block_style.get());
builder.ExitBlock(); builder.ExitBlock();
...@@ -444,7 +450,7 @@ TEST_F(NGInlineItemsBuilderTest, GenerateBreakOpportunityAfterLeadingSpaces) { ...@@ -444,7 +450,7 @@ TEST_F(NGInlineItemsBuilderTest, GenerateBreakOpportunityAfterLeadingSpaces) {
TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) { TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) {
Vector<NGInlineItem> items; Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
scoped_refptr<ComputedStyle> block_style(ComputedStyle::Create()); scoped_refptr<ComputedStyle> block_style(ComputedStyle::Create());
block_style->SetUnicodeBidi(UnicodeBidi::kBidiOverride); block_style->SetUnicodeBidi(UnicodeBidi::kBidiOverride);
block_style->SetDirection(TextDirection::kRtl); block_style->SetDirection(TextDirection::kRtl);
...@@ -474,7 +480,7 @@ static LayoutInline* CreateLayoutInline( ...@@ -474,7 +480,7 @@ static LayoutInline* CreateLayoutInline(
TEST_F(NGInlineItemsBuilderTest, BidiIsolate) { TEST_F(NGInlineItemsBuilderTest, BidiIsolate) {
Vector<NGInlineItem> items; Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
AppendText("Hello ", &builder); AppendText("Hello ", &builder);
LayoutInline* const isolate_rtl = LayoutInline* const isolate_rtl =
CreateLayoutInline(&GetDocument(), [](ComputedStyle* style) { CreateLayoutInline(&GetDocument(), [](ComputedStyle* style) {
...@@ -499,7 +505,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolate) { ...@@ -499,7 +505,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolate) {
TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) { TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) {
Vector<NGInlineItem> items; Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
AppendText("Hello ", &builder); AppendText("Hello ", &builder);
LayoutInline* const isolate_override_rtl = LayoutInline* const isolate_override_rtl =
CreateLayoutInline(&GetDocument(), [](ComputedStyle* style) { CreateLayoutInline(&GetDocument(), [](ComputedStyle* style) {
...@@ -524,7 +530,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) { ...@@ -524,7 +530,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) {
TEST_F(NGInlineItemsBuilderTest, HasRuby) { TEST_F(NGInlineItemsBuilderTest, HasRuby) {
Vector<NGInlineItem> items; Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items); NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
EXPECT_FALSE(HasRuby(builder)) << "has_ruby_ should be false initially."; EXPECT_FALSE(HasRuby(builder)) << "has_ruby_ should be false initially.";
AppendText("Hello ", &builder); AppendText("Hello ", &builder);
......
...@@ -186,9 +186,9 @@ class ReusingTextShaper final { ...@@ -186,9 +186,9 @@ class ReusingTextShaper final {
// There are also performance considerations, since template saves the overhead // There are also performance considerations, since template saves the overhead
// for condition checking and branching. // for condition checking and branching.
template <typename ItemsBuilder> template <typename ItemsBuilder>
void CollectInlinesInternal(LayoutBlockFlow* block, void CollectInlinesInternal(ItemsBuilder* builder,
ItemsBuilder* builder,
const NGInlineNodeData* previous_data) { const NGInlineNodeData* previous_data) {
LayoutBlockFlow* const block = builder->GetLayoutBlockFlow();
builder->EnterBlock(block->Style()); builder->EnterBlock(block->Style());
LayoutObject* node = GetLayoutObjectForFirstChildNode(block); LayoutObject* node = GetLayoutObjectForFirstChildNode(block);
...@@ -693,11 +693,11 @@ bool NGInlineNode::SetTextWithOffset(LayoutText* layout_text, ...@@ -693,11 +693,11 @@ bool NGInlineNode::SetTextWithOffset(LayoutText* layout_text,
NGInlineNode node(editor.GetLayoutBlockFlow()); NGInlineNode node(editor.GetLayoutBlockFlow());
NGInlineNodeData* data = node.MutableData(); NGInlineNodeData* data = node.MutableData();
data->items.ReserveCapacity(previous_data->items.size()); data->items.ReserveCapacity(previous_data->items.size());
NGInlineItemsBuilder builder(&data->items); NGInlineItemsBuilder builder(editor.GetLayoutBlockFlow(), &data->items);
// TODO(yosin): We should reuse before/after |layout_text| during collecting // TODO(yosin): We should reuse before/after |layout_text| during collecting
// inline items. // inline items.
layout_text->ClearInlineItems(); layout_text->ClearInlineItems();
CollectInlinesInternal(node.GetLayoutBlockFlow(), &builder, previous_data); CollectInlinesInternal(&builder, previous_data);
builder.DidFinishCollectInlines(data); builder.DidFinishCollectInlines(data);
// Relocates |ShapeResult| in |previous_data| after |offset|+|length| // Relocates |ShapeResult| in |previous_data| after |offset|+|length|
editor.Run(); editor.Run();
...@@ -737,10 +737,10 @@ void NGInlineNode::ComputeOffsetMapping(LayoutBlockFlow* layout_block_flow, ...@@ -737,10 +737,10 @@ void NGInlineNode::ComputeOffsetMapping(LayoutBlockFlow* layout_block_flow,
// |builder| not construct items and text content. // |builder| not construct items and text content.
Vector<NGInlineItem> items; Vector<NGInlineItem> items;
items.ReserveCapacity(EstimateInlineItemsCount(*layout_block_flow)); items.ReserveCapacity(EstimateInlineItemsCount(*layout_block_flow));
NGInlineItemsBuilderForOffsetMapping builder(&items); NGInlineItemsBuilderForOffsetMapping builder(layout_block_flow, &items);
builder.GetOffsetMappingBuilder().ReserveCapacity( builder.GetOffsetMappingBuilder().ReserveCapacity(
EstimateOffsetMappingItemsCount(*layout_block_flow)); EstimateOffsetMappingItemsCount(*layout_block_flow));
CollectInlinesInternal(layout_block_flow, &builder, nullptr); CollectInlinesInternal(&builder, nullptr);
// For non-NG object, we need the text, and also the inline items to resolve // For non-NG object, we need the text, and also the inline items to resolve
// bidi levels. Otherwise |data| already has the text from the pre-layout // bidi levels. Otherwise |data| already has the text from the pre-layout
...@@ -803,8 +803,8 @@ void NGInlineNode::CollectInlines(NGInlineNodeData* data, ...@@ -803,8 +803,8 @@ void NGInlineNode::CollectInlines(NGInlineNodeData* data,
block->WillCollectInlines(); block->WillCollectInlines();
data->items.ReserveCapacity(EstimateInlineItemsCount(*block)); data->items.ReserveCapacity(EstimateInlineItemsCount(*block));
NGInlineItemsBuilder builder(&data->items); NGInlineItemsBuilder builder(block, &data->items);
CollectInlinesInternal(block, &builder, previous_data); CollectInlinesInternal(&builder, previous_data);
builder.DidFinishCollectInlines(data); builder.DidFinishCollectInlines(data);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment