| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/spellchecker/spellcheck_custom_dictionary.h" | 5 #include "chrome/browser/spellchecker/spellcheck_custom_dictionary.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 base::TrimWhitespaceASCII(word, base::TRIM_ALL, &tmp); | 89 base::TrimWhitespaceASCII(word, base::TRIM_ALL, &tmp); |
| 90 } | 90 } |
| 91 | 91 |
| 92 // Removes duplicate and invalid words from |to_add| word list. Looks for | 92 // Removes duplicate and invalid words from |to_add| word list. Looks for |
| 93 // duplicates in both |to_add| and |existing| word lists. Returns a bitmap of | 93 // duplicates in both |to_add| and |existing| word lists. Returns a bitmap of |
| 94 // |ChangeSanitationResult| values. | 94 // |ChangeSanitationResult| values. |
| 95 int SanitizeWordsToAdd(const std::set<std::string>& existing, | 95 int SanitizeWordsToAdd(const std::set<std::string>& existing, |
| 96 std::set<std::string>* to_add) { | 96 std::set<std::string>* to_add) { |
| 97 DCHECK(to_add); | 97 DCHECK(to_add); |
| 98 // Do not add duplicate words. | 98 // Do not add duplicate words. |
| 99 std::set<std::string> new_words = | 99 std::vector<std::string> new_words = |
| 100 base::STLSetDifference<std::set<std::string>>(*to_add, existing); | 100 base::STLSetDifference<std::vector<std::string>>(*to_add, existing); |
| 101 int result = VALID_CHANGE; | 101 int result = VALID_CHANGE; |
| 102 if (to_add->size() != new_words.size()) | 102 if (to_add->size() != new_words.size()) |
| 103 result |= DETECTED_DUPLICATE_WORDS; | 103 result |= DETECTED_DUPLICATE_WORDS; |
| 104 // Do not add invalid words. | 104 // Do not add invalid words. |
| 105 std::set<std::string> valid_new_words; | 105 std::set<std::string> valid_new_words; |
| 106 for (const std::string& word : new_words) { | 106 for (const auto& word : new_words) { |
| 107 if (IsValidWord(word)) | 107 if (IsValidWord(word)) |
| 108 valid_new_words.insert(valid_new_words.end(), word); | 108 valid_new_words.insert(valid_new_words.end(), word); |
| 109 } | 109 } |
| 110 if (valid_new_words.size() != new_words.size()) | 110 if (valid_new_words.size() != new_words.size()) |
| 111 result |= DETECTED_INVALID_WORDS; | 111 result |= DETECTED_INVALID_WORDS; |
| 112 // Save the sanitized words to be added. | 112 // Save the sanitized words to be added. |
| 113 std::swap(*to_add, valid_new_words); | 113 std::swap(*to_add, valid_new_words); |
| 114 return result; | 114 return result; |
| 115 } | 115 } |
| 116 | 116 |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 DCHECK_EQ(syncer::DICTIONARY, type); | 326 DCHECK_EQ(syncer::DICTIONARY, type); |
| 327 sync_processor_.reset(); | 327 sync_processor_.reset(); |
| 328 sync_error_handler_.reset(); | 328 sync_error_handler_.reset(); |
| 329 } | 329 } |
| 330 | 330 |
| 331 syncer::SyncDataList SpellcheckCustomDictionary::GetAllSyncData( | 331 syncer::SyncDataList SpellcheckCustomDictionary::GetAllSyncData( |
| 332 syncer::ModelType type) const { | 332 syncer::ModelType type) const { |
| 333 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 333 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 334 DCHECK_EQ(syncer::DICTIONARY, type); | 334 DCHECK_EQ(syncer::DICTIONARY, type); |
| 335 syncer::SyncDataList data; | 335 syncer::SyncDataList data; |
| 336 std::string word; | |
| 337 size_t i = 0; | 336 size_t i = 0; |
| 338 for (auto it = words_.begin(); | 337 for (const auto& word : words_) { |
| 339 it != words_.end() && | 338 if (i++ >= chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS) |
| 340 i < chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS; | 339 break; |
| 341 ++it, ++i) { | |
| 342 word = *it; | |
| 343 sync_pb::EntitySpecifics specifics; | 340 sync_pb::EntitySpecifics specifics; |
| 344 specifics.mutable_dictionary()->set_word(word); | 341 specifics.mutable_dictionary()->set_word(word); |
| 345 data.push_back(syncer::SyncData::CreateLocalData(word, word, specifics)); | 342 data.push_back(syncer::SyncData::CreateLocalData(word, word, specifics)); |
| 346 } | 343 } |
| 347 return data; | 344 return data; |
| 348 } | 345 } |
| 349 | 346 |
| 350 syncer::SyncError SpellcheckCustomDictionary::ProcessSyncChanges( | 347 syncer::SyncError SpellcheckCustomDictionary::ProcessSyncChanges( |
| 351 const tracked_objects::Location& from_here, | 348 const tracked_objects::Location& from_here, |
| 352 const syncer::SyncChangeList& change_list) { | 349 const syncer::SyncChangeList& change_list) { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 fix_invalid_file_.callback()); | 435 fix_invalid_file_.callback()); |
| 439 } | 436 } |
| 440 } | 437 } |
| 441 | 438 |
| 442 void SpellcheckCustomDictionary::Apply(const Change& dictionary_change) { | 439 void SpellcheckCustomDictionary::Apply(const Change& dictionary_change) { |
| 443 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 440 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 444 if (!dictionary_change.to_add().empty()) { | 441 if (!dictionary_change.to_add().empty()) { |
| 445 words_.insert(dictionary_change.to_add().begin(), | 442 words_.insert(dictionary_change.to_add().begin(), |
| 446 dictionary_change.to_add().end()); | 443 dictionary_change.to_add().end()); |
| 447 } | 444 } |
| 448 if (!dictionary_change.to_remove().empty()) { | 445 for (const auto& word : dictionary_change.to_remove()) |
| 449 std::set<std::string> updated_words = | 446 words_.erase(word); |
| 450 base::STLSetDifference<std::set<std::string>>( | |
| 451 words_, dictionary_change.to_remove()); | |
| 452 std::swap(words_, updated_words); | |
| 453 } | |
| 454 } | 447 } |
| 455 | 448 |
| 456 void SpellcheckCustomDictionary::FixInvalidFile( | 449 void SpellcheckCustomDictionary::FixInvalidFile( |
| 457 scoped_ptr<LoadFileResult> load_file_result) { | 450 scoped_ptr<LoadFileResult> load_file_result) { |
| 458 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 451 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 459 BrowserThread::PostTask( | 452 BrowserThread::PostTask( |
| 460 BrowserThread::FILE, FROM_HERE, | 453 BrowserThread::FILE, FROM_HERE, |
| 461 base::Bind(&SavePassedWordsToDictionaryFileReliably, | 454 base::Bind(&SavePassedWordsToDictionaryFileReliably, |
| 462 custom_dictionary_path_, base::Passed(&load_file_result))); | 455 custom_dictionary_path_, base::Passed(&load_file_result))); |
| 463 } | 456 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 486 static_cast<int>( | 479 static_cast<int>( |
| 487 chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS) - | 480 chrome::spellcheck_common::MAX_SYNCABLE_DICTIONARY_WORDS) - |
| 488 server_size); | 481 server_size); |
| 489 int upload_size = std::min( | 482 int upload_size = std::min( |
| 490 static_cast<int>(dictionary_change.to_add().size()), | 483 static_cast<int>(dictionary_change.to_add().size()), |
| 491 max_upload_size); | 484 max_upload_size); |
| 492 | 485 |
| 493 syncer::SyncChangeList sync_change_list; | 486 syncer::SyncChangeList sync_change_list; |
| 494 int i = 0; | 487 int i = 0; |
| 495 | 488 |
| 496 for (auto it = dictionary_change.to_add().begin(); | 489 for (const auto& word : dictionary_change.to_add()) { |
| 497 it != dictionary_change.to_add().end() && i < upload_size; ++it, ++i) { | 490 if (i++ >= upload_size) |
| 498 const std::string& word = *it; | 491 break; |
| 499 sync_pb::EntitySpecifics specifics; | 492 sync_pb::EntitySpecifics specifics; |
| 500 specifics.mutable_dictionary()->set_word(word); | 493 specifics.mutable_dictionary()->set_word(word); |
| 501 sync_change_list.push_back(syncer::SyncChange( | 494 sync_change_list.push_back(syncer::SyncChange( |
| 502 FROM_HERE, syncer::SyncChange::ACTION_ADD, | 495 FROM_HERE, syncer::SyncChange::ACTION_ADD, |
| 503 syncer::SyncData::CreateLocalData(word, word, specifics))); | 496 syncer::SyncData::CreateLocalData(word, word, specifics))); |
| 504 } | 497 } |
| 505 | 498 |
| 506 for (const std::string& word : dictionary_change.to_remove()) { | 499 for (const std::string& word : dictionary_change.to_remove()) { |
| 507 sync_pb::EntitySpecifics specifics; | 500 sync_pb::EntitySpecifics specifics; |
| 508 specifics.mutable_dictionary()->set_word(word); | 501 specifics.mutable_dictionary()->set_word(word); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 526 } | 519 } |
| 527 | 520 |
| 528 void SpellcheckCustomDictionary::Notify(const Change& dictionary_change) { | 521 void SpellcheckCustomDictionary::Notify(const Change& dictionary_change) { |
| 529 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 522 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 530 if (!IsLoaded() || dictionary_change.empty()) | 523 if (!IsLoaded() || dictionary_change.empty()) |
| 531 return; | 524 return; |
| 532 FOR_EACH_OBSERVER(Observer, | 525 FOR_EACH_OBSERVER(Observer, |
| 533 observers_, | 526 observers_, |
| 534 OnCustomDictionaryChanged(dictionary_change)); | 527 OnCustomDictionaryChanged(dictionary_change)); |
| 535 } | 528 } |
| OLD | NEW |