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 {
public:
// Create a builder that appends items to |items|.
explicit NGInlineItemsBuilderTemplate(Vector<NGInlineItem>* items)
: items_(items) {}
NGInlineItemsBuilderTemplate(LayoutBlockFlow* block_flow,
Vector<NGInlineItem>* items)
: block_flow_(block_flow), items_(items) {}
~NGInlineItemsBuilderTemplate();
LayoutBlockFlow* GetLayoutBlockFlow() const { return block_flow_; }
String ToString();
// Returns whether the items contain any Bidi controls.
......@@ -146,6 +149,7 @@ class NGInlineItemsBuilderTemplate {
private:
static bool NeedsBoxInfo();
LayoutBlockFlow* const block_flow_;
Vector<NGInlineItem>* items_;
StringBuilder text_;
......
......@@ -29,6 +29,9 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
void SetUp() override {
NGLayoutTest::SetUp();
style_ = ComputedStyle::Create();
block_flow_ = LayoutBlockFlow::CreateAnonymous(&GetDocument(), style_,
LegacyLayout::kAuto);
anonymous_objects_.push_back(block_flow_);
}
void TearDown() override {
......@@ -37,6 +40,8 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
NGLayoutTest::TearDown();
}
LayoutBlockFlow* GetLayoutBlockFlow() const { return block_flow_; }
void SetWhiteSpace(EWhiteSpace whitespace) {
style_->SetWhiteSpace(whitespace);
}
......@@ -84,7 +89,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
const String& TestAppend(Vector<Input> inputs) {
items_.clear();
Vector<LayoutText*> anonymous_objects;
NGInlineItemsBuilder builder(&items_);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items_);
for (Input& input : inputs) {
if (!input.layout_text) {
input.layout_text = LayoutText::CreateEmptyAnonymous(
......@@ -135,7 +140,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
fake_data.is_bidi_enabled_ = has_bidi_controls;
Vector<NGInlineItem> reuse_items;
NGInlineItemsBuilder reuse_builder(&reuse_items);
NGInlineItemsBuilder reuse_builder(GetLayoutBlockFlow(), &reuse_items);
for (Input& input : inputs) {
// Collect items for this LayoutObject.
DCHECK(input.layout_text);
......@@ -166,6 +171,7 @@ class NGInlineItemsBuilderTest : public NGLayoutTest {
EXPECT_EQ(text_, reuse_text);
}
LayoutBlockFlow* block_flow_ = nullptr;
Vector<NGInlineItem> items_;
String text_;
scoped_refptr<ComputedStyle> style_;
......@@ -330,7 +336,7 @@ TEST_F(NGInlineItemsBuilderTest, CollapseEastAsianWidth) {
#endif
TEST_F(NGInlineItemsBuilderTest, OpaqueToSpaceCollapsing) {
NGInlineItemsBuilder builder(&items_);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items_);
AppendText("Hello ", &builder);
builder.AppendOpaque(NGInlineItem::kBidiControl,
kFirstStrongIsolateCharacter);
......@@ -342,7 +348,7 @@ TEST_F(NGInlineItemsBuilderTest, OpaqueToSpaceCollapsing) {
}
TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) {
NGInlineItemsBuilder builder(&items_);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items_);
AppendText("Hello ", &builder);
AppendAtomicInline(&builder);
AppendText(" World", &builder);
......@@ -350,7 +356,7 @@ TEST_F(NGInlineItemsBuilderTest, CollapseAroundReplacedElement) {
}
TEST_F(NGInlineItemsBuilderTest, CollapseNewlineAfterObject) {
NGInlineItemsBuilder builder(&items_);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items_);
AppendAtomicInline(&builder);
AppendText("\n", &builder);
AppendAtomicInline(&builder);
......@@ -402,7 +408,7 @@ TEST_F(NGInlineItemsBuilderTest, IgnorablePre) {
TEST_F(NGInlineItemsBuilderTest, Empty) {
Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
scoped_refptr<ComputedStyle> block_style(ComputedStyle::Create());
builder.EnterBlock(block_style.get());
builder.ExitBlock();
......@@ -444,7 +450,7 @@ TEST_F(NGInlineItemsBuilderTest, GenerateBreakOpportunityAfterLeadingSpaces) {
TEST_F(NGInlineItemsBuilderTest, BidiBlockOverride) {
Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
scoped_refptr<ComputedStyle> block_style(ComputedStyle::Create());
block_style->SetUnicodeBidi(UnicodeBidi::kBidiOverride);
block_style->SetDirection(TextDirection::kRtl);
......@@ -474,7 +480,7 @@ static LayoutInline* CreateLayoutInline(
TEST_F(NGInlineItemsBuilderTest, BidiIsolate) {
Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
AppendText("Hello ", &builder);
LayoutInline* const isolate_rtl =
CreateLayoutInline(&GetDocument(), [](ComputedStyle* style) {
......@@ -499,7 +505,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolate) {
TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) {
Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
AppendText("Hello ", &builder);
LayoutInline* const isolate_override_rtl =
CreateLayoutInline(&GetDocument(), [](ComputedStyle* style) {
......@@ -524,7 +530,7 @@ TEST_F(NGInlineItemsBuilderTest, BidiIsolateOverride) {
TEST_F(NGInlineItemsBuilderTest, HasRuby) {
Vector<NGInlineItem> items;
NGInlineItemsBuilder builder(&items);
NGInlineItemsBuilder builder(GetLayoutBlockFlow(), &items);
EXPECT_FALSE(HasRuby(builder)) << "has_ruby_ should be false initially.";
AppendText("Hello ", &builder);
......
......@@ -186,9 +186,9 @@ class ReusingTextShaper final {
// There are also performance considerations, since template saves the overhead
// for condition checking and branching.
template <typename ItemsBuilder>
void CollectInlinesInternal(LayoutBlockFlow* block,
ItemsBuilder* builder,
void CollectInlinesInternal(ItemsBuilder* builder,
const NGInlineNodeData* previous_data) {
LayoutBlockFlow* const block = builder->GetLayoutBlockFlow();
builder->EnterBlock(block->Style());
LayoutObject* node = GetLayoutObjectForFirstChildNode(block);
......@@ -693,11 +693,11 @@ bool NGInlineNode::SetTextWithOffset(LayoutText* layout_text,
NGInlineNode node(editor.GetLayoutBlockFlow());
NGInlineNodeData* data = node.MutableData();
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
// inline items.
layout_text->ClearInlineItems();
CollectInlinesInternal(node.GetLayoutBlockFlow(), &builder, previous_data);
CollectInlinesInternal(&builder, previous_data);
builder.DidFinishCollectInlines(data);
// Relocates |ShapeResult| in |previous_data| after |offset|+|length|
editor.Run();
......@@ -737,10 +737,10 @@ void NGInlineNode::ComputeOffsetMapping(LayoutBlockFlow* layout_block_flow,
// |builder| not construct items and text content.
Vector<NGInlineItem> items;
items.ReserveCapacity(EstimateInlineItemsCount(*layout_block_flow));
NGInlineItemsBuilderForOffsetMapping builder(&items);
NGInlineItemsBuilderForOffsetMapping builder(layout_block_flow, &items);
builder.GetOffsetMappingBuilder().ReserveCapacity(
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
// bidi levels. Otherwise |data| already has the text from the pre-layout
......@@ -803,8 +803,8 @@ void NGInlineNode::CollectInlines(NGInlineNodeData* data,
block->WillCollectInlines();
data->items.ReserveCapacity(EstimateInlineItemsCount(*block));
NGInlineItemsBuilder builder(&data->items);
CollectInlinesInternal(block, &builder, previous_data);
NGInlineItemsBuilder builder(block, &data->items);
CollectInlinesInternal(&builder, previous_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