Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(517)

Unified Diff: third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp

Issue 2901713002: Add TextIterator::HandlePreFormattedTextNode to wrap relevant logic (Closed)
Patch Set: Tue May 23 22:08:24 PDT 2017 Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/core/editing/iterators/TextIterator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp
diff --git a/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp b/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp
index 93268ca933c6e499123fc8de91c7db5af7237252..e20a1aa6843684f309003e099313c08d38e06b58 100644
--- a/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp
+++ b/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp
@@ -516,6 +516,60 @@ bool TextIteratorAlgorithm<Strategy>::ShouldHandleFirstLetter(
}
template <typename Strategy>
+bool TextIteratorAlgorithm<Strategy>::HandlePreFormattedTextNode() {
+ // TODO(xiaochengh): Get rid of repeated computation of these fields.
+ Text* const text_node = ToText(node_);
+ LayoutText* const layout_object = text_node->GetLayoutObject();
+ const String str = layout_object->GetText();
+
+ if (last_text_node_ended_with_collapsed_space_ &&
+ HasVisibleTextNode(layout_object)) {
+ if (!behavior_.CollapseTrailingSpace() ||
+ (offset_ > 0 && str[offset_ - 1] == ' ')) {
+ SpliceBuffer(kSpaceCharacter, text_node, 0, offset_, offset_);
+ return false;
+ }
+ }
+ if (ShouldHandleFirstLetter(*layout_object)) {
+ HandleTextNodeFirstLetter(ToLayoutTextFragment(layout_object));
+ if (first_letter_text_) {
+ const String first_letter = first_letter_text_->GetText();
+ const unsigned run_start = offset_;
+ const bool stops_in_first_letter =
+ text_node == end_container_ &&
+ end_offset_ <= static_cast<int>(first_letter.length());
+ const unsigned run_end =
+ stops_in_first_letter ? end_offset_ : first_letter.length();
+ EmitText(text_node, first_letter_text_, run_start, run_end);
+ first_letter_text_ = nullptr;
+ text_box_ = 0;
+ offset_ = run_end;
+ return stops_in_first_letter;
+ }
+ // We are here only if the DOM and/or layout trees are broken.
+ // For robustness, we should stop processing this node.
+ NOTREACHED();
+ return false;
+ }
+ if (layout_object->Style()->Visibility() != EVisibility::kVisible &&
+ !IgnoresStyleVisibility())
+ return false;
+ DCHECK_GE(static_cast<unsigned>(offset_), layout_object->TextStartOffset());
+ const unsigned run_start = offset_ - layout_object->TextStartOffset();
+ const unsigned str_length = str.length();
+ const unsigned end = (text_node == end_container_)
+ ? end_offset_ - layout_object->TextStartOffset()
+ : str_length;
+ const unsigned run_end = std::min(str_length, end);
+
+ if (run_start >= run_end)
+ return true;
+
+ EmitText(text_node, text_node->GetLayoutObject(), run_start, run_end);
+ return true;
+}
+
+template <typename Strategy>
bool TextIteratorAlgorithm<Strategy>::HandleTextNode() {
if (ExcludesAutofilledValue()) {
TextControlElement* control = EnclosingTextControl(node_);
@@ -532,54 +586,8 @@ bool TextIteratorAlgorithm<Strategy>::HandleTextNode() {
String str = layout_object->GetText();
// handle pre-formatted text
- if (!layout_object->Style()->CollapseWhiteSpace()) {
- if (last_text_node_ended_with_collapsed_space_ &&
- HasVisibleTextNode(layout_object)) {
- if (behavior_.CollapseTrailingSpace()) {
- if (offset_ > 0 && str[offset_ - 1] == ' ') {
- SpliceBuffer(kSpaceCharacter, text_node, 0, offset_, offset_);
- return false;
- }
- } else {
- SpliceBuffer(kSpaceCharacter, text_node, 0, offset_, offset_);
- return false;
- }
- }
- if (ShouldHandleFirstLetter(*layout_object)) {
- HandleTextNodeFirstLetter(ToLayoutTextFragment(layout_object));
- if (first_letter_text_) {
- String first_letter = first_letter_text_->GetText();
- const unsigned run_start = offset_;
- const bool stops_in_first_letter =
- text_node == end_container_ &&
- end_offset_ <= static_cast<int>(first_letter.length());
- const unsigned run_end =
- stops_in_first_letter ? end_offset_ : first_letter.length();
- EmitText(text_node, first_letter_text_, run_start, run_end);
- first_letter_text_ = nullptr;
- text_box_ = 0;
- offset_ = run_end;
- return stops_in_first_letter;
- }
- // We are here only if the DOM and/or layout trees are broken.
- NOTREACHED();
- }
- if (layout_object->Style()->Visibility() != EVisibility::kVisible &&
- !IgnoresStyleVisibility())
- return false;
- const unsigned run_start = offset_ - layout_object->TextStartOffset();
- const unsigned str_length = str.length();
- const unsigned end = (text_node == end_container_)
- ? end_offset_ - layout_object->TextStartOffset()
- : INT_MAX;
- const unsigned run_end = std::min(str_length, end);
-
- if (run_start >= run_end)
- return true;
-
- EmitText(text_node, text_node->GetLayoutObject(), run_start, run_end);
- return true;
- }
+ if (!layout_object->Style()->CollapseWhiteSpace())
+ return HandlePreFormattedTextNode();
if (layout_object->FirstTextBox())
text_box_ = layout_object->FirstTextBox();
« no previous file with comments | « third_party/WebKit/Source/core/editing/iterators/TextIterator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698