Index: pdf/pdfium/pdfium_engine.cc |
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc |
index 3e8f5b4971c7882edaeda36a2909ca6df1915483..069e6b6e6484b252a9563eab5e0eb8ce666d604a 100644 |
--- a/pdf/pdfium/pdfium_engine.cc |
+++ b/pdf/pdfium/pdfium_engine.cc |
@@ -2172,8 +2172,10 @@ void PDFiumEngine::SearchUsingICU(const base::string16& term, |
bool first_search, |
int character_to_start_searching_from, |
int current_page) { |
- base::string16 page_text; |
- int text_length = pages_[current_page]->GetCharCount(); |
+ DCHECK(!term.empty()); |
+ |
+ const int original_text_length = pages_[current_page]->GetCharCount(); |
+ int text_length = original_text_length; |
if (character_to_start_searching_from) { |
text_length -= character_to_start_searching_from; |
} else if (!first_search && |
@@ -2184,6 +2186,7 @@ void PDFiumEngine::SearchUsingICU(const base::string16& term, |
if (text_length <= 0) |
return; |
+ base::string16 page_text; |
PDFiumAPIStringBufferAdapter<base::string16> api_string_adapter(&page_text, |
text_length, |
false); |
@@ -2207,6 +2210,16 @@ void PDFiumEngine::SearchUsingICU(const base::string16& term, |
int end = FPDFText_GetCharIndexFromTextIndex( |
pages_[current_page]->GetTextPage(), |
temp_start + result.length); |
+ |
+ // If |term| occurs at the end of a page, then |end| will be -1 due to the |
+ // index being out of bounds. Compensate for this case so the range |
+ // character count calculation below works out. |
+ if (temp_start + result.length == original_text_length) { |
+ DCHECK_EQ(-1, end); |
+ end = original_text_length; |
+ } |
+ DCHECK_LT(start, end); |
+ DCHECK_EQ(term.size(), static_cast<size_t>(end - start)); |
AddFindResult(PDFiumRange(pages_[current_page].get(), start, end - start)); |
} |
} |
@@ -2274,9 +2287,9 @@ bool PDFiumEngine::SelectFindResult(bool forward) { |
pp::Rect bounding_rect; |
pp::Rect visible_rect = GetVisibleRect(); |
// Use zoom of 1.0 since visible_rect is without zoom. |
- std::vector<pp::Rect> rects; |
- rects = find_results_[current_find_index_.GetIndex()].GetScreenRects( |
- pp::Point(), 1.0, current_rotation_); |
+ std::vector<pp::Rect> rects = |
+ find_results_[current_find_index_.GetIndex()].GetScreenRects( |
+ pp::Point(), 1.0, current_rotation_); |
for (const auto& rect : rects) |
bounding_rect = bounding_rect.Union(rect); |
if (!visible_rect.Contains(bounding_rect)) { |