| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_H_ |
| #define CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/files/file.h" |
| #include "base/gtest_prod_util.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/strings/string16.h" |
| #include "chrome/renderer/spellchecker/custom_dictionary_engine.h" |
| #include "chrome/renderer/spellchecker/spellcheck_language.h" |
| #include "content/public/renderer/render_process_observer.h" |
| #include "ipc/ipc_platform_file.h" |
| #include "third_party/WebKit/public/platform/WebVector.h" |
| |
| struct SpellCheckResult; |
| |
| namespace blink { |
| class WebTextCheckingCompletion; |
| struct WebTextCheckingResult; |
| } |
| |
| // TODO(morrita): Needs reorg with SpellCheckProvider. |
| // See http://crbug.com/73699. |
| // Shared spellchecking logic/data for a RenderProcess. All RenderViews use |
| // this object to perform spellchecking tasks. |
| class SpellCheck : public content::RenderProcessObserver, |
| public base::SupportsWeakPtr<SpellCheck> { |
| public: |
| // TODO(groby): I wonder if this can be private, non-mac only. |
| class SpellcheckRequest; |
| enum ResultFilter { |
| DO_NOT_MODIFY = 1, // Do not modify results. |
| USE_NATIVE_CHECKER, // Use native checker to double-check. |
| }; |
| |
| SpellCheck(); |
| virtual ~SpellCheck(); |
| |
| // TODO: Try to move that all to SpellcheckLanguage. |
| void Init(base::File file, |
| const std::set<std::string>& custom_words, |
| const std::string& language); |
| |
| // If there is no dictionary file, then this requests one from the browser |
| // and does not block. In this case it returns true. |
| // If there is a dictionary file, but Hunspell has not been loaded, then |
| // this loads Hunspell. |
| // If Hunspell is already loaded, this does nothing. In both the latter cases |
| // it returns false, meaning that it is OK to continue spellchecking. |
| bool InitializeIfNeeded(); |
| |
| // SpellCheck a word. |
| // Returns true if spelled correctly, false otherwise. |
| // If the spellchecker failed to initialize, always returns true. |
| // The |tag| parameter should either be a unique identifier for the document |
| // that the word came from (if the current platform requires it), or 0. |
| // In addition, finds the suggested words for a given word |
| // and puts them into |*optional_suggestions|. |
| // If the word is spelled correctly, the vector is empty. |
| // If optional_suggestions is NULL, suggested words will not be looked up. |
| // Note that Doing suggest lookups can be slow. |
| bool SpellCheckWord(const base::char16* in_word, |
| int in_word_len, |
| int tag, |
| int* misspelling_start, |
| int* misspelling_len, |
| std::vector<base::string16>* optional_suggestions); |
| |
| // SpellCheck a paragraph. |
| // Returns true if |text| is correctly spelled, false otherwise. |
| // If the spellchecker failed to initialize, always returns true. |
| bool SpellCheckParagraph( |
| const base::string16& text, |
| blink::WebVector<blink::WebTextCheckingResult>* results); |
| |
| // Find a possible correctly spelled word for a misspelled word. Computes an |
| // empty string if input misspelled word is too long, there is ambiguity, or |
| // the correct spelling cannot be determined. |
| // NOTE: If using the platform spellchecker, this will send a *lot* of sync |
| // IPCs. We should probably refactor this if we ever plan to take it out from |
| // behind its command line flag. |
| base::string16 GetAutoCorrectionWord(const base::string16& word, int tag); |
| |
| // Requests to spellcheck the specified text in the background. This function |
| // posts a background task and calls SpellCheckParagraph() in the task. |
| #if !defined (OS_MACOSX) |
| void RequestTextChecking(const base::string16& text, |
| blink::WebTextCheckingCompletion* completion); |
| #endif |
| |
| // Creates a list of WebTextCheckingResult objects (used by WebKit) from a |
| // list of SpellCheckResult objects (used by Chrome). This function also |
| // checks misspelled words returned by the Spelling service and changes the |
| // underline colors of contextually-misspelled words. |
| void CreateTextCheckingResults( |
| ResultFilter filter, |
| int line_offset, |
| const base::string16& line_text, |
| const std::vector<SpellCheckResult>& spellcheck_results, |
| blink::WebVector<blink::WebTextCheckingResult>* textcheck_results); |
| |
| bool is_spellcheck_enabled() { return spellcheck_enabled_; } |
| |
| private: |
| friend class SpellCheckTest; |
| FRIEND_TEST_ALL_PREFIXES(SpellCheckTest, GetAutoCorrectionWord_EN_US); |
| FRIEND_TEST_ALL_PREFIXES(SpellCheckTest, |
| RequestSpellCheckMultipleTimesWithoutInitialization); |
| |
| // RenderProcessObserver implementation: |
| virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE; |
| |
| // Message handlers. |
| void OnInit(IPC::PlatformFileForTransit bdict_file, |
| const std::set<std::string>& custom_words, |
| const std::string& language, |
| bool auto_spell_correct); |
| void OnCustomDictionaryChanged( |
| const std::vector<std::string>& words_added, |
| const std::vector<std::string>& words_removed); |
| void OnEnableAutoSpellCorrect(bool enable); |
| void OnEnableSpellCheck(bool enable); |
| void OnRequestDocumentMarkers(); |
| |
| #if !defined (OS_MACOSX) |
| // Posts delayed spellcheck task and clear it if any. |
| // Takes ownership of |request|. |
| void PostDelayedSpellCheckTask(SpellcheckRequest* request); |
| |
| // Performs spell checking from the request queue. |
| void PerformSpellCheck(SpellcheckRequest* request); |
| |
| // The parameters of a pending background-spellchecking request. When WebKit |
| // sends a background-spellchecking request before initializing hunspell, |
| // we save its parameters and start spellchecking after we finish initializing |
| // hunspell. (When WebKit sends two or more requests, we cancel the previous |
| // requests so we do not have to use vectors.) |
| scoped_ptr<SpellcheckRequest> pending_request_param_; |
| #endif |
| |
| SpellcheckLanguage spellcheck_; // Language-specific spellchecking code. |
| |
| // Custom dictionary spelling engine. |
| CustomDictionaryEngine custom_dictionary_; |
| |
| // Remember state for auto spell correct. |
| bool auto_spell_correct_turned_on_; |
| |
| // Remember state for spellchecking. |
| bool spellcheck_enabled_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SpellCheck); |
| }; |
| |
| #endif // CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_H_ |