1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_SPELLCHECK_HOST_IMPL_H_ 6 #define CHROME_BROWSER_SPELLCHECK_HOST_IMPL_H_ 7 #pragma once 8 9 #include <string> 10 #include <vector> 11 12 #include "base/file_path.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "chrome/browser/spellcheck_host.h" 15 #include "chrome/browser/spellcheck_host_observer.h" 16 #include "chrome/common/net/url_fetcher.h" 17 18 // This class implements the SpellCheckHost interface to provide the 19 // functionalities listed below: 20 // * Adding a word to the custom dictionary; 21 // * Storing the custom dictionary to the file, and read it back 22 // from the file during the initialization. 23 // * Downloading a dictionary and map it for the renderer, and; 24 // * Calling the platform spellchecker attached to the browser; 25 // 26 // To download a dictionary and initialize it without blocking the UI thread, 27 // this class also implements the URLFetcher::Delegate() interface. This 28 // initialization status is notified to the UI thread through the 29 // SpellCheckHostObserver interface. 30 // 31 // We expect a profile creates an instance of this class through a factory 32 // method, SpellCheckHost::Create() and uses only the SpellCheckHost interface 33 // provided by this class. 34 // spell_check_host_ = SpellCheckHost::Create(...) 35 // 36 // Available languages for the checker, which we need to specify via Create(), 37 // can be listed using SpellCheckHost::GetAvailableLanguages() static method. 38 class SpellCheckHostImpl : public SpellCheckHost, 39 public URLFetcher::Delegate { 40 public: 41 SpellCheckHostImpl(SpellCheckHostObserver* observer, 42 const std::string& language, 43 net::URLRequestContextGetter* request_context_getter); 44 45 void Initialize(); 46 47 // SpellCheckHost implementation 48 49 virtual void UnsetObserver(); 50 51 virtual void AddWord(const std::string& word); 52 53 virtual const base::PlatformFile& GetDictionaryFile() const; 54 55 virtual const std::vector<std::string>& GetCustomWords() const; 56 57 virtual const std::string& GetLastAddedFile() const; 58 59 virtual const std::string& GetLanguage() const; 60 61 virtual bool IsUsingPlatformChecker() const; 62 63 private: 64 // These two classes can destruct us. 65 friend class BrowserThread; 66 friend class DeleteTask<SpellCheckHostImpl>; 67 68 virtual ~SpellCheckHostImpl(); 69 70 // Figure out the location for the dictionary. This is only non-trivial for 71 // Windows: 72 // The default place whether the spellcheck dictionary can reside is 73 // chrome::DIR_APP_DICTIONARIES. However, for systemwide installations, 74 // this directory may not have permissions for download. In that case, the 75 // alternate directory for download is chrome::DIR_USER_DATA. 76 void InitializeDictionaryLocation(); 77 78 // Load and parse the custom words dictionary and open the bdic file. 79 // Executed on the file thread. 80 void InitializeInternal(); 81 82 void InitializeOnFileThread(); 83 84 // Inform |observer_| that initialization has finished. 85 void InformObserverOfInitialization(); 86 87 // If |dictionary_file_| is missing, we attempt to download it. 88 void DownloadDictionary(); 89 90 // Write a custom dictionary addition to disk. 91 void WriteWordToCustomDictionary(const std::string& word); 92 93 // URLFetcher::Delegate implementation. Called when we finish downloading the 94 // spellcheck dictionary; saves the dictionary to |data_|. 95 virtual void OnURLFetchComplete(const URLFetcher* source, 96 const GURL& url, 97 const net::URLRequestStatus& status, 98 int response_code, 99 const ResponseCookies& cookies, 100 const std::string& data); 101 102 // Saves |data_| to disk. Run on the file thread. 103 void SaveDictionaryData(); 104 105 // May be NULL. 106 SpellCheckHostObserver* observer_; 107 108 // The desired location of the dictionary file (whether or not t exists yet). 109 FilePath bdict_file_path_; 110 111 // The location of the custom words file. 112 FilePath custom_dictionary_file_; 113 114 // The language of the dictionary file. 115 std::string language_; 116 117 // The file descriptor/handle for the dictionary file. 118 base::PlatformFile file_; 119 120 // In-memory cache of the custom words file. 121 std::vector<std::string> custom_words_; 122 123 // We don't want to attempt to download a missing dictionary file more than 124 // once. 125 bool tried_to_download_; 126 127 // Whether we should use the platform spellchecker instead of Hunspell. 128 bool use_platform_spellchecker_; 129 130 // Data received from the dictionary download. 131 std::string data_; 132 133 // Used for downloading the dictionary file. We don't hold a reference, and 134 // it is only valid to use it on the UI thread. 135 net::URLRequestContextGetter* request_context_getter_; 136 137 // Used for downloading the dictionary file. 138 scoped_ptr<URLFetcher> fetcher_; 139 }; 140 141 #endif // CHROME_BROWSER_SPELLCHECK_HOST_IMPL_H_ 142