Home | History | Annotate | Download | only in spellchecker
      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.
     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 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