| Index: third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
|
| diff --git a/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc b/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
|
| index d5b2d8c5e74873d6cea1953ae31ab5e2c0fa9a34..7b2af9ac5792dd0fd9a33d0971e4b8a5a5d5a613 100644
|
| --- a/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
|
| +++ b/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
|
| @@ -28,7 +28,9 @@ NGLineBuilder::NGLineBuilder(NGInlineNode* inline_box,
|
| baseline_type_(constraint_space->WritingMode() ==
|
| NGWritingMode::kHorizontalTopBottom
|
| ? FontBaseline::AlphabeticBaseline
|
| - : FontBaseline::IdeographicBaseline)
|
| + : FontBaseline::IdeographicBaseline),
|
| + container_builder_(NGPhysicalFragment::kFragmentBox, inline_box_),
|
| + container_layout_result_(nullptr)
|
| #if DCHECK_IS_ON()
|
| ,
|
| is_bidi_reordered_(false)
|
| @@ -206,7 +208,7 @@ void NGLineBuilder::BidiReorder(Vector<LineItemChunk, 32>* line_item_chunks) {
|
| void NGLineBuilder::PlaceItems(
|
| const Vector<LineItemChunk, 32>& line_item_chunks) {
|
| const Vector<NGLayoutInlineItem>& items = inline_box_->Items();
|
| - const unsigned fragment_start_index = fragments_.size();
|
| + const unsigned fragment_start_index = container_builder_.Children().size();
|
|
|
| NGFragmentBuilder text_builder(NGPhysicalFragment::kFragmentText,
|
| inline_box_);
|
| @@ -280,18 +282,16 @@ void NGLineBuilder::PlaceItems(
|
| RefPtr<NGPhysicalTextFragment> text_fragment = text_builder.ToTextFragment(
|
| line_item_chunk.index, line_item_chunk.start_offset,
|
| line_item_chunk.end_offset);
|
| - fragments_.push_back(std::move(text_fragment));
|
|
|
| NGLogicalOffset logical_offset(
|
| line_box_data.inline_size + current_opportunity_.InlineStartOffset() -
|
| ConstraintSpace().BfcOffset().inline_offset,
|
| top);
|
| - offsets_.push_back(logical_offset);
|
| + container_builder_.AddChild(std::move(text_fragment), logical_offset);
|
| line_box_data.inline_size += line_item_chunk.inline_size;
|
| }
|
| - DCHECK_EQ(fragments_.size(), offsets_.size());
|
|
|
| - if (fragment_start_index == fragments_.size()) {
|
| + if (fragment_start_index == container_builder_.Children().size()) {
|
| // The line was empty. Remove the LineBoxData.
|
| line_box_data_list_.shrink(line_box_data_list_.size() - 1);
|
| return;
|
| @@ -303,11 +303,12 @@ void NGLineBuilder::PlaceItems(
|
| line_box_data.max_ascent_and_leading) {
|
| LayoutUnit adjust_top(line_box_data.max_ascent_and_leading -
|
| block_metrics.ascent_and_leading);
|
| - for (unsigned i = fragment_start_index; i < offsets_.size(); i++)
|
| - offsets_[i].block_offset += adjust_top;
|
| + auto& offsets = container_builder_.MutableOffsets();
|
| + for (unsigned i = fragment_start_index; i < offsets.size(); i++)
|
| + offsets[i].block_offset += adjust_top;
|
| }
|
|
|
| - line_box_data.fragment_end = fragments_.size();
|
| + line_box_data.fragment_end = container_builder_.Children().size();
|
| line_box_data.top_with_leading = content_size_;
|
| max_inline_size_ = std::max(max_inline_size_, line_box_data.inline_size);
|
| content_size_ += LayoutUnit(line_box_data.max_ascent_and_leading +
|
| @@ -378,25 +379,16 @@ void NGLineBuilder::FindNextLayoutOpportunity() {
|
|
|
| RefPtr<NGLayoutResult> NGLineBuilder::CreateFragments() {
|
| DCHECK(!HasItems()) << "Must call CreateLine()";
|
| - DCHECK_EQ(fragments_.size(), offsets_.size());
|
| -
|
| - NGFragmentBuilder container_builder(NGPhysicalFragment::kFragmentBox,
|
| - inline_box_);
|
| -
|
| - for (unsigned i = 0; i < fragments_.size(); i++) {
|
| - // TODO(layout-dev): This should really be a std::move but
|
| - // CopyFragmentDataToLayoutBlockFlow also uses the fragments.
|
| - container_builder.AddChild(fragments_[i].get(), offsets_[i]);
|
| - }
|
|
|
| // TODO(kojii): Check if the line box width should be content or available.
|
| // TODO(kojii): Need to take constraint_space into account.
|
| - container_builder.SetInlineSize(max_inline_size_)
|
| + container_builder_.SetInlineSize(max_inline_size_)
|
| .SetInlineOverflow(max_inline_size_)
|
| .SetBlockSize(content_size_)
|
| .SetBlockOverflow(content_size_);
|
|
|
| - return container_builder.ToBoxFragment();
|
| + container_layout_result_ = container_builder_.ToBoxFragment();
|
| + return container_layout_result_;
|
| }
|
|
|
| void NGLineBuilder::CopyFragmentDataToLayoutBlockFlow() {
|
| @@ -407,16 +399,21 @@ void NGLineBuilder::CopyFragmentDataToLayoutBlockFlow() {
|
| Vector<unsigned, 32> text_offsets(items.size());
|
| inline_box_->GetLayoutTextOffsets(&text_offsets);
|
|
|
| - Vector<NGPhysicalFragment*, 32> fragments_for_bidi_runs;
|
| + Vector<const NGPhysicalFragment*, 32> fragments_for_bidi_runs;
|
| fragments_for_bidi_runs.reserveInitialCapacity(items.size());
|
| BidiRunList<BidiRun> bidi_runs;
|
| LineInfo line_info;
|
| unsigned fragment_index = 0;
|
| + NGPhysicalBoxFragment* box_fragment = toNGPhysicalBoxFragment(
|
| + container_layout_result_->PhysicalFragment().get());
|
| for (const auto& line_box_data : line_box_data_list_) {
|
| // Create a BidiRunList for this line.
|
| for (; fragment_index < line_box_data.fragment_end; fragment_index++) {
|
| - NGPhysicalTextFragment* text_fragment =
|
| - toNGPhysicalTextFragment(fragments_[fragment_index].get());
|
| + const NGPhysicalFragment* fragment =
|
| + box_fragment->Children()[fragment_index].get();
|
| + if (!fragment->IsText())
|
| + continue;
|
| + const auto* text_fragment = toNGPhysicalTextFragment(fragment);
|
| const NGLayoutInlineItem& item = items[text_fragment->ItemIndex()];
|
| LayoutObject* layout_object = item.GetLayoutObject();
|
| if (!layout_object) // Skip bidi controls.
|
|
|