Chromium Code Reviews| Index: third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
| diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
| index 71a48a56cc62fbfd9098153f1efa18d809a453f9..43b12a381dc175c6fdc30ed1b6909848b3ebae2d 100644 |
| --- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
| +++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
| @@ -802,17 +802,38 @@ void SpellChecker::ReplaceMisspelledRange(const String& text) { |
| .ToNormalizedEphemeralRange(); |
| if (caret_range.IsNull()) |
| return; |
| - DocumentMarkerVector markers = |
| - GetFrame().GetDocument()->Markers().MarkersInRange( |
| - caret_range, DocumentMarker::MisspellingMarkers()); |
| - if (markers.size() < 1 || |
| - markers[0]->StartOffset() >= markers[0]->EndOffset()) |
| + |
| + Node* caret_start_container = |
|
yosin_UTC9
2017/05/11 04:36:02
nit: s/Node*/Node* const/
|
| + caret_range.StartPosition().ComputeContainerNode(); |
| + Node* caret_end_container = caret_range.EndPosition().ComputeContainerNode(); |
|
yosin_UTC9
2017/05/11 04:36:02
nit: s/Node*/Node* const/
|
| + |
| + // We don't currently support the case where a misspelling spans multiple |
| + // nodes |
| + if (caret_start_container != caret_end_container) |
| return; |
| + |
| + const unsigned caret_start_offset = |
| + caret_range.StartPosition().ComputeOffsetInContainerNode(); |
| + const unsigned caret_end_offset = |
| + caret_range.EndPosition().ComputeOffsetInContainerNode(); |
| + |
| + const DocumentMarkerVector& markers_in_node = |
| + GetFrame().GetDocument()->Markers().MarkersFor( |
| + caret_start_container, DocumentMarker::MisspellingMarkers()); |
| + |
| + const auto marker_it = |
| + std::find_if(markers_in_node.begin(), markers_in_node.end(), |
| + [=](const DocumentMarker* marker) { |
| + return marker->StartOffset() < caret_end_offset && |
| + marker->EndOffset() > caret_start_offset; |
| + }); |
| + if (marker_it == markers_in_node.end()) |
| + return; |
| + |
| + const DocumentMarker* found_marker = *marker_it; |
| EphemeralRange marker_range = EphemeralRange( |
| - Position(caret_range.StartPosition().ComputeContainerNode(), |
| - markers[0]->StartOffset()), |
| - Position(caret_range.EndPosition().ComputeContainerNode(), |
| - markers[0]->EndOffset())); |
| + Position(caret_start_container, found_marker->StartOffset()), |
| + Position(caret_start_container, found_marker->EndOffset())); |
| if (marker_range.IsNull()) |
| return; |