1 // Copyright (c) 2012 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_RENDERER_SPELLCHECKER_SPELLCHECK_PROVIDER_H_ 6 #define CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_PROVIDER_H_ 7 8 #include <vector> 9 10 #include "base/id_map.h" 11 #include "content/public/renderer/render_view_observer.h" 12 #include "content/public/renderer/render_view_observer_tracker.h" 13 #include "third_party/WebKit/public/web/WebSpellCheckClient.h" 14 15 class RenderView; 16 class SpellCheck; 17 class SpellCheckMarker; 18 struct SpellCheckResult; 19 20 namespace blink { 21 class WebString; 22 class WebTextCheckingCompletion; 23 struct WebTextCheckingResult; 24 } 25 26 // This class deals with invoking browser-side spellcheck mechanism 27 // which is done asynchronously. 28 class SpellCheckProvider 29 : public content::RenderViewObserver, 30 public content::RenderViewObserverTracker<SpellCheckProvider>, 31 public blink::WebSpellCheckClient { 32 public: 33 typedef IDMap<blink::WebTextCheckingCompletion> WebTextCheckCompletions; 34 35 SpellCheckProvider(content::RenderView* render_view, 36 SpellCheck* spellcheck); 37 virtual ~SpellCheckProvider(); 38 39 // Requests async spell and grammar checker to the platform text 40 // checker, which is available on the browser process. 41 void RequestTextChecking( 42 const base::string16& text, 43 blink::WebTextCheckingCompletion* completion, 44 const std::vector<SpellCheckMarker>& markers); 45 46 // The number of ongoing IPC requests. pending_text_request_size()47 size_t pending_text_request_size() const { 48 return text_check_completions_.size(); 49 } 50 51 // Replace shared spellcheck data. set_spellcheck(SpellCheck * spellcheck)52 void set_spellcheck(SpellCheck* spellcheck) { spellcheck_ = spellcheck; } 53 54 // Enables document-wide spellchecking. 55 void EnableSpellcheck(bool enabled); 56 57 // RenderViewObserver implementation. 58 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 59 virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE; 60 61 private: 62 friend class TestingSpellCheckProvider; 63 64 // Tries to satisfy a spell check request from the cache in |last_request_|. 65 // Returns true (and cancels/finishes the completion) if it can, false 66 // if the provider should forward the query on. 67 bool SatisfyRequestFromCache(const base::string16& text, 68 blink::WebTextCheckingCompletion* completion); 69 70 // blink::WebSpellCheckClient implementation. 71 virtual void spellCheck( 72 const blink::WebString& text, 73 int& offset, 74 int& length, 75 blink::WebVector<blink::WebString>* optional_suggestions) OVERRIDE; 76 virtual void checkTextOfParagraph( 77 const blink::WebString& text, 78 blink::WebTextCheckingTypeMask mask, 79 blink::WebVector<blink::WebTextCheckingResult>* results) OVERRIDE; 80 81 virtual void requestCheckingOfText( 82 const blink::WebString& text, 83 const blink::WebVector<uint32>& markers, 84 const blink::WebVector<unsigned>& marker_offsets, 85 blink::WebTextCheckingCompletion* completion) OVERRIDE; 86 87 virtual blink::WebString autoCorrectWord( 88 const blink::WebString& misspelled_word) OVERRIDE; 89 virtual void showSpellingUI(bool show) OVERRIDE; 90 virtual bool isShowingSpellingUI() OVERRIDE; 91 virtual void updateSpellingUIWithMisspelledWord( 92 const blink::WebString& word) OVERRIDE; 93 94 #if !defined(OS_MACOSX) 95 void OnRespondSpellingService( 96 int identifier, 97 bool succeeded, 98 const base::string16& text, 99 const std::vector<SpellCheckResult>& results); 100 #endif 101 102 // Returns whether |text| has word characters, i.e. whether a spellchecker 103 // needs to check this text. 104 bool HasWordCharacters(const base::string16& text, int index) const; 105 106 #if defined(OS_MACOSX) 107 void OnAdvanceToNextMisspelling(); 108 void OnRespondTextCheck( 109 int identifier, 110 const std::vector<SpellCheckResult>& results); 111 void OnToggleSpellPanel(bool is_currently_visible); 112 #endif 113 114 // Holds ongoing spellchecking operations, assigns IDs for the IPC routing. 115 WebTextCheckCompletions text_check_completions_; 116 117 // The last text sent to the browser process to spellcheck it and its 118 // spellchecking results. 119 base::string16 last_request_; 120 blink::WebVector<blink::WebTextCheckingResult> last_results_; 121 122 // True if the browser is showing the spelling panel for us. 123 bool spelling_panel_visible_; 124 125 // Weak pointer to shared (per RenderView) spellcheck data. 126 SpellCheck* spellcheck_; 127 128 DISALLOW_COPY_AND_ASSIGN(SpellCheckProvider); 129 }; 130 131 #endif // CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_PROVIDER_H_ 132