Chromium Code Reviews| Index: chrome/browser/spellchecker/spellcheck_custom_dictionary.h |
| diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary.h b/chrome/browser/spellchecker/spellcheck_custom_dictionary.h |
| index cedbb734c2c762df57ad3b030f80f276ea0b8278..7d861a35c08ecf2fff0cae758b5cfe758b683f85 100644 |
| --- a/chrome/browser/spellchecker/spellcheck_custom_dictionary.h |
| +++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary.h |
| @@ -5,97 +5,171 @@ |
| #ifndef CHROME_BROWSER_SPELLCHECKER_SPELLCHECK_CUSTOM_DICTIONARY_H_ |
| #define CHROME_BROWSER_SPELLCHECKER_SPELLCHECK_CUSTOM_DICTIONARY_H_ |
| -#include <string> |
| -#include <vector> |
| - |
| #include "base/file_path.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/observer_list.h" |
| #include "chrome/browser/spellchecker/spellcheck_dictionary.h" |
| #include "chrome/common/spellcheck_common.h" |
| +#include "sync/api/syncable_service.h" |
| + |
| +namespace custom_dictionary { |
| + |
| +// Returns the list of words in the custom spellcheck dictionary at |path|. |
| +// Makes sure that the custom dictionary file is sorted, does not have |
| +// duplicates, and contains only valid words. Must be called on the file thread. |
| +scoped_ptr<chrome::spellcheck_common::WordList> LoadDictionary( |
|
groby-ooo-7-16
2013/01/10 19:53:03
Why are these APIs exposed? Isn't CustomDictionary
please use gerrit instead
2013/01/12 02:50:46
These APIs were used for unit-tests. I have friend
|
| + const FilePath& path); |
| + |
| +// Adds |word| to the custom spellcheck dictionary at |path|. Must be called on |
| +// the file thread. |
| +void WriteWordToCustomDictionary(const std::string& word, const FilePath& path); |
| + |
| +// Removes |word| from the custom spellcheck dictionary at |path|. Must be |
| +// called on the file thread. |
| +void EraseWordFromCustomDictionary( |
| + const std::string& word, |
| + const FilePath& path); |
| + |
| +} // namespace custom_dictionary |
| // Defines a custom dictionary where users can add their own words. All words |
| -// must be UTF8, between 1 and 128 bytes long, and without ASCII whitespace. |
| -// The dictionary contains its own checksum when saved on disk. Example |
| -// dictionary file contents: |
| +// must be UTF8, between 1 and 99 bytes long, and without ASCII whitespace. The |
| +// dictionary contains its own checksum when saved on disk. Example dictionary |
| +// file contents: |
| // |
| // bar |
| // foo |
| // checksum_v1 = ec3df4034567e59e119fcf87f2d9bad4 |
| // |
| -class SpellcheckCustomDictionary : public SpellcheckDictionary { |
| +class SpellcheckCustomDictionary : public SpellcheckDictionary, |
| + public syncer::SyncableService { |
| public: |
| + |
| + // Dictionary change. |
| + class Change { |
| + public: |
| + |
| + // Result of dictionary change. |
| + class Result { |
| + public: |
| + Result(); |
| + Result(const Result& other); |
| + ~Result(); |
| + |
| + void set_detected_invalid_words() { invalid_ = true; } |
|
groby-ooo-7-16
2013/01/10 22:04:44
As discussed - let's just make this a struct, with
please use gerrit instead
2013/01/12 02:50:46
Converted into an enum.
|
| + void set_detected_duplicate_words() { duplicate_ = true; } |
| + void set_detected_missing_words() { missing_ = true; } |
| + bool detected_invalid_words() const { return invalid_; } |
| + bool detected_duplicate_words() const { return duplicate_; } |
| + bool detected_missing_words() const { return missing_; } |
| + |
| + private: |
| + bool invalid_; |
| + bool duplicate_; |
| + bool missing_; |
| + }; |
| + |
| + Change(); |
| + explicit Change(const Change* other); |
| + ~Change(); |
| + |
| + void AddWord(const std::string& word); |
| + void RemoveWord(const std::string& word); |
| + void AddWords(const chrome::spellcheck_common::WordList* words); |
|
groby-ooo-7-16
2013/01/10 22:04:44
Since we copy those words over to internal vectors
please use gerrit instead
2013/01/12 02:50:46
Done.
|
| + void RemoveWords(const chrome::spellcheck_common::WordList* words); |
| + const chrome::spellcheck_common::WordList& to_add() const |
| + { return to_add_; } |
| + const chrome::spellcheck_common::WordList& to_remove() const |
| + { return to_remove_; } |
| + chrome::spellcheck_common::WordList& to_add() { return to_add_; } |
| + chrome::spellcheck_common::WordList& to_remove() { return to_remove_; } |
| + Result& result() { return result_; } |
| + bool empty() const { return to_add_.empty() && to_remove_.empty(); } |
| + |
| + private: |
| + Result result_; |
| + chrome::spellcheck_common::WordList to_add_; |
| + chrome::spellcheck_common::WordList to_remove_; |
| + DISALLOW_COPY_AND_ASSIGN(Change); |
| + }; |
| + |
| + // Interface to implement for dictionary change and load observers. |
| class Observer { |
| public: |
| virtual void OnCustomDictionaryLoaded() = 0; |
| - virtual void OnCustomDictionaryWordAdded(const std::string& word) = 0; |
| - virtual void OnCustomDictionaryWordRemoved(const std::string& word) = 0; |
| + virtual void OnCustomDictionaryChanged(const Change* dictionary_change) = 0; |
| }; |
| explicit SpellcheckCustomDictionary(Profile* profile); |
| virtual ~SpellcheckCustomDictionary(); |
| - // Overridden from SpellcheckDictionary: |
| - virtual void Load() OVERRIDE; |
| - |
| const chrome::spellcheck_common::WordList& GetWords() const; |
| - // Populates the |custom_words| with the list of words in the custom |
| - // dictionary file. Makes sure that the custom dictionary file is sorted, does |
| - // not have duplicates, and contains only valid words. |
| - void LoadDictionaryIntoCustomWordList( |
| - chrome::spellcheck_common::WordList* custom_words); |
| + // Adds |word| to the dictionary, schedules a write to disk, and notifies |
| + // observers of the change. |
| + Change::Result AddWord(const std::string& word); |
| - // Moves the words from the |custom_words| argument into its own private |
| - // member variable. Does not delete the memory at |custom_words|. |
| - void SetCustomWordList(chrome::spellcheck_common::WordList* custom_words); |
| + // Adds |word| to the dictionary and notifies observers of the change. |
| + Change::Result CustomWordAddedLocally(const std::string& word); |
|
groby-ooo-7-16
2013/01/10 22:04:44
Do we need the xxxLocally functions to be part of
please use gerrit instead
2013/01/12 02:50:46
*Locally() methods were used only by tests to avoi
|
| - // Adds the given word to the custom words list and informs renderers of the |
| - // update. Returns false for duplicate and invalid words. |
| - bool AddWord(const std::string& word); |
| + // Removes |word| from the dictionary, schedules a write to disk, and notifies |
| + // observers of the change. |
| + Change::Result RemoveWord(const std::string& word); |
| - // Returns false for duplicate words. |
| - bool CustomWordAddedLocally(const std::string& word); |
| + // Removes |word| from the dictionary and notifies observers of the change. |
| + Change::Result CustomWordRemovedLocally(const std::string& word); |
| - void WriteWordToCustomDictionary(const std::string& word); |
| + // Adds |observer| to be notified of dictionary events and changes. |
| + void AddObserver(Observer* observer); |
| - // Removes the given word from the custom words list and informs renderers of |
| - // the update. Returns false for words that are not in the dictionary and |
| - // invalid words. |
| - bool RemoveWord(const std::string& word); |
| + // Removes |observer| to stop notifications of dictionary events and changes. |
| + void RemoveObserver(Observer* observer); |
| - // Returns false for words that are not in the dictionary. |
| - bool CustomWordRemovedLocally(const std::string& word); |
| + // Whether the dictionary is loaded. |
| + bool IsLoaded(); |
| - void EraseWordFromCustomDictionary(const std::string& word); |
| + // Whether the dictionary is being synced. |
| + bool IsSyncing(); |
| - void AddObserver(Observer* observer); |
| - void RemoveObserver(Observer* observer); |
| + // The reply point for PostTaskAndReplyWithResult, called when |
| + // custom_dictionary::LoadDictionary finishes reading the dictionary file. |
| + void OnLoaded(scoped_ptr<chrome::spellcheck_common::WordList> custom_words); |
|
groby-ooo-7-16
2013/01/10 22:04:44
Does this need to be public?
please use gerrit instead
2013/01/12 02:50:46
Was used by unit-tests. Made private and friended
|
| + |
| + // Overridden from SpellcheckDictionary: |
| + virtual void Load() OVERRIDE; |
| + |
| + // Overridden from syncer::SyncableService: |
| + virtual syncer::SyncMergeResult MergeDataAndStartSyncing( |
| + syncer::ModelType type, |
| + const syncer::SyncDataList& initial_sync_data, |
| + scoped_ptr<syncer::SyncChangeProcessor> sync_processor, |
| + scoped_ptr<syncer::SyncErrorFactory> sync_error_handler) OVERRIDE; |
| + virtual void StopSyncing(syncer::ModelType type) OVERRIDE; |
| + virtual syncer::SyncDataList GetAllSyncData( |
| + syncer::ModelType type) const OVERRIDE; |
| + virtual syncer::SyncError ProcessSyncChanges( |
| + const tracked_objects::Location& from_here, |
| + const syncer::SyncChangeList& change_list) OVERRIDE; |
| private: |
| - // Returns a newly allocated list of words read from custom dictionary file. |
| - // The caller owns this new list. |
| - chrome::spellcheck_common::WordList* LoadDictionary(); |
| - |
| - // The reply point for PostTaskAndReplyWithResult. Called when LoadDictionary |
| - // is finished reading words from custom dictionary file. Moves the strings |
| - // from the |custom_words| argument into the private member variable |words_| |
| - // and deletes the memory at |custom_words|. |
| - void SetCustomWordListAndDelete( |
| - chrome::spellcheck_common::WordList* custom_words); |
| - |
| - // Loads the dictionary file into |custom_words|. If the dictionary checksum |
| - // is not valid, but backup checksum is valid, then restores the backup and |
| - // loads that into |custom_words| instead. If the backup is invalid too, then |
| - // clears |custom_words|. |
| - void LoadDictionaryFileReliably( |
| - chrome::spellcheck_common::WordList* custom_words); |
| - |
| - // Backs up the original dictionary, saves |custom_words| and its checksum |
| - // into the dictionary file. |
| - void SaveDictionaryFileReliably( |
| - const chrome::spellcheck_common::WordList& custom_words); |
| + // Applies the |dictionary_change| to the in-memory copy of the dictionary and |
| + // cleans up |dictionary_change| to be without duplicates, invalid words, and |
| + // missing words. Does not take ownership of |dictionary_change|. |
| + void Apply(Change* dictionary_change); |
| + |
| + // Schedules a write of |dictionary_change| to disk. |
| + void Save(scoped_ptr<Change> dictionary_change); |
| + |
| + // Notifies the sync service of the |dictionary_change|. Syncs up to the |
| + // maximum syncable words on the server. Disables syncing of this dictionary |
| + // if the server contains the maximum number of syncable words. Does not take |
| + // ownership of |dictionary_change|. |
| + syncer::SyncError Sync(const Change* dictionary_change); |
| + |
| + // Notifies observers of the dictionary change if the dictionary has been |
| + // loaded. Does not take ownership of |dictionary_change|. |
| + void Notify(const Change* dictionary_change); |
| // In-memory cache of the custom words file. |
| chrome::spellcheck_common::WordList words_; |
| @@ -103,10 +177,21 @@ class SpellcheckCustomDictionary : public SpellcheckDictionary { |
| // A path for custom dictionary per profile. |
| FilePath custom_dictionary_path_; |
| + // Used to create weak pointers for an instance of this class. |
| base::WeakPtrFactory<SpellcheckCustomDictionary> weak_ptr_factory_; |
| + // Observers for changes in dictionary load status and content changes. |
| ObserverList<Observer> observers_; |
| + // Used to send local changes to the sync infrastructure. |
| + scoped_ptr<syncer::SyncChangeProcessor> sync_processor_; |
| + |
| + // Used to send sync-related errors to the sync infrastructure. |
| + scoped_ptr<syncer::SyncErrorFactory> sync_error_handler_; |
| + |
| + // Whether the dictionary has been loaded. |
| + bool is_loaded_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(SpellcheckCustomDictionary); |
| }; |