#ifndef SpellChecker_h
#define SpellChecker_h
#include "core/clipboard/ClipboardAccessPolicy.h"
#include "core/dom/DocumentMarker.h"
#include "core/editing/FrameSelection.h"
#include "core/editing/VisibleSelection.h"
#include "platform/text/TextChecking.h"
namespace WebCore {
class LocalFrame;
class SpellCheckerClient;
class SpellCheckRequest;
class SpellCheckRequester;
class TextCheckerClient;
class TextCheckingParagraph;
struct TextCheckingResult;
class SpellChecker {
WTF_MAKE_NONCOPYABLE(SpellChecker);
public:
static PassOwnPtr<SpellChecker> create(LocalFrame&);
~SpellChecker();
SpellCheckerClient& spellCheckerClient() const;
TextCheckerClient& textChecker() const;
bool isContinuousSpellCheckingEnabled() const;
void toggleContinuousSpellChecking();
bool isGrammarCheckingEnabled();
void ignoreSpelling();
bool isSpellCheckingEnabledInFocusedNode() const;
bool isSpellCheckingEnabledFor(Node*) const;
void markMisspellingsAfterTypingToWord(const VisiblePosition &wordStart, const VisibleSelection& selectionAfterTyping);
void markMisspellings(const VisibleSelection&, RefPtrWillBeRawPtr<Range>& firstMisspellingRange);
void markBadGrammar(const VisibleSelection&);
void markMisspellingsAndBadGrammar(const VisibleSelection& spellingSelection, bool markGrammar, const VisibleSelection& grammarSelection);
void markAndReplaceFor(PassRefPtr<SpellCheckRequest>, const Vector<TextCheckingResult>&);
void markAllMisspellingsAndBadGrammarInRanges(TextCheckingTypeMask, Range* spellingRange, Range* grammarRange);
void advanceToNextMisspelling(bool startBeforeSelection = false);
void showSpellingGuessPanel();
void didBeginEditing(Element*);
void clearMisspellingsAndBadGrammar(const VisibleSelection&);
void markMisspellingsAndBadGrammar(const VisibleSelection&);
void respondToChangedSelection(const VisibleSelection& oldSelection, FrameSelection::SetSelectionOptions);
void spellCheckAfterBlur();
void spellCheckOldSelection(const VisibleSelection& oldSelection, const VisibleSelection& newAdjacentWords, const VisibleSelection& newSelectedSentence);
void didEndEditingOnTextField(Element*);
bool selectionStartHasMarkerFor(DocumentMarker::MarkerType, int from, int length) const;
void updateMarkersForWordsAffectedByEditing(bool onlyHandleWordsContainingSelection);
void cancelCheck();
void chunkAndMarkAllMisspellingsAndBadGrammar(Node*);
void requestTextChecking(const Element&);
SpellCheckRequester& spellCheckRequester() const { return *m_spellCheckRequester; }
private:
LocalFrame& m_frame;
const OwnPtr<SpellCheckRequester> m_spellCheckRequester;
explicit SpellChecker(LocalFrame&);
void markMisspellingsOrBadGrammar(const VisibleSelection&, bool checkSpelling, RefPtrWillBeRawPtr<Range>& firstMisspellingRange);
TextCheckingTypeMask resolveTextCheckingTypeMask(TextCheckingTypeMask);
bool unifiedTextCheckerEnabled() const;
void chunkAndMarkAllMisspellingsAndBadGrammar(TextCheckingTypeMask textCheckingOptions, const TextCheckingParagraph& fullParagraphToCheck, bool asynchronous);
void markAllMisspellingsAndBadGrammarInRanges(TextCheckingTypeMask textCheckingOptions, Range* checkingRange, Range* paragraphRange, bool asynchronous, int requestNumber, int* checkingLength = 0);
};
}
#endif