From 55e9c25f48d8d99cc0433258b44f6e96011a63cd Mon Sep 17 00:00:00 2001 From: "estade@chromium.org" Date: Fri, 9 Oct 2009 03:04:14 +0000 Subject: Spellchecker: Move file accesses during initialization to file thread. Also fix a rare (and harmless) memory leak. Also introduce a rare (and harmless) memory leak. TEST=added dchecks, ran spellcheck unit tests, clicked around, changed dictionaries, added words BUG=22984 BUG=21924 BUG=1123096 Review URL: http://codereview.chromium.org/269020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@28512 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/spellchecker.h | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) (limited to 'chrome/browser/spellchecker.h') diff --git a/chrome/browser/spellchecker.h b/chrome/browser/spellchecker.h index 48e4153..a8acafd 100644 --- a/chrome/browser/spellchecker.h +++ b/chrome/browser/spellchecker.h @@ -5,19 +5,20 @@ #ifndef CHROME_BROWSER_SPELLCHECKER_H_ #define CHROME_BROWSER_SPELLCHECKER_H_ -#include +#include #include +#include #include "app/l10n_util.h" #include "base/string_util.h" +#include "base/task.h" +#include "base/time.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/net/url_fetcher.h" #include "chrome/browser/profile.h" #include "chrome/browser/spellcheck_worditerator.h" #include "chrome/common/pref_names.h" #include "chrome/common/pref_member.h" - -#include "base/task.h" #include "unicode/uscript.h" class FilePath; @@ -115,9 +116,10 @@ class SpellChecker : public base::RefCountedThreadSafe, static std::string GetLanguageFromLanguageRegion(std::string input_language); private: + friend class ReadDictionaryTask; + // URLFetcher::Delegate implementation. Called when we finish downloading the // spellcheck dictionary; saves the dictionary to disk. - // TODO(sidchat): Save to disk in the file thread instead of the IO thread. virtual void OnURLFetchComplete(const URLFetcher* source, const GURL& url, const URLRequestStatus& status, @@ -137,13 +139,15 @@ class SpellChecker : public base::RefCountedThreadSafe, // Initializes the Hunspell Dictionary. bool Initialize(); - // After |hunspell_| is initialized, this function is called to add custom - // words from the custom dictionary to the |hunspell_|. - void AddCustomWordsToHunspell(); + // Called when |hunspell| is done loading, succesfully or not. If |hunspell| + // and |bdict_file| are non-NULL, assume ownership. + void HunspellInited(Hunspell* hunspell, + file_util::MemoryMappedFile* bdict_file, + bool file_existed); - // Memory maps the given .bdic file. On success, it will return true and will - // place the data and length into the given out parameters. - bool MapBdictFile(const unsigned char** data, size_t* length); + // Either start downloading a dictionary if we have not already, or do nothing + // if we have already tried to download one. + void DoDictionaryDownload(); // Returns whether or not the given word is a contraction of valid words // (e.g. "word:word"). @@ -163,7 +167,7 @@ class SpellChecker : public base::RefCountedThreadSafe, // This method is called in the IO thread after dictionary download has // completed in FILE thread. - void OnDictionarySaveComplete(){ obtaining_dictionary_ = false; } + void OnDictionarySaveComplete(); // The given path to the directory whether SpellChecker first tries to // download the spellcheck bdic dictionary file. @@ -192,15 +196,13 @@ class SpellChecker : public base::RefCountedThreadSafe, // The language that this spellchecker works in. std::string language_; -#ifndef NDEBUG // This object must only be used on the same thread. However, it is normally // created on the UI thread. This checks calls to SpellCheckWord and the // destructor to make sure we're only ever running on the same thread. // // This will be NULL if it is not initialized yet (not initialized in the - // constructor since that's on a different thread. + // constructor since that's on a different thread). MessageLoop* worker_loop_; -#endif // Flag indicating whether we tried to download the dictionary file. bool tried_to_download_dictionary_file_; @@ -208,9 +210,6 @@ class SpellChecker : public base::RefCountedThreadSafe, // File Thread Message Loop. MessageLoop* file_loop_; - // UI Thread Message Loop. - MessageLoop* ui_loop_; - // Used for requests. MAY BE NULL which means don't try to download. URLRequestContext* url_request_context_; @@ -227,10 +226,13 @@ class SpellChecker : public base::RefCountedThreadSafe, // URLFetcher to download a file in memory. scoped_ptr fetcher_; + // While Hunspell is loading, we add any new custom words to this queue. + // We will add them to |hunspell_| when it is done loading. + std::queue custom_words_; + // Used for generating callbacks to spellchecker, since spellchecker is a // non-reference counted object. - ScopedRunnableMethodFactory - on_dictionary_save_complete_callback_factory_; + ScopedRunnableMethodFactory method_factory_; DISALLOW_COPY_AND_ASSIGN(SpellChecker); }; -- cgit v1.1