| 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..a9362bbc2bc185ffc6bca83bed5ab1230a755d33 100644
|
| --- a/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
|
| +++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
|
| @@ -5,15 +5,33 @@
|
| #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(
|
| + 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.
|
| @@ -24,78 +42,132 @@
|
| // 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; }
|
| + 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);
|
| + 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);
|
|
|
| - // 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);
|
| +
|
| + // 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
|
| + // returns the cleaned up dictionary change without duplicates, invalid words,
|
| + // and missing words.
|
| + scoped_ptr<Change> Apply(scoped_ptr<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|, assuming this change
|
| + // has been applied to the dictionary.
|
| + syncer::SyncError Sync(scoped_ptr<Change> dictionary_change);
|
| +
|
| + // Notifies observers of the dictionary change if the dictionary has been
|
| + // loaded.
|
| + void Notify(const Change* dictionary_change);
|
|
|
| // In-memory cache of the custom words file.
|
| chrome::spellcheck_common::WordList words_;
|
| @@ -103,10 +175,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);
|
| };
|
|
|
|
|