| Index: chrome/renderer/spellchecker/spellcheck.cc
|
| diff --git a/chrome/renderer/spellchecker/spellcheck.cc b/chrome/renderer/spellchecker/spellcheck.cc
|
| index e2d505500fe58625388e13c1c045d6e64f2be76b..71ab38df8e8cf4e0b1672cd97f4d810a6a62d756 100644
|
| --- a/chrome/renderer/spellchecker/spellcheck.cc
|
| +++ b/chrome/renderer/spellchecker/spellcheck.cc
|
| @@ -172,6 +172,32 @@ SpellCheck::SpellCheck()
|
| SpellCheck::~SpellCheck() {
|
| }
|
|
|
| +void SpellCheck::FillSuggestions(
|
| + const std::vector<std::vector<base::string16>>& suggestions_list,
|
| + std::vector<base::string16>* optional_suggestions) {
|
| + // A vector containing the indices of the current suggestion for each
|
| + // language's suggestion list.
|
| + std::vector<size_t> indices(suggestions_list.size(), 0);
|
| + // Take one suggestion at a time from each language's suggestions and add it
|
| + // to |optional_suggestions|.
|
| + for (size_t i = 0, num_empty = 0;
|
| + num_empty < suggestions_list.size() &&
|
| + optional_suggestions->size() <
|
| + chrome::spellcheck_common::kMaxSuggestions;
|
| + i = (i + 1) % suggestions_list.size()) {
|
| + if (indices[i] < suggestions_list[i].size()) {
|
| + const base::string16& suggestion = suggestions_list[i][indices[i]];
|
| + // Only add the suggestion if it's unique.
|
| + if (std::find(optional_suggestions->begin(), optional_suggestions->end(),
|
| + suggestion) == optional_suggestions->end()) {
|
| + optional_suggestions->push_back(suggestion);
|
| + }
|
| + if (++indices[i] == suggestions_list[i].size())
|
| + num_empty++;
|
| + }
|
| + }
|
| +}
|
| +
|
| bool SpellCheck::OnControlMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(SpellCheck, message)
|
| @@ -264,6 +290,12 @@ bool SpellCheck::SpellCheckWord(
|
| int possible_misspelling_len;
|
| // The longest sequence of text that all languages agree is skippable.
|
| int agreed_skippable_len;
|
| + // A vector of vectors containing spelling suggestions from different
|
| + // languages.
|
| + std::vector<std::vector<base::string16>> suggestions_list;
|
| + // A vector to hold a language's misspelling suggestions between spellcheck
|
| + // calls.
|
| + std::vector<base::string16> language_suggestions;
|
|
|
| // This loop only advances if all languages agree that a sequence of text is
|
| // skippable.
|
| @@ -274,18 +306,17 @@ bool SpellCheck::SpellCheckWord(
|
| agreed_skippable_len = text_length;
|
| *misspelling_start = 0;
|
| *misspelling_len = 0;
|
| -
|
| - if (optional_suggestions)
|
| - optional_suggestions->clear();
|
| + suggestions_list.clear();
|
|
|
| for (ScopedVector<SpellcheckLanguage>::iterator language =
|
| languages_.begin();
|
| language != languages_.end();) {
|
| + language_suggestions.clear();
|
| SpellcheckLanguage::SpellcheckWordResult result =
|
| - (*language)->SpellCheckWord(text_begin, position_in_text, text_length,
|
| - tag, &possible_misspelling_start,
|
| - &possible_misspelling_len,
|
| - optional_suggestions);
|
| + (*language)->SpellCheckWord(
|
| + text_begin, position_in_text, text_length, tag,
|
| + &possible_misspelling_start, &possible_misspelling_len,
|
| + optional_suggestions ? &language_suggestions : nullptr);
|
|
|
| switch (result) {
|
| case SpellcheckLanguage::SpellcheckWordResult::IS_CORRECT:
|
| @@ -301,6 +332,7 @@ bool SpellCheck::SpellCheckWord(
|
| if (position_in_text != possible_misspelling_start) {
|
| *misspelling_len = 0;
|
| position_in_text = possible_misspelling_start;
|
| + suggestions_list.clear();
|
| language = languages_.begin();
|
| } else {
|
| language++;
|
| @@ -312,17 +344,25 @@ bool SpellCheck::SpellCheckWord(
|
| // If true, this means the spellchecker moved past a word that was
|
| // previously determined to be misspelled or skippable, which means
|
| // another spellcheck language marked it as correct.
|
| - language = position_in_text != *misspelling_start ? languages_.begin()
|
| - : language + 1;
|
| - position_in_text = *misspelling_start;
|
| + if (position_in_text != *misspelling_start) {
|
| + suggestions_list.clear();
|
| + language = languages_.begin();
|
| + position_in_text = *misspelling_start;
|
| + } else {
|
| + suggestions_list.push_back(language_suggestions);
|
| + language++;
|
| + }
|
| break;
|
| }
|
| }
|
|
|
| // If |*misspelling_len| is non-zero, that means at least one language
|
| // marked a word misspelled and no other language considered it correct.
|
| - if (*misspelling_len != 0)
|
| + if (*misspelling_len != 0) {
|
| + if (optional_suggestions)
|
| + FillSuggestions(suggestions_list, optional_suggestions);
|
| return false;
|
| + }
|
| }
|
|
|
| NOTREACHED();
|
|
|