diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-07-30 11:37:48 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-07-30 11:38:52 +0200 |
commit | 89e2486a48b739f8d771d69ede5a6a1b244a10fc (patch) | |
tree | 503b1a7812cf97d93704c32437eb5f62dc1a1ff9 /Source/WebKit2/UIProcess/API/gtk/WebKitTextChecker.cpp | |
parent | 625f028249cb37c55bbbd153f3902afd0b0756d9 (diff) | |
download | qtwebkit-89e2486a48b739f8d771d69ede5a6a1b244a10fc.tar.gz |
Imported WebKit commit 0282df8ca7c11d8c8a66ea18543695c69f545a27 (http://svn.webkit.org/repository/webkit/trunk@124002)
New snapshot with prospective Mountain Lion build fix
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitTextChecker.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitTextChecker.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitTextChecker.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitTextChecker.cpp new file mode 100644 index 000000000..5676bb6d7 --- /dev/null +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitTextChecker.cpp @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2012 Igalia S.L. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "WebKitTextChecker.h" + +#if ENABLE(SPELLCHECK) + +#include "WebKitPrivate.h" +#include <wtf/Vector.h> +#include <wtf/text/CString.h> + +using namespace WebKit; + +static inline WebKitTextChecker* toTextChecker(const void* clientInfo) +{ + return static_cast<WebKitTextChecker*>(const_cast<void*>(clientInfo)); +} + +static bool continuousSpellCheckingEnabledCallback(const void* clientInfo) +{ + return toTextChecker(clientInfo)->isSpellCheckingEnabled(); +} + +static void setContinuousSpellCheckingEnabledCallback(bool enabled, const void* clientInfo) +{ + toTextChecker(clientInfo)->setSpellCheckingEnabled(enabled); +} + +static void checkSpellingOfStringCallback(uint64_t tag, WKStringRef text, int32_t* misspellingLocation, int32_t* misspellingLength, const void* clientInfo) +{ + toTextChecker(clientInfo)->checkSpellingOfString(toImpl(text)->string(), *misspellingLocation, *misspellingLength); +} + +static WKArrayRef guessesForWordCallback(uint64_t tag, WKStringRef word, const void* clientInfo) +{ + Vector<String> guesses = toTextChecker(clientInfo)->getGuessesForWord(toImpl(word)->string()); + if (guesses.isEmpty()) + return 0; + + WKMutableArrayRef wkSuggestions = WKMutableArrayCreate(); + for (Vector<String>::const_iterator iter = guesses.begin(); iter != guesses.end(); ++iter) { + WKRetainPtr<WKStringRef> wkSuggestion(AdoptWK, WKStringCreateWithUTF8CString(iter->utf8().data())); + WKArrayAppendItem(wkSuggestions, wkSuggestion.get()); + } + + return wkSuggestions; +} + +static void learnWordCallback(uint64_t tag, WKStringRef word, const void* clientInfo) +{ + toTextChecker(clientInfo)->learnWord(toImpl(word)->string()); +} + +static void ignoreWordCallback(uint64_t tag, WKStringRef word, const void* clientInfo) +{ + toTextChecker(clientInfo)->ignoreWord(toImpl(word)->string()); +} + +WebKitTextChecker::~WebKitTextChecker() +{ +} + +WebKitTextChecker::WebKitTextChecker() + : m_textChecker(WebCore::TextCheckerEnchant::create()) + , m_spellCheckingEnabled(false) +{ + WKTextCheckerClient wkTextCheckerClient = { + kWKTextCheckerClientCurrentVersion, + this, // clientInfo + 0, // continuousSpellCheckingAllowed + continuousSpellCheckingEnabledCallback, + setContinuousSpellCheckingEnabledCallback, + 0, // grammarCheckingEnabled + 0, // setGrammarCheckingEnabled + 0, // uniqueSpellDocumentTag + 0, // closeSpellDocumentWithTag + checkSpellingOfStringCallback, + 0, // checkGrammarOfString + 0, // spellingUIIsShowing + 0, // toggleSpellingUIIsShowing + 0, // updateSpellingUIWithMisspelledWord + 0, // updateSpellingUIWithGrammarString + guessesForWordCallback, + learnWordCallback, + ignoreWordCallback, + }; + WKTextCheckerSetClient(&wkTextCheckerClient); +} + +void WebKitTextChecker::checkSpellingOfString(const String& string, int& misspellingLocation, int& misspellingLength) +{ + m_textChecker->checkSpellingOfString(string, misspellingLocation, misspellingLength); +} + +Vector<String> WebKitTextChecker::getGuessesForWord(const String& word) +{ + return m_textChecker->getGuessesForWord(word); +} + +void WebKitTextChecker::learnWord(const String& word) +{ + m_textChecker->learnWord(word); +} + +void WebKitTextChecker::ignoreWord(const String& word) +{ + m_textChecker->ignoreWord(word); +} + +void WebKitTextChecker::setSpellCheckingEnabled(bool enabled) +{ + if (m_spellCheckingEnabled == enabled) + return; + m_spellCheckingEnabled = enabled; + + // We need to notify the Web process that this has changed. + WKTextCheckerContinuousSpellCheckingEnabledStateChanged(enabled); +} + +void WebKitTextChecker::setSpellCheckingLanguages(const String& languages) +{ + if (m_spellCheckingLanguages == languages) + return; + m_spellCheckingLanguages = languages; + + // We need to update the languages in the enchant-based checker too. + m_textChecker->updateSpellCheckingLanguages(languages); +} +#endif // ENABLE(SPELLCHECK) |