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
15class RenderView;
16class SpellCheck;
17class SpellCheckMarker;
18struct SpellCheckResult;
19
20namespace WebKit {
21class WebString;
22class WebTextCheckingCompletion;
23struct WebTextCheckingResult;
24}
25
26// This class deals with invoking browser-side spellcheck mechanism
27// which is done asynchronously.
28class SpellCheckProvider
29    : public content::RenderViewObserver,
30      public content::RenderViewObserverTracker<SpellCheckProvider>,
31      public WebKit::WebSpellCheckClient {
32 public:
33  typedef IDMap<WebKit::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 string16& text,
43      WebKit::WebTextCheckingCompletion* completion,
44      const std::vector<SpellCheckMarker>& markers);
45
46  // The number of ongoing IPC requests.
47  size_t pending_text_request_size() const {
48    return text_check_completions_.size();
49  }
50
51  // Replace shared spellcheck data.
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 WebKit::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 string16& text,
68                               WebKit::WebTextCheckingCompletion* completion);
69
70  // WebKit::WebSpellCheckClient implementation.
71  virtual void spellCheck(
72      const WebKit::WebString& text,
73      int& offset,
74      int& length,
75      WebKit::WebVector<WebKit::WebString>* optional_suggestions) OVERRIDE;
76  virtual void checkTextOfParagraph(
77      const WebKit::WebString& text,
78      WebKit::WebTextCheckingTypeMask mask,
79      WebKit::WebVector<WebKit::WebTextCheckingResult>* results) OVERRIDE;
80
81  virtual void requestCheckingOfText(
82      const WebKit::WebString& text,
83      const WebKit::WebVector<uint32>& markers,
84      const WebKit::WebVector<unsigned>& marker_offsets,
85      WebKit::WebTextCheckingCompletion* completion) OVERRIDE;
86
87  virtual WebKit::WebString autoCorrectWord(
88      const WebKit::WebString& misspelled_word) OVERRIDE;
89  virtual void showSpellingUI(bool show) OVERRIDE;
90  virtual bool isShowingSpellingUI() OVERRIDE;
91  virtual void updateSpellingUIWithMisspelledWord(
92      const WebKit::WebString& word) OVERRIDE;
93
94#if !defined(OS_MACOSX)
95  void OnRespondSpellingService(
96      int identifier,
97      bool succeeded,
98      const 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 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  string16 last_request_;
120  WebKit::WebVector<WebKit::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