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