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..bd6fad960936c59028da2e15856885b717236563 100644 |
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp |
@@ -802,17 +802,39 @@ 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* const caret_start_container = |
+ caret_range.StartPosition().ComputeContainerNode(); |
+ Node* const caret_end_container = |
+ caret_range.EndPosition().ComputeContainerNode(); |
+ |
+ // 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; |