Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef NGInlineItemsBuilder_h | 5 #ifndef NGInlineItemsBuilder_h |
| 6 #define NGInlineItemsBuilder_h | 6 #define NGInlineItemsBuilder_h |
| 7 | 7 |
| 8 #include "core/CoreExport.h" | 8 #include "core/CoreExport.h" |
| 9 #include "core/layout/ng/inline/ng_inline_node.h" | 9 #include "core/layout/ng/inline/ng_inline_node.h" |
| 10 #include "platform/wtf/Allocator.h" | 10 #include "platform/wtf/Allocator.h" |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 34 explicit NGInlineItemsBuilder(Vector<NGInlineItem>* items) : items_(items) {} | 34 explicit NGInlineItemsBuilder(Vector<NGInlineItem>* items) : items_(items) {} |
| 35 ~NGInlineItemsBuilder(); | 35 ~NGInlineItemsBuilder(); |
| 36 | 36 |
| 37 String ToString(); | 37 String ToString(); |
| 38 | 38 |
| 39 void SetIsSVGText(bool value) { is_svgtext_ = value; } | 39 void SetIsSVGText(bool value) { is_svgtext_ = value; } |
| 40 | 40 |
| 41 // Returns whether the items contain any Bidi controls. | 41 // Returns whether the items contain any Bidi controls. |
| 42 bool HasBidiControls() const { return has_bidi_controls_; } | 42 bool HasBidiControls() const { return has_bidi_controls_; } |
| 43 | 43 |
| 44 using AppendResult = std::pair<bool, Vector<unsigned>>; | |
| 45 | |
| 44 // Append a string. | 46 // Append a string. |
| 45 // When appending, spaces are collapsed according to CSS Text, The white space | 47 // When appending, spaces are collapsed according to CSS Text, The white space |
| 46 // processing rules | 48 // processing rules |
| 47 // https://drafts.csswg.org/css-text-3/#white-space-rules | 49 // https://drafts.csswg.org/css-text-3/#white-space-rules |
| 48 // @param style The style for the string. | 50 // @param style The style for the string. |
| 49 // If a nullptr, it should skip shaping. Atomic inlines and bidi controls use | 51 // If a nullptr, it should skip shaping. Atomic inlines and bidi controls use |
| 50 // this. | 52 // this. |
| 51 // @param LayoutObject The LayoutObject for the string. | 53 // @param LayoutObject The LayoutObject for the string. |
| 52 // If a nullptr, it does not generate BidiRun. Bidi controls use this. | 54 // If a nullptr, it does not generate BidiRun. Bidi controls use this. |
| 53 void Append(const String&, const ComputedStyle*, LayoutObject* = nullptr); | 55 // @return A pair, where the boolean denotes if the appending results in the |
| 56 // removal of a preceeding collapsible space, and the vector gives the indexes | |
| 57 // of the collapsed spaces in the appended string. | |
|
yoichio
2017/06/16 01:47:48
Does this value have enough information to build o
Xiaocheng
2017/06/16 01:59:14
Yes. The returned vector will contain the indexes
| |
| 58 AppendResult Append(const String&, | |
| 59 const ComputedStyle*, | |
| 60 LayoutObject* = nullptr); | |
| 54 | 61 |
| 55 // Append a character. | 62 // Append a character. |
| 56 // Currently this function is for adding control characters such as | 63 // Currently this function is for adding control characters such as |
| 57 // objectReplacementCharacter, and does not support all space collapsing logic | 64 // objectReplacementCharacter, and does not support all space collapsing logic |
| 58 // as its String version does. | 65 // as its String version does. |
| 59 // See the String version for using nullptr for ComputedStyle and | 66 // See the String version for using nullptr for ComputedStyle and |
| 60 // LayoutObject. | 67 // LayoutObject. |
| 61 void Append(NGInlineItem::NGInlineItemType, | 68 void Append(NGInlineItem::NGInlineItemType, |
| 62 UChar, | 69 UChar, |
| 63 const ComputedStyle* = nullptr, | 70 const ComputedStyle* = nullptr, |
| 64 LayoutObject* = nullptr); | 71 LayoutObject* = nullptr); |
| 65 | 72 |
| 66 // Append a non-character item. | 73 // Append a non-character item. |
| 67 void Append(NGInlineItem::NGInlineItemType, | 74 void Append(NGInlineItem::NGInlineItemType, |
| 68 const ComputedStyle* = nullptr, | 75 const ComputedStyle* = nullptr, |
| 69 LayoutObject* = nullptr); | 76 LayoutObject* = nullptr); |
| 70 | 77 |
| 71 // Append a Bidi control character, for LTR or RTL depends on the style. | 78 // Append a Bidi control character, for LTR or RTL depends on the style. |
| 72 void AppendBidiControl(const ComputedStyle*, UChar ltr, UChar rtl); | 79 void AppendBidiControl(const ComputedStyle*, UChar ltr, UChar rtl); |
| 73 | 80 |
| 74 void EnterBlock(const ComputedStyle*); | 81 void EnterBlock(const ComputedStyle*); |
| 75 void ExitBlock(); | 82 void ExitBlock(); |
| 76 void EnterInline(LayoutObject*); | 83 void EnterInline(LayoutObject*); |
| 77 void ExitInline(LayoutObject*); | 84 void ExitInline(LayoutObject*); |
| 78 | 85 |
| 86 // Returns true if the finalization removes a previous collapsible space. | |
| 87 bool Finalize(); | |
|
Xiaocheng
2017/06/16 00:09:44
This function is refactored out from ToString(), s
| |
| 88 | |
| 79 private: | 89 private: |
| 80 Vector<NGInlineItem>* items_; | 90 Vector<NGInlineItem>* items_; |
| 81 StringBuilder text_; | 91 StringBuilder text_; |
| 82 | 92 |
| 83 typedef struct OnExitNode { | 93 typedef struct OnExitNode { |
| 84 LayoutObject* node; | 94 LayoutObject* node; |
| 85 UChar character; | 95 UChar character; |
| 86 } OnExitNode; | 96 } OnExitNode; |
| 87 Vector<OnExitNode> exits_; | 97 Vector<OnExitNode> exits_; |
| 88 | 98 |
| 89 enum class CollapsibleSpace { kNone, kSpace, kNewline }; | 99 enum class CollapsibleSpace { kNone, kSpace, kNewline }; |
| 90 | 100 |
| 91 CollapsibleSpace last_collapsible_space_ = CollapsibleSpace::kSpace; | 101 CollapsibleSpace last_collapsible_space_ = CollapsibleSpace::kSpace; |
| 92 bool is_svgtext_ = false; | 102 bool is_svgtext_ = false; |
| 93 bool has_bidi_controls_ = false; | 103 bool has_bidi_controls_ = false; |
| 94 | 104 |
| 95 void AppendWithWhiteSpaceCollapsing(const String&, | 105 AppendResult AppendWithWhiteSpaceCollapsing(const String&, |
| 96 unsigned start, | 106 unsigned start, |
| 97 unsigned end, | 107 unsigned end, |
| 98 const ComputedStyle*, | 108 const ComputedStyle*, |
| 99 LayoutObject*); | 109 LayoutObject*); |
| 100 void AppendWithoutWhiteSpaceCollapsing(const String&, | 110 AppendResult AppendWithoutWhiteSpaceCollapsing(const String&, |
| 101 const ComputedStyle*, | 111 const ComputedStyle*, |
| 102 LayoutObject*); | 112 LayoutObject*); |
| 103 void AppendWithPreservingNewlines(const String&, | 113 AppendResult AppendWithPreservingNewlines(const String&, |
| 104 const ComputedStyle*, | 114 const ComputedStyle*, |
| 105 LayoutObject*); | 115 LayoutObject*); |
| 106 | 116 |
| 107 void AppendForcedBreak(const ComputedStyle*, LayoutObject*); | 117 // Returns if a previous collapsible space is removed. |
| 118 bool AppendForcedBreak(const ComputedStyle*, LayoutObject*); | |
| 108 | 119 |
| 109 // Because newlines may be removed depends on following characters, newlines | 120 // Because newlines may be removed depends on following characters, newlines |
| 110 // at the end of input string is not added to |text_| but instead | 121 // at the end of input string is not added to |text_| but instead |
| 111 // |has_pending_newline_| flag is set. | 122 // |has_pending_newline_| flag is set. |
| 112 // This function determines whether to add the newline or ignore. | 123 // This function determines whether to add the newline or ignore. |
| 113 void ProcessPendingNewline(const String&, const ComputedStyle*); | 124 void ProcessPendingNewline(const String&, const ComputedStyle*); |
| 114 | 125 |
| 115 // Removes the collapsible space at the end of |text_| if exists. | 126 // Removes the collapsible space at the end of |text_| if exists. Returns true |
| 116 void RemoveTrailingCollapsibleSpaceIfExists(unsigned*); | 127 // is a collapsible space is removed. |
| 128 bool RemoveTrailingCollapsibleSpaceIfExists(unsigned*); | |
| 117 void RemoveTrailingCollapsibleSpace(unsigned*); | 129 void RemoveTrailingCollapsibleSpace(unsigned*); |
| 118 | 130 |
| 119 void RemoveTrailingCollapsibleNewlineIfNeeded(unsigned*, | 131 // Returns true if a collapsible newline is removed. |
| 132 bool RemoveTrailingCollapsibleNewlineIfNeeded(unsigned*, | |
| 120 const String&, | 133 const String&, |
| 121 unsigned, | 134 unsigned, |
| 122 const ComputedStyle*); | 135 const ComputedStyle*); |
| 123 | 136 |
| 124 void Enter(LayoutObject*, UChar); | 137 void Enter(LayoutObject*, UChar); |
| 125 void Exit(LayoutObject*); | 138 void Exit(LayoutObject*); |
| 126 }; | 139 }; |
| 127 | 140 |
| 128 } // namespace blink | 141 } // namespace blink |
| 129 | 142 |
| 130 #endif // NGInlineItemsBuilder_h | 143 #endif // NGInlineItemsBuilder_h |
| OLD | NEW |