| Index: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc
|
| diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc
|
| index 8533bd9907a97669386f62a25511a084d274f610..a01621dc912888df7cabb8eea436204bf3b02173 100644
|
| --- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc
|
| +++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_items_builder.cc
|
| @@ -10,12 +10,15 @@
|
|
|
| namespace blink {
|
|
|
| -NGInlineItemsBuilder::~NGInlineItemsBuilder() {
|
| +template <typename OffsetMappingBuilder>
|
| +NGInlineItemsBuilderTemplate<
|
| + OffsetMappingBuilder>::~NGInlineItemsBuilderTemplate() {
|
| DCHECK_EQ(0u, exits_.size());
|
| DCHECK_EQ(text_.length(), items_->IsEmpty() ? 0 : items_->back().EndOffset());
|
| }
|
|
|
| -String NGInlineItemsBuilder::ToString() {
|
| +template <typename OffsetMappingBuilder>
|
| +String NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::ToString() {
|
| // Segment Break Transformation Rules[1] defines to keep trailing new lines,
|
| // but it will be removed in Phase II[2]. We prefer not to add trailing new
|
| // lines and collapsible spaces in Phase I.
|
| @@ -123,9 +126,11 @@ static inline bool IsControlItemCharacter(UChar c) {
|
| return c == kTabulationCharacter || c == kNewlineCharacter;
|
| }
|
|
|
| -void NGInlineItemsBuilder::Append(const String& string,
|
| - const ComputedStyle* style,
|
| - LayoutObject* layout_object) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::Append(
|
| + const String& string,
|
| + const ComputedStyle* style,
|
| + LayoutObject* layout_object) {
|
| if (string.IsEmpty())
|
| return;
|
| text_.ReserveCapacity(string.length());
|
| @@ -140,12 +145,13 @@ void NGInlineItemsBuilder::Append(const String& string,
|
| layout_object);
|
| }
|
|
|
| -void NGInlineItemsBuilder::AppendWithWhiteSpaceCollapsing(
|
| - const String& string,
|
| - unsigned start,
|
| - unsigned end,
|
| - const ComputedStyle* style,
|
| - LayoutObject* layout_object) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::
|
| + AppendWithWhiteSpaceCollapsing(const String& string,
|
| + unsigned start,
|
| + unsigned end,
|
| + const ComputedStyle* style,
|
| + LayoutObject* layout_object) {
|
| unsigned start_offset = text_.length();
|
| for (unsigned i = start; i < end;) {
|
| UChar c = string[i];
|
| @@ -193,10 +199,11 @@ void NGInlineItemsBuilder::AppendWithWhiteSpaceCollapsing(
|
|
|
| // Even when without whitespace collapsing, control characters (newlines and
|
| // tabs) are in their own control items to make the line breaker easier.
|
| -void NGInlineItemsBuilder::AppendWithoutWhiteSpaceCollapsing(
|
| - const String& string,
|
| - const ComputedStyle* style,
|
| - LayoutObject* layout_object) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::
|
| + AppendWithoutWhiteSpaceCollapsing(const String& string,
|
| + const ComputedStyle* style,
|
| + LayoutObject* layout_object) {
|
| for (unsigned start = 0; start < string.length();) {
|
| UChar c = string[start];
|
| if (IsControlItemCharacter(c)) {
|
| @@ -218,10 +225,11 @@ void NGInlineItemsBuilder::AppendWithoutWhiteSpaceCollapsing(
|
| last_collapsible_space_ = CollapsibleSpace::kNone;
|
| }
|
|
|
| -void NGInlineItemsBuilder::AppendWithPreservingNewlines(
|
| - const String& string,
|
| - const ComputedStyle* style,
|
| - LayoutObject* layout_object) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::
|
| + AppendWithPreservingNewlines(const String& string,
|
| + const ComputedStyle* style,
|
| + LayoutObject* layout_object) {
|
| for (unsigned start = 0; start < string.length();) {
|
| if (string[start] == kNewlineCharacter) {
|
| AppendForcedBreak(style, layout_object);
|
| @@ -237,8 +245,10 @@ void NGInlineItemsBuilder::AppendWithPreservingNewlines(
|
| }
|
| }
|
|
|
| -void NGInlineItemsBuilder::AppendForcedBreak(const ComputedStyle* style,
|
| - LayoutObject* layout_object) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::AppendForcedBreak(
|
| + const ComputedStyle* style,
|
| + LayoutObject* layout_object) {
|
| // Remove collapsible spaces immediately before a preserved newline.
|
| RemoveTrailingCollapsibleSpaceIfExists();
|
|
|
| @@ -248,10 +258,12 @@ void NGInlineItemsBuilder::AppendForcedBreak(const ComputedStyle* style,
|
| last_collapsible_space_ = CollapsibleSpace::kSpace;
|
| }
|
|
|
| -void NGInlineItemsBuilder::Append(NGInlineItem::NGInlineItemType type,
|
| - UChar character,
|
| - const ComputedStyle* style,
|
| - LayoutObject* layout_object) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::Append(
|
| + NGInlineItem::NGInlineItemType type,
|
| + UChar character,
|
| + const ComputedStyle* style,
|
| + LayoutObject* layout_object) {
|
| DCHECK_NE(character, kSpaceCharacter);
|
| DCHECK_NE(character, kZeroWidthSpaceCharacter);
|
|
|
| @@ -261,26 +273,31 @@ void NGInlineItemsBuilder::Append(NGInlineItem::NGInlineItemType type,
|
| last_collapsible_space_ = CollapsibleSpace::kNone;
|
| }
|
|
|
| -void NGInlineItemsBuilder::AppendOpaque(NGInlineItem::NGInlineItemType type,
|
| - UChar character) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::AppendOpaque(
|
| + NGInlineItem::NGInlineItemType type,
|
| + UChar character) {
|
| text_.Append(character);
|
| unsigned end_offset = text_.length();
|
| AppendItem(items_, type, end_offset - 1, end_offset, nullptr, nullptr);
|
| }
|
|
|
| -void NGInlineItemsBuilder::AppendOpaque(NGInlineItem::NGInlineItemType type,
|
| - const ComputedStyle* style,
|
| - LayoutObject* layout_object) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::AppendOpaque(
|
| + NGInlineItem::NGInlineItemType type,
|
| + const ComputedStyle* style,
|
| + LayoutObject* layout_object) {
|
| unsigned end_offset = text_.length();
|
| AppendItem(items_, type, end_offset, end_offset, style, layout_object);
|
| }
|
|
|
| // Removes the collapsible newline at the end of |text_| if exists and the
|
| // removal conditions met.
|
| -void NGInlineItemsBuilder::RemoveTrailingCollapsibleNewlineIfNeeded(
|
| - const String& after,
|
| - unsigned after_index,
|
| - const ComputedStyle* after_style) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::
|
| + RemoveTrailingCollapsibleNewlineIfNeeded(const String& after,
|
| + unsigned after_index,
|
| + const ComputedStyle* after_style) {
|
| DCHECK_EQ(last_collapsible_space_, CollapsibleSpace::kNewline);
|
|
|
| if (text_.IsEmpty() || text_[text_.length() - 1] != kSpaceCharacter)
|
| @@ -298,7 +315,9 @@ void NGInlineItemsBuilder::RemoveTrailingCollapsibleNewlineIfNeeded(
|
| }
|
|
|
| // Removes the collapsible space at the end of |text_| if exists.
|
| -void NGInlineItemsBuilder::RemoveTrailingCollapsibleSpaceIfExists() {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<
|
| + OffsetMappingBuilder>::RemoveTrailingCollapsibleSpaceIfExists() {
|
| if (last_collapsible_space_ == CollapsibleSpace::kNone || text_.IsEmpty())
|
| return;
|
|
|
| @@ -320,7 +339,9 @@ void NGInlineItemsBuilder::RemoveTrailingCollapsibleSpaceIfExists() {
|
| }
|
|
|
| // Removes the collapsible space at the specified index.
|
| -void NGInlineItemsBuilder::RemoveTrailingCollapsibleSpace(unsigned index) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<
|
| + OffsetMappingBuilder>::RemoveTrailingCollapsibleSpace(unsigned index) {
|
| DCHECK_NE(last_collapsible_space_, CollapsibleSpace::kNone);
|
| DCHECK(!text_.IsEmpty());
|
| DCHECK_EQ(text_[index], kSpaceCharacter);
|
| @@ -350,14 +371,18 @@ void NGInlineItemsBuilder::RemoveTrailingCollapsibleSpace(unsigned index) {
|
| }
|
| }
|
|
|
| -void NGInlineItemsBuilder::AppendBidiControl(const ComputedStyle* style,
|
| - UChar ltr,
|
| - UChar rtl) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::AppendBidiControl(
|
| + const ComputedStyle* style,
|
| + UChar ltr,
|
| + UChar rtl) {
|
| AppendOpaque(NGInlineItem::kBidiControl,
|
| IsLtr(style->Direction()) ? ltr : rtl);
|
| }
|
|
|
| -void NGInlineItemsBuilder::EnterBlock(const ComputedStyle* style) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::EnterBlock(
|
| + const ComputedStyle* style) {
|
| // Handle bidi-override on the block itself.
|
| switch (style->GetUnicodeBidi()) {
|
| case UnicodeBidi::kNormal:
|
| @@ -384,7 +409,9 @@ void NGInlineItemsBuilder::EnterBlock(const ComputedStyle* style) {
|
| }
|
| }
|
|
|
| -void NGInlineItemsBuilder::EnterInline(LayoutObject* node) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::EnterInline(
|
| + LayoutObject* node) {
|
| // https://drafts.csswg.org/css-writing-modes-3/#bidi-control-codes-injection-table
|
| const ComputedStyle* style = node->Style();
|
| switch (style->GetUnicodeBidi()) {
|
| @@ -421,16 +448,22 @@ void NGInlineItemsBuilder::EnterInline(LayoutObject* node) {
|
| AppendOpaque(NGInlineItem::kOpenTag, style, node);
|
| }
|
|
|
| -void NGInlineItemsBuilder::Enter(LayoutObject* node, UChar character_to_exit) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::Enter(
|
| + LayoutObject* node,
|
| + UChar character_to_exit) {
|
| exits_.push_back(OnExitNode{node, character_to_exit});
|
| has_bidi_controls_ = true;
|
| }
|
|
|
| -void NGInlineItemsBuilder::ExitBlock() {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::ExitBlock() {
|
| Exit(nullptr);
|
| }
|
|
|
| -void NGInlineItemsBuilder::ExitInline(LayoutObject* node) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::ExitInline(
|
| + LayoutObject* node) {
|
| DCHECK(node);
|
|
|
| AppendOpaque(NGInlineItem::kCloseTag, node->Style(), node);
|
| @@ -438,11 +471,16 @@ void NGInlineItemsBuilder::ExitInline(LayoutObject* node) {
|
| Exit(node);
|
| }
|
|
|
| -void NGInlineItemsBuilder::Exit(LayoutObject* node) {
|
| +template <typename OffsetMappingBuilder>
|
| +void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::Exit(
|
| + LayoutObject* node) {
|
| while (!exits_.IsEmpty() && exits_.back().node == node) {
|
| AppendOpaque(NGInlineItem::kBidiControl, exits_.back().character);
|
| exits_.pop_back();
|
| }
|
| }
|
|
|
| +template class CORE_TEMPLATE_EXPORT
|
| + NGInlineItemsBuilderTemplate<EmptyOffsetMappingBuilder>;
|
| +
|
| } // namespace blink
|
|
|