// 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_PROVIDER_H_
#define CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_PROVIDER_H_
#include <vector>
#include "base/id_map.h"
#include "content/public/renderer/render_view_observer.h"
#include "content/public/renderer/render_view_observer_tracker.h"
#include "third_party/WebKit/public/web/WebSpellCheckClient.h"
class RenderView;
class SpellCheck;
class SpellCheckMarker;
struct SpellCheckResult;
namespace blink {
class WebString;
class WebTextCheckingCompletion;
struct WebTextCheckingResult;
}
// This class deals with invoking browser-side spellcheck mechanism
// which is done asynchronously.
class SpellCheckProvider
: public content::RenderViewObserver,
public content::RenderViewObserverTracker<SpellCheckProvider>,
public blink::WebSpellCheckClient {
public:
typedef IDMap<blink::WebTextCheckingCompletion> WebTextCheckCompletions;
SpellCheckProvider(content::RenderView* render_view,
SpellCheck* spellcheck);
virtual ~SpellCheckProvider();
// Requests async spell and grammar checker to the platform text
// checker, which is available on the browser process.
void RequestTextChecking(
const base::string16& text,
blink::WebTextCheckingCompletion* completion,
const std::vector<SpellCheckMarker>& markers);
// The number of ongoing IPC requests.
size_t pending_text_request_size() const {
return text_check_completions_.size();
}
// Replace shared spellcheck data.
void set_spellcheck(SpellCheck* spellcheck) { spellcheck_ = spellcheck; }
// Enables document-wide spellchecking.
void EnableSpellcheck(bool enabled);
// RenderViewObserver implementation.
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE;
private:
friend class TestingSpellCheckProvider;
// Tries to satisfy a spell check request from the cache in |last_request_|.
// Returns true (and cancels/finishes the completion) if it can, false
// if the provider should forward the query on.
bool SatisfyRequestFromCache(const base::string16& text,
blink::WebTextCheckingCompletion* completion);
// blink::WebSpellCheckClient implementation.
virtual void spellCheck(
const blink::WebString& text,
int& offset,
int& length,
blink::WebVector<blink::WebString>* optional_suggestions) OVERRIDE;
virtual void checkTextOfParagraph(
const blink::WebString& text,
blink::WebTextCheckingTypeMask mask,
blink::WebVector<blink::WebTextCheckingResult>* results) OVERRIDE;
virtual void requestCheckingOfText(
const blink::WebString& text,
const blink::WebVector<uint32>& markers,
const blink::WebVector<unsigned>& marker_offsets,
blink::WebTextCheckingCompletion* completion) OVERRIDE;
virtual blink::WebString autoCorrectWord(
const blink::WebString& misspelled_word) OVERRIDE;
virtual void showSpellingUI(bool show) OVERRIDE;
virtual bool isShowingSpellingUI() OVERRIDE;
virtual void updateSpellingUIWithMisspelledWord(
const blink::WebString& word) OVERRIDE;
#if !defined(OS_MACOSX)
void OnRespondSpellingService(
int identifier,
bool succeeded,
const base::string16& text,
const std::vector<SpellCheckResult>& results);
#endif
// Returns whether |text| has word characters, i.e. whether a spellchecker
// needs to check this text.
bool HasWordCharacters(const base::string16& text, int index) const;
#if defined(OS_MACOSX)
void OnAdvanceToNextMisspelling();
void OnRespondTextCheck(
int identifier,
const std::vector<SpellCheckResult>& results);
void OnToggleSpellPanel(bool is_currently_visible);
#endif
// Holds ongoing spellchecking operations, assigns IDs for the IPC routing.
WebTextCheckCompletions text_check_completions_;
// The last text sent to the browser process to spellcheck it and its
// spellchecking results.
base::string16 last_request_;
blink::WebVector<blink::WebTextCheckingResult> last_results_;
// True if the browser is showing the spelling panel for us.
bool spelling_panel_visible_;
// Weak pointer to shared (per RenderView) spellcheck data.
SpellCheck* spellcheck_;
DISALLOW_COPY_AND_ASSIGN(SpellCheckProvider);
};
#endif // CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_PROVIDER_H_