• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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