12daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/*
22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2011 Apple Inc. All rights reserved.
32daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *
42daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Redistribution and use in source and binary forms, with or without
52daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * modification, are permitted provided that the following conditions
62daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * are met:
72daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 1. Redistributions of source code must retain the above copyright
82daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    notice, this list of conditions and the following disclaimer.
92daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    documentation and/or other materials provided with the distribution.
122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *
132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */
252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "config.h"
272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WebTextCheckerClient.h"
282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "ImmutableArray.h"
302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WKAPICast.h"
312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WKSharedAPICast.h"
322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WebGrammarDetail.h"
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WebPageProxy.h"
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/text/WTFString.h>
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochnamespace WebKit {
372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool WebTextCheckerClient::continuousSpellCheckingAllowed()
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.continuousSpellCheckingAllowed)
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return m_client.continuousSpellCheckingAllowed(m_client.clientInfo);
442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool WebTextCheckerClient::continuousSpellCheckingEnabled()
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.continuousSpellCheckingEnabled)
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return m_client.continuousSpellCheckingEnabled(m_client.clientInfo);
522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::setContinuousSpellCheckingEnabled(bool enabled)
552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.setContinuousSpellCheckingEnabled)
572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.setContinuousSpellCheckingEnabled(enabled, m_client.clientInfo);
602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool WebTextCheckerClient::grammarCheckingEnabled()
632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.grammarCheckingEnabled)
652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return m_client.grammarCheckingEnabled(m_client.clientInfo);
682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::setGrammarCheckingEnabled(bool enabled)
712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.setGrammarCheckingEnabled)
732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.setGrammarCheckingEnabled(enabled, m_client.clientInfo);
762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochuint64_t WebTextCheckerClient::uniqueSpellDocumentTag(WebPageProxy* page)
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.uniqueSpellDocumentTag)
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0;
822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return m_client.uniqueSpellDocumentTag(toAPI(page), m_client.clientInfo);
842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::closeSpellDocumentWithTag(uint64_t tag)
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.closeSpellDocumentWithTag)
892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.closeSpellDocumentWithTag(tag, m_client.clientInfo);
922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::checkSpellingOfString(uint64_t tag, const String& text, int32_t& misspellingLocation, int32_t& misspellingLength)
952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.checkSpellingOfString)
972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.checkSpellingOfString(tag, toAPI(text.impl()), &misspellingLocation, &misspellingLength, m_client.clientInfo);
1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::checkGrammarOfString(uint64_t tag, const String& text, Vector<WebCore::GrammarDetail>& grammarDetails, int32_t& badGrammarLocation, int32_t& badGrammarLength)
1032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.checkGrammarOfString)
1052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WKArrayRef wkGrammarDetailsRef = 0;
1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.checkGrammarOfString(tag, toAPI(text.impl()), &wkGrammarDetailsRef, &badGrammarLocation, &badGrammarLength, m_client.clientInfo);
1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<ImmutableArray> wkGrammarDetails = adoptRef(toImpl(wkGrammarDetailsRef));
1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    size_t numGrammarDetails = wkGrammarDetails->size();
1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    for (size_t i = 0; i < numGrammarDetails; ++i)
1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        grammarDetails.append(wkGrammarDetails->at<WebGrammarDetail>(i)->grammarDetail());
1142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool WebTextCheckerClient::spellingUIIsShowing()
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.spellingUIIsShowing)
1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return m_client.spellingUIIsShowing(m_client.clientInfo);
1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::toggleSpellingUIIsShowing()
1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.toggleSpellingUIIsShowing)
1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return m_client.toggleSpellingUIIsShowing(m_client.clientInfo);
1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::updateSpellingUIWithMisspelledWord(uint64_t tag, const String& misspelledWord)
1332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.updateSpellingUIWithMisspelledWord)
1352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
1362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.updateSpellingUIWithMisspelledWord(tag, toAPI(misspelledWord.impl()), m_client.clientInfo);
1382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::updateSpellingUIWithGrammarString(uint64_t tag, const String& badGrammarPhrase, const WebCore::GrammarDetail& grammarDetail)
1412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.updateSpellingUIWithGrammarString)
1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.updateSpellingUIWithGrammarString(tag, toAPI(badGrammarPhrase.impl()), toAPI(grammarDetail), m_client.clientInfo);
1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::guessesForWord(uint64_t tag, const String& word, Vector<String>& guesses)
1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.guessesForWord)
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<ImmutableArray> wkGuesses = adoptRef(toImpl(m_client.guessesForWord(tag, toAPI(word.impl()), m_client.clientInfo)));
1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    size_t numGuesses = wkGuesses->size();
1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    for (size_t i = 0; i < numGuesses; ++i)
1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        guesses.append(wkGuesses->at<WebString>(i)->string());
1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::learnWord(uint64_t tag, const String& word)
1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.learnWord)
1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.learnWord(tag, toAPI(word.impl()), m_client.clientInfo);
1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebTextCheckerClient::ignoreWord(uint64_t tag, const String& word)
1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_client.ignoreWord)
1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_client.ignoreWord(tag, toAPI(word.impl()), m_client.clientInfo);
1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} // namespace WebKit
176