165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "config.h"
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "TextChecker.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "TextCheckerState.h"
302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#import <WebCore/NotImplemented.h>
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <wtf/RetainPtr.h>
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef BUILDING_ON_SNOW_LEOPARD
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@interface NSSpellChecker (WebNSSpellCheckerDetails)
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (NSString *)languageForWordRange:(NSRange)range inString:(NSString *)string orthography:(NSOrthography *)orthography;
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@end
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
392fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic NSString* const WebAutomaticSpellingCorrectionEnabled = @"WebAutomaticSpellingCorrectionEnabled";
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic NSString* const WebContinuousSpellCheckingEnabled = @"WebContinuousSpellCheckingEnabled";
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic NSString* const WebGrammarCheckingEnabled = @"WebGrammarCheckingEnabled";
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic NSString* const WebSmartInsertDeleteEnabled = @"WebSmartInsertDeleteEnabled";
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic NSString* const WebAutomaticQuoteSubstitutionEnabled = @"WebAutomaticQuoteSubstitutionEnabled";
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic NSString* const WebAutomaticDashSubstitutionEnabled = @"WebAutomaticDashSubstitutionEnabled";
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic NSString* const WebAutomaticLinkDetectionEnabled = @"WebAutomaticLinkDetectionEnabled";
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic NSString* const WebAutomaticTextReplacementEnabled = @"WebAutomaticTextReplacementEnabled";
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochTextCheckerState textCheckerState;
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void initializeState()
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool didInitializeState;
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (didInitializeState)
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isContinuousSpellCheckingEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebContinuousSpellCheckingEnabled] && TextChecker::isContinuousSpellCheckingAllowed();
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isGrammarCheckingEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebGrammarCheckingEnabled];
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticSpellingCorrectionEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticSpellingCorrectionEnabled];
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticQuoteSubstitutionEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticQuoteSubstitutionEnabled];
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticDashSubstitutionEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticDashSubstitutionEnabled];
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticLinkDetectionEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticLinkDetectionEnabled];
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticTextReplacementEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticTextReplacementEnabled];
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !defined(BUILDING_ON_SNOW_LEOPARD)
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (![[NSUserDefaults standardUserDefaults] objectForKey:WebAutomaticSpellingCorrectionEnabled])
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        textCheckerState.isAutomaticSpellingCorrectionEnabled = [NSSpellChecker isAutomaticSpellingCorrectionEnabled];
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    didInitializeState = true;
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst TextCheckerState& TextChecker::state()
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    initializeState();
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return textCheckerState;
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool TextChecker::isContinuousSpellCheckingAllowed()
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool allowContinuousSpellChecking = true;
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool readAllowContinuousSpellCheckingDefault = false;
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!readAllowContinuousSpellCheckingDefault) {
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if ([[NSUserDefaults standardUserDefaults] objectForKey:@"NSAllowContinuousSpellChecking"])
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            allowContinuousSpellChecking = [[NSUserDefaults standardUserDefaults] boolForKey:@"NSAllowContinuousSpellChecking"];
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        readAllowContinuousSpellCheckingDefault = true;
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return allowContinuousSpellChecking;
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::setContinuousSpellCheckingEnabled(bool isContinuousSpellCheckingEnabled)
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (state().isContinuousSpellCheckingEnabled == isContinuousSpellCheckingEnabled)
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isContinuousSpellCheckingEnabled = isContinuousSpellCheckingEnabled;
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:isContinuousSpellCheckingEnabled forKey:WebContinuousSpellCheckingEnabled];
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: preflight the spell checker.
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::setGrammarCheckingEnabled(bool isGrammarCheckingEnabled)
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (state().isGrammarCheckingEnabled == isGrammarCheckingEnabled)
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isGrammarCheckingEnabled = isGrammarCheckingEnabled;
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:isGrammarCheckingEnabled forKey:WebGrammarCheckingEnabled];
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We call preflightSpellChecker() when turning continuous spell checking on, but we don't need to do that here
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // because grammar checking only occurs on code paths that already preflight spell checking appropriately.
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::setAutomaticSpellingCorrectionEnabled(bool isAutomaticSpellingCorrectionEnabled)
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (state().isAutomaticSpellingCorrectionEnabled == isAutomaticSpellingCorrectionEnabled)
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticSpellingCorrectionEnabled = isAutomaticSpellingCorrectionEnabled;
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:isAutomaticSpellingCorrectionEnabled forKey:WebAutomaticSpellingCorrectionEnabled];
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::setAutomaticQuoteSubstitutionEnabled(bool isAutomaticQuoteSubstitutionEnabled)
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (state().isAutomaticQuoteSubstitutionEnabled == isAutomaticQuoteSubstitutionEnabled)
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticQuoteSubstitutionEnabled = isAutomaticQuoteSubstitutionEnabled;
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:isAutomaticQuoteSubstitutionEnabled forKey:WebAutomaticQuoteSubstitutionEnabled];
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::setAutomaticDashSubstitutionEnabled(bool isAutomaticDashSubstitutionEnabled)
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (state().isAutomaticDashSubstitutionEnabled == isAutomaticDashSubstitutionEnabled)
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticDashSubstitutionEnabled = isAutomaticDashSubstitutionEnabled;
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:isAutomaticDashSubstitutionEnabled forKey:WebAutomaticDashSubstitutionEnabled];
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::setAutomaticLinkDetectionEnabled(bool isAutomaticLinkDetectionEnabled)
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (state().isAutomaticLinkDetectionEnabled == isAutomaticLinkDetectionEnabled)
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticLinkDetectionEnabled = isAutomaticLinkDetectionEnabled;
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:isAutomaticLinkDetectionEnabled forKey:WebAutomaticLinkDetectionEnabled];
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::setAutomaticTextReplacementEnabled(bool isAutomaticTextReplacementEnabled)
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (state().isAutomaticTextReplacementEnabled == isAutomaticTextReplacementEnabled)
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    textCheckerState.isAutomaticTextReplacementEnabled = isAutomaticTextReplacementEnabled;
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:isAutomaticTextReplacementEnabled forKey:WebAutomaticTextReplacementEnabled];
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool smartInsertDeleteEnabled;
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool TextChecker::isSmartInsertDeleteEnabled()
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool readSmartInsertDeleteEnabledDefault;
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!readSmartInsertDeleteEnabledDefault) {
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        smartInsertDeleteEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebSmartInsertDeleteEnabled];
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        readSmartInsertDeleteEnabledDefault = true;
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return smartInsertDeleteEnabled;
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::setSmartInsertDeleteEnabled(bool flag)
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (flag == isSmartInsertDeleteEnabled())
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    smartInsertDeleteEnabled = flag;
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:flag forKey:WebSmartInsertDeleteEnabled];
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool TextChecker::substitutionsPanelIsShowing()
2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return [[[NSSpellChecker sharedSpellChecker] substitutionsPanel] isVisible];
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid TextChecker::toggleSubstitutionsPanelIsShowing()
2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSPanel *substitutionsPanel = [[NSSpellChecker sharedSpellChecker] substitutionsPanel];
2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if ([substitutionsPanel isVisible]) {
2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        [substitutionsPanel orderOut:nil];
2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [substitutionsPanel orderFront:nil];
2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochint64_t TextChecker::uniqueSpellDocumentTag(WebPageProxy*)
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [NSSpellChecker uniqueSpellDocumentTag];
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::closeSpellDocumentWithTag(int64_t tag)
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] closeSpellDocumentWithTag:tag];
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(UNIFIED_TEXT_CHECKING)
2272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochVector<TextCheckingResult> TextChecker::checkTextOfParagraph(int64_t spellDocumentTag, const UChar* text, int length, uint64_t checkingTypes)
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<TextCheckingResult> results;
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RetainPtr<NSString> textString(AdoptNS, [[NSString alloc] initWithCharactersNoCopy:const_cast<UChar*>(text) length:length freeWhenDone:NO]);
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSArray *incomingResults = [[NSSpellChecker sharedSpellChecker] checkString:textString .get()
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                                          range:NSMakeRange(0, length)
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                                          types:checkingTypes | NSTextCheckingTypeOrthography
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                                        options:nil
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                         inSpellDocumentWithTag:spellDocumentTag
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                                    orthography:NULL
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                                      wordCount:NULL];
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (NSTextCheckingResult *incomingResult in incomingResults) {
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSRange resultRange = [incomingResult range];
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSTextCheckingType resultType = [incomingResult resultType];
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(resultRange.location != NSNotFound);
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(resultRange.length > 0);
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (resultType == NSTextCheckingTypeSpelling && (checkingTypes & NSTextCheckingTypeSpelling)) {
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            TextCheckingResult result;
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.type = TextCheckingTypeSpelling;
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.location = resultRange.location;
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.length = resultRange.length;
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            results.append(result);
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        } else if (resultType == NSTextCheckingTypeGrammar && (checkingTypes & NSTextCheckingTypeGrammar)) {
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            TextCheckingResult result;
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NSArray *details = [incomingResult grammarDetails];
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.type = TextCheckingTypeGrammar;
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.location = resultRange.location;
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.length = resultRange.length;
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            for (NSDictionary *incomingDetail in details) {
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                ASSERT(incomingDetail);
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                GrammarDetail detail;
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                NSValue *detailRangeAsNSValue = [incomingDetail objectForKey:NSGrammarRange];
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                ASSERT(detailRangeAsNSValue);
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                NSRange detailNSRange = [detailRangeAsNSValue rangeValue];
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                ASSERT(detailNSRange.location != NSNotFound);
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                ASSERT(detailNSRange.length > 0);
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                detail.location = detailNSRange.location;
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                detail.length = detailNSRange.length;
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                detail.userDescription = [incomingDetail objectForKey:NSGrammarUserDescription];
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                NSArray *guesses = [incomingDetail objectForKey:NSGrammarCorrections];
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                for (NSString *guess in guesses)
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                    detail.guesses.append(String(guess));
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                result.details.append(detail);
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            }
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            results.append(result);
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        } else if (resultType == NSTextCheckingTypeLink && (checkingTypes & NSTextCheckingTypeLink)) {
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            TextCheckingResult result;
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.type = TextCheckingTypeLink;
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.location = resultRange.location;
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.length = resultRange.length;
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.replacement = [[incomingResult URL] absoluteString];
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            results.append(result);
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        } else if (resultType == NSTextCheckingTypeQuote && (checkingTypes & NSTextCheckingTypeQuote)) {
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            TextCheckingResult result;
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.type = TextCheckingTypeQuote;
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.location = resultRange.location;
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.length = resultRange.length;
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.replacement = [incomingResult replacementString];
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            results.append(result);
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        } else if (resultType == NSTextCheckingTypeDash && (checkingTypes & NSTextCheckingTypeDash)) {
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            TextCheckingResult result;
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.type = TextCheckingTypeDash;
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.location = resultRange.location;
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.length = resultRange.length;
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.replacement = [incomingResult replacementString];
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            results.append(result);
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        } else if (resultType == NSTextCheckingTypeReplacement && (checkingTypes & NSTextCheckingTypeReplacement)) {
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            TextCheckingResult result;
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.type = TextCheckingTypeReplacement;
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.location = resultRange.location;
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.length = resultRange.length;
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.replacement = [incomingResult replacementString];
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            results.append(result);
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        } else if (resultType == NSTextCheckingTypeCorrection && (checkingTypes & NSTextCheckingTypeCorrection)) {
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            TextCheckingResult result;
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.type = TextCheckingTypeCorrection;
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.location = resultRange.location;
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.length = resultRange.length;
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.replacement = [incomingResult replacementString];
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            results.append(result);
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return results;
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid TextChecker::checkSpellingOfString(int64_t, const UChar*, uint32_t, int32_t&, int32_t&)
3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Mac uses checkTextOfParagraph instead.
3202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    notImplemented();
3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid TextChecker::checkGrammarOfString(int64_t, const UChar*, uint32_t, Vector<WebCore::GrammarDetail>&, int32_t&, int32_t&)
3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Mac uses checkTextOfParagraph instead.
3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    notImplemented();
3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool TextChecker::spellingUIIsShowing()
3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return [[[NSSpellChecker sharedSpellChecker] spellingPanel] isVisible];
3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid TextChecker::toggleSpellingUIIsShowing()
3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSPanel *spellingPanel = [[NSSpellChecker sharedSpellChecker] spellingPanel];
3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if ([spellingPanel isVisible])
3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        [spellingPanel orderOut:nil];
3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else
3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        [spellingPanel orderFront:nil];
3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid TextChecker::updateSpellingUIWithMisspelledWord(int64_t, const String& misspelledWord)
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updateSpellingPanelWithMisspelledWord:misspelledWord];
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid TextChecker::updateSpellingUIWithGrammarString(int64_t, const String& badGrammarPhrase, const GrammarDetail& grammarDetail)
34981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
35081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RetainPtr<NSMutableArray> corrections(AdoptNS, [[NSMutableArray alloc] init]);
35181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (size_t i = 0; i < grammarDetail.guesses.size(); ++i) {
35281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        NSString *guess = grammarDetail.guesses[i];
35381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        [corrections.get() addObject:guess];
35481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
35581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
35681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    NSRange grammarRange = NSMakeRange(grammarDetail.location, grammarDetail.length);
35781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    NSString *grammarUserDescription = grammarDetail.userDescription;
3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RetainPtr<NSDictionary> grammarDetailDict(AdoptNS, [[NSDictionary alloc] initWithObjectsAndKeys:[NSValue valueWithRange:grammarRange], NSGrammarRange, grammarUserDescription, NSGrammarUserDescription, corrections.get(), NSGrammarCorrections, nil]);
35981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
36081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    [[NSSpellChecker sharedSpellChecker] updateSpellingPanelWithGrammarString:badGrammarPhrase detail:grammarDetailDict.get()];
36181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
36281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::getGuessesForWord(int64_t spellDocumentTag, const String& word, const String& context, Vector<String>& guesses)
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !defined(BUILDING_ON_SNOW_LEOPARD)
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSString* language = nil;
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSOrthography* orthography = nil;
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker];
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (context.length()) {
37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [checker checkString:context range:NSMakeRange(0, context.length()) types:NSTextCheckingTypeOrthography options:0 inSpellDocumentWithTag:spellDocumentTag orthography:&orthography wordCount:0];
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        language = [checker languageForWordRange:NSMakeRange(0, context.length()) inString:context orthography:orthography];
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSArray* stringsArray = [checker guessesForWordRange:NSMakeRange(0, word.length()) inString:word language:language inSpellDocumentWithTag:spellDocumentTag];
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSArray* stringsArray = [[NSSpellChecker sharedSpellChecker] guessesForWord:word];
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (NSString *guess in stringsArray)
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        guesses.append(guess);
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid TextChecker::learnWord(int64_t, const String& word)
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] learnWord:word];
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid TextChecker::ignoreWord(int64_t spellDocumentTag, const String& word)
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSSpellChecker sharedSpellChecker] ignoreWord:word inSpellDocumentWithTag:spellDocumentTag];
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
393