18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebEditorClient.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMCSSStyleDeclarationInternal.h"
3368513a70bcd92384395513322f1b801e7bf9c729Steve Block#import "DOMDocumentFragmentInternal.h"
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMHTMLElementInternal.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMHTMLInputElementInternal.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMHTMLTextAreaElementInternal.h"
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMNodeInternal.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMRangeInternal.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebArchive.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDataSourceInternal.h"
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebDelegateImplementationCaching.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDocument.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebEditingDelegatePrivate.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFormDelegate.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameInternal.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLView.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLViewInternal.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitVersionChecks.h"
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#import "WebLocalizableStringsInternal.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLExtras.h"
5268513a70bcd92384395513322f1b801e7bf9c729Steve Block#import "WebResourceInternal.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewInternal.h"
5468513a70bcd92384395513322f1b801e7bf9c729Steve Block#import <WebCore/ArchiveResource.h>
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Document.h>
5668513a70bcd92384395513322f1b801e7bf9c729Steve Block#import <WebCore/DocumentFragment.h>
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/EditAction.h>
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/EditCommand.h>
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/HTMLInputElement.h>
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/HTMLNames.h>
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/HTMLTextAreaElement.h>
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/KeyboardEvent.h>
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/LegacyWebArchive.h>
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/PlatformKeyboardEvent.h>
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/PlatformString.h>
66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import <WebCore/SpellChecker.h>
670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#import <WebCore/UserTypingGestureIndicator.h>
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreObjCExtras.h>
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <runtime/InitializeThreading.h>
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/PassRefPtr.h>
7121939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h>
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing namespace HTMLNames;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@interface NSSpellChecker (WebNSSpellCheckerDetails)
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (NSString *)languageForWordRange:(NSRange)range inString:(NSString *)string orthography:(NSOrthography *)orthography;
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@end
81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
8368513a70bcd92384395513322f1b801e7bf9c729Steve Block@interface NSAttributedString (WebNSAttributedStringDetails)
8468513a70bcd92384395513322f1b801e7bf9c729Steve Block- (id)_initWithDOMRange:(DOMRange*)range;
8568513a70bcd92384395513322f1b801e7bf9c729Steve Block- (DOMDocumentFragment*)_documentFromRange:(NSRange)range document:(DOMDocument*)document documentAttributes:(NSDictionary *)dict subresources:(NSArray **)subresources;
8668513a70bcd92384395513322f1b801e7bf9c729Steve Block@end
8768513a70bcd92384395513322f1b801e7bf9c729Steve Block
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic WebViewInsertAction kit(EditorInsertAction coreAction)
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<WebViewInsertAction>(coreAction);
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9368513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic const int InvalidCorrectionPanelTag = 0;
9468513a70bcd92384395513322f1b801e7bf9c729Steve Block
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSSpellChecker (NotYetPublicMethods)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)learnWord:(NSString *)word;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebEditCommand : NSObject
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RefPtr<EditCommand> m_command;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (WebEditCommand *)commandWithEditCommand:(PassRefPtr<EditCommand>)command;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (EditCommand *)command;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebEditCommand
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    JSC::initializeThreading();
11621939df44de1705786c545cd1bf519d47250322dBen Murdoch    WTF::initializeMainThreadToProcessMainThread();
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef BUILDING_ON_TIGER
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCoreObjCFinalizeOnMainThread(self);
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithEditCommand:(PassRefPtr<EditCommand>)command
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(command);
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super init];
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_command = command;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (WebCoreObjCScheduleDeallocateOnMainThread([WebEditCommand class], self))
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT_MAIN_THREAD();
141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super finalize];
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (WebEditCommand *)commandWithEditCommand:(PassRefPtr<EditCommand>)command
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[[WebEditCommand alloc] initWithEditCommand:command] autorelease];
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (EditCommand *)command
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return m_command.get();
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebEditorUndoTarget : NSObject
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)undoEditing:(id)arg;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)redoEditing:(id)arg;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebEditorUndoTarget
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)undoEditing:(id)arg
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT([arg isKindOfClass:[WebEditCommand class]]);
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [arg command]->unapply();
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)redoEditing:(id)arg
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT([arg isKindOfClass:[WebEditCommand class]]);
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [arg command]->reapply();
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::pageDestroyed()
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebEditorClient::WebEditorClient(WebView *webView)
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_webView(webView)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_undoTarget([[[WebEditorUndoTarget alloc] init] autorelease])
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_haveUndoRedoOperations(false)
1915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
1925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenWebEditorClient::~WebEditorClient()
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
197f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    dismissCorrectionPanel(ReasonForDismissingCorrectionPanelIgnored);
1985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::isContinuousSpellCheckingEnabled()
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [m_webView isContinuousSpellCheckingEnabled];
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::toggleContinuousSpellChecking()
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_webView toggleContinuousSpellChecking:nil];
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::isGrammarCheckingEnabled()
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [m_webView isGrammarCheckingEnabled];
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::toggleGrammarChecking()
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_webView toggleGrammarChecking:nil];
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint WebEditorClient::spellCheckerDocumentTag()
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [m_webView spellCheckerDocumentTag];
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldDeleteRange(Range* range)
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView _editingDelegateForwarder] webView:m_webView
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        shouldDeleteDOMRange:kit(range)];
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldShowDeleteInterface(HTMLElement* element)
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView _editingDelegateForwarder] webView:m_webView
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        shouldShowDeleteInterfaceForElement:kit(element)];
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::smartInsertDeleteEnabled()
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [m_webView smartInsertDeleteEnabled];
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool WebEditorClient::isSelectTrailingWhitespaceEnabled()
250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return [m_webView isSelectTrailingWhitespaceEnabled];
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldApplyStyle(CSSStyleDeclaration* style, Range* range)
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView _editingDelegateForwarder] webView:m_webView
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        shouldApplyStyle:kit(style) toElementsInDOMRange:kit(range)];
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldMoveRangeAfterDelete(Range* range, Range* rangeToBeReplaced)
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView _editingDelegateForwarder] webView:m_webView
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        shouldMoveRangeAfterDelete:kit(range) replacingRange:kit(rangeToBeReplaced)];
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldBeginEditing(Range* range)
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView _editingDelegateForwarder] webView:m_webView
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        shouldBeginEditingInDOMRange:kit(range)];
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldEndEditing(Range* range)
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView _editingDelegateForwarder] webView:m_webView
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                             shouldEndEditingInDOMRange:kit(range)];
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldInsertText(const String& text, Range* range, EditorInsertAction action)
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* webView = m_webView;
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[webView _editingDelegateForwarder] webView:webView shouldInsertText:text replacingDOMRange:kit(range) givenAction:kit(action)];
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldChangeSelectedRange(Range* fromRange, Range* toRange, EAffinity selectionAffinity, bool stillSelecting)
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [m_webView _shouldChangeSelectedDOMRange:kit(fromRange) toDOMRange:kit(toRange) affinity:kit(selectionAffinity) stillSelecting:stillSelecting];
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::didBeginEditing()
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] postNotificationName:WebViewDidBeginEditingNotification object:m_webView];
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::respondToChangedContents()
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView <WebDocumentView> *view = [[[m_webView selectedFrame] frameView] documentView];
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([view isKindOfClass:[WebHTMLView class]])
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [(WebHTMLView *)view _updateFontPanel];
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] postNotificationName:WebViewDidChangeNotification object:m_webView];
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::respondToChangedSelection()
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView _selectionChanged];
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This quirk is needed due to <rdar://problem/5009625> - We can phase it out once Aperture can adopt the new behavior on their end
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_APERTURE_QUIRK) && [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.Aperture"])
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] postNotificationName:WebViewDidChangeSelectionNotification object:m_webView];
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::didEndEditing()
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] postNotificationName:WebViewDidEndEditingNotification object:m_webView];
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::didWriteSelectionToPasteboard()
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[m_webView _editingDelegateForwarder] webView:m_webView didWriteSelectionToPasteboard:[NSPasteboard generalPasteboard]];
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::didSetSelectionTypesForPasteboard()
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[m_webView _editingDelegateForwarder] webView:m_webView didSetSelectionTypesForPasteboard:[NSPasteboard generalPasteboard]];
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33068513a70bcd92384395513322f1b801e7bf9c729Steve BlockNSString *WebEditorClient::userVisibleString(NSURL *URL)
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [URL _web_userVisibleString];
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNSURL *WebEditorClient::canonicalizeURL(NSURL *URL)
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [URL _webkit_canonicalize];
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNSURL *WebEditorClient::canonicalizeURLString(NSString *URLString)
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSURL *URL = nil;
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([URLString _webkit_looksLikeAbsoluteURL])
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        URL = [[NSURL _web_URLWithUserTypedString:URLString] _webkit_canonicalize];
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return URL;
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34868513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic NSArray *createExcludedElementsForAttributedStringConversion()
34968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
35068513a70bcd92384395513322f1b801e7bf9c729Steve Block    NSArray *elements = [[NSArray alloc] initWithObjects:
35168513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Omit style since we want style to be inline so the fragment can be easily inserted.
35268513a70bcd92384395513322f1b801e7bf9c729Steve Block        @"style",
35368513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Omit xml so the result is not XHTML.
35468513a70bcd92384395513322f1b801e7bf9c729Steve Block        @"xml",
35568513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Omit tags that will get stripped when converted to a fragment anyway.
35668513a70bcd92384395513322f1b801e7bf9c729Steve Block        @"doctype", @"html", @"head", @"body",
35768513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Omit deprecated tags.
35868513a70bcd92384395513322f1b801e7bf9c729Steve Block        @"applet", @"basefont", @"center", @"dir", @"font", @"isindex", @"menu", @"s", @"strike", @"u",
35968513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Omit object so no file attachments are part of the fragment.
36068513a70bcd92384395513322f1b801e7bf9c729Steve Block        @"object", nil];
36168513a70bcd92384395513322f1b801e7bf9c729Steve Block    CFRetain(elements);
36268513a70bcd92384395513322f1b801e7bf9c729Steve Block    return elements;
36368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
36468513a70bcd92384395513322f1b801e7bf9c729Steve Block
36568513a70bcd92384395513322f1b801e7bf9c729Steve BlockDocumentFragment* WebEditorClient::documentFragmentFromAttributedString(NSAttributedString *string, Vector<RefPtr<ArchiveResource> >& resources)
36668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
36768513a70bcd92384395513322f1b801e7bf9c729Steve Block    static NSArray *excludedElements = createExcludedElementsForAttributedStringConversion();
36868513a70bcd92384395513322f1b801e7bf9c729Steve Block
36968513a70bcd92384395513322f1b801e7bf9c729Steve Block    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: excludedElements, NSExcludedElementsDocumentAttribute,
37068513a70bcd92384395513322f1b801e7bf9c729Steve Block        nil, @"WebResourceHandler", nil];
37168513a70bcd92384395513322f1b801e7bf9c729Steve Block
37268513a70bcd92384395513322f1b801e7bf9c729Steve Block    NSArray *subResources;
37368513a70bcd92384395513322f1b801e7bf9c729Steve Block    DOMDocumentFragment* fragment = [string _documentFromRange:NSMakeRange(0, [string length])
37468513a70bcd92384395513322f1b801e7bf9c729Steve Block                                                      document:[[m_webView mainFrame] DOMDocument]
37568513a70bcd92384395513322f1b801e7bf9c729Steve Block                                            documentAttributes:dictionary
37668513a70bcd92384395513322f1b801e7bf9c729Steve Block                                                  subresources:&subResources];
37768513a70bcd92384395513322f1b801e7bf9c729Steve Block    for (WebResource* resource in subResources)
37868513a70bcd92384395513322f1b801e7bf9c729Steve Block        resources.append([resource _coreResource]);
37968513a70bcd92384395513322f1b801e7bf9c729Steve Block
38068513a70bcd92384395513322f1b801e7bf9c729Steve Block    [dictionary release];
38168513a70bcd92384395513322f1b801e7bf9c729Steve Block    return core(fragment);
38268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
38368513a70bcd92384395513322f1b801e7bf9c729Steve Block
38468513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid WebEditorClient::setInsertionPasteboard(NSPasteboard *pasteboard)
38568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
38668513a70bcd92384395513322f1b801e7bf9c729Steve Block    [m_webView _setInsertionPasteboard:pasteboard];
38768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
38868513a70bcd92384395513322f1b801e7bf9c729Steve Block
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER
39068513a70bcd92384395513322f1b801e7bf9c729Steve BlockNSArray *WebEditorClient::pasteboardTypesForSelection(Frame* selectedFrame)
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame* frame = kit(selectedFrame);
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[[frame frameView] documentView] pasteboardTypesForSelection];
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::uppercaseWord()
3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView uppercaseWord:nil];
4010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::lowercaseWord()
4040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView lowercaseWord:nil];
4060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::capitalizeWord()
4090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView capitalizeWord:nil];
4110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::showSubstitutionsPanel(bool show)
4140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSPanel *spellingPanel = [[NSSpellChecker sharedSpellChecker] substitutionsPanel];
4160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (show)
4170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [spellingPanel orderFront:nil];
4180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
4190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [spellingPanel orderOut:nil];
4200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool WebEditorClient::substitutionsPanelIsShowing()
4230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [[[NSSpellChecker sharedSpellChecker] substitutionsPanel] isVisible];
4250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::toggleSmartInsertDelete()
4280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView toggleSmartInsertDelete:nil];
4300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool WebEditorClient::isAutomaticQuoteSubstitutionEnabled()
4330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [m_webView isAutomaticQuoteSubstitutionEnabled];
4350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::toggleAutomaticQuoteSubstitution()
4380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView toggleAutomaticQuoteSubstitution:nil];
4400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool WebEditorClient::isAutomaticLinkDetectionEnabled()
4430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [m_webView isAutomaticLinkDetectionEnabled];
4450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::toggleAutomaticLinkDetection()
4480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView toggleAutomaticLinkDetection:nil];
4500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool WebEditorClient::isAutomaticDashSubstitutionEnabled()
4530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [m_webView isAutomaticDashSubstitutionEnabled];
4550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::toggleAutomaticDashSubstitution()
4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView toggleAutomaticDashSubstitution:nil];
4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool WebEditorClient::isAutomaticTextReplacementEnabled()
4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [m_webView isAutomaticTextReplacementEnabled];
4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::toggleAutomaticTextReplacement()
4680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView toggleAutomaticTextReplacement:nil];
4700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool WebEditorClient::isAutomaticSpellingCorrectionEnabled()
4730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [m_webView isAutomaticSpellingCorrectionEnabled];
4750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebEditorClient::toggleAutomaticSpellingCorrection()
4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_webView toggleAutomaticSpellingCorrection:nil];
4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
4820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldInsertNode(Node *node, Range* replacingRange, EditorInsertAction givenAction)
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView _editingDelegateForwarder] webView:m_webView shouldInsertNode:kit(node) replacingDOMRange:kit(replacingRange) givenAction:(WebViewInsertAction)givenAction];
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString* undoNameForEditAction(EditAction editAction)
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (editAction) {
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case EditActionUnspecified: return nil;
49281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionSetColor: return UI_STRING_KEY_INTERNAL("Set Color", "Set Color (Undo action name)", "Undo action name");
49381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionSetBackgroundColor: return UI_STRING_KEY_INTERNAL("Set Background Color", "Set Background Color (Undo action name)", "Undo action name");
49481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionTurnOffKerning: return UI_STRING_KEY_INTERNAL("Turn Off Kerning", "Turn Off Kerning (Undo action name)", "Undo action name");
49581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionTightenKerning: return UI_STRING_KEY_INTERNAL("Tighten Kerning", "Tighten Kerning (Undo action name)", "Undo action name");
49681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionLoosenKerning: return UI_STRING_KEY_INTERNAL("Loosen Kerning", "Loosen Kerning (Undo action name)", "Undo action name");
49781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionUseStandardKerning: return UI_STRING_KEY_INTERNAL("Use Standard Kerning", "Use Standard Kerning (Undo action name)", "Undo action name");
49881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionTurnOffLigatures: return UI_STRING_KEY_INTERNAL("Turn Off Ligatures", "Turn Off Ligatures (Undo action name)", "Undo action name");
49981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionUseStandardLigatures: return UI_STRING_KEY_INTERNAL("Use Standard Ligatures", "Use Standard Ligatures (Undo action name)", "Undo action name");
50081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionUseAllLigatures: return UI_STRING_KEY_INTERNAL("Use All Ligatures", "Use All Ligatures (Undo action name)", "Undo action name");
50181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionRaiseBaseline: return UI_STRING_KEY_INTERNAL("Raise Baseline", "Raise Baseline (Undo action name)", "Undo action name");
50281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionLowerBaseline: return UI_STRING_KEY_INTERNAL("Lower Baseline", "Lower Baseline (Undo action name)", "Undo action name");
50381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionSetTraditionalCharacterShape: return UI_STRING_KEY_INTERNAL("Set Traditional Character Shape", "Set Traditional Character Shape (Undo action name)", "Undo action name");
50481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionSetFont: return UI_STRING_KEY_INTERNAL("Set Font", "Set Font (Undo action name)", "Undo action name");
50581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionChangeAttributes: return UI_STRING_KEY_INTERNAL("Change Attributes", "Change Attributes (Undo action name)", "Undo action name");
50681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionAlignLeft: return UI_STRING_KEY_INTERNAL("Align Left", "Align Left (Undo action name)", "Undo action name");
50781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionAlignRight: return UI_STRING_KEY_INTERNAL("Align Right", "Align Right (Undo action name)", "Undo action name");
50881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionCenter: return UI_STRING_KEY_INTERNAL("Center", "Center (Undo action name)", "Undo action name");
50981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionJustify: return UI_STRING_KEY_INTERNAL("Justify", "Justify (Undo action name)", "Undo action name");
51081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionSetWritingDirection: return UI_STRING_KEY_INTERNAL("Set Writing Direction", "Set Writing Direction (Undo action name)", "Undo action name");
51181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionSubscript: return UI_STRING_KEY_INTERNAL("Subscript", "Subscript (Undo action name)", "Undo action name");
51281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionSuperscript: return UI_STRING_KEY_INTERNAL("Superscript", "Superscript (Undo action name)", "Undo action name");
51381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionUnderline: return UI_STRING_KEY_INTERNAL("Underline", "Underline (Undo action name)", "Undo action name");
51481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionOutline: return UI_STRING_KEY_INTERNAL("Outline", "Outline (Undo action name)", "Undo action name");
51581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionUnscript: return UI_STRING_KEY_INTERNAL("Unscript", "Unscript (Undo action name)", "Undo action name");
51681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionDrag: return UI_STRING_KEY_INTERNAL("Drag", "Drag (Undo action name)", "Undo action name");
51781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionCut: return UI_STRING_KEY_INTERNAL("Cut", "Cut (Undo action name)", "Undo action name");
51881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionPaste: return UI_STRING_KEY_INTERNAL("Paste", "Paste (Undo action name)", "Undo action name");
51981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionPasteFont: return UI_STRING_KEY_INTERNAL("Paste Font", "Paste Font (Undo action name)", "Undo action name");
52081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionPasteRuler: return UI_STRING_KEY_INTERNAL("Paste Ruler", "Paste Ruler (Undo action name)", "Undo action name");
52181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionTyping: return UI_STRING_KEY_INTERNAL("Typing", "Typing (Undo action name)", "Undo action name");
52281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionCreateLink: return UI_STRING_KEY_INTERNAL("Create Link", "Create Link (Undo action name)", "Undo action name");
52381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionUnlink: return UI_STRING_KEY_INTERNAL("Unlink", "Unlink (Undo action name)", "Undo action name");
52481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionInsertList: return UI_STRING_KEY_INTERNAL("Insert List", "Insert List (Undo action name)", "Undo action name");
52581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionFormatBlock: return UI_STRING_KEY_INTERNAL("Formatting", "Format Block (Undo action name)", "Undo action name");
52681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionIndent: return UI_STRING_KEY_INTERNAL("Indent", "Indent (Undo action name)", "Undo action name");
52781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        case EditActionOutdent: return UI_STRING_KEY_INTERNAL("Outdent", "Outdent (Undo action name)", "Undo action name");
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nil;
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::registerCommandForUndoOrRedo(PassRefPtr<EditCommand> cmd, bool isRedo)
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(cmd);
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSUndoManager *undoManager = [m_webView undoManager];
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *actionName = undoNameForEditAction(cmd->editingAction());
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebEditCommand *command = [WebEditCommand commandWithEditCommand:cmd];
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [undoManager registerUndoWithTarget:m_undoTarget.get() selector:(isRedo ? @selector(redoEditing:) : @selector(undoEditing:)) object:command];
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (actionName)
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [undoManager setActionName:actionName];
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_haveUndoRedoOperations = YES;
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::registerCommandForUndo(PassRefPtr<EditCommand> cmd)
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerCommandForUndoOrRedo(cmd, false);
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::registerCommandForRedo(PassRefPtr<EditCommand> cmd)
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerCommandForUndoOrRedo(cmd, true);
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::clearUndoRedoOperations()
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_haveUndoRedoOperations) {
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // workaround for <rdar://problem/4645507> NSUndoManager dies
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // with uncaught exception when undo items cleared while
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // groups are open
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSUndoManager *undoManager = [m_webView undoManager];
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int groupingLevel = [undoManager groupingLevel];
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < groupingLevel; ++i)
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [undoManager endUndoGrouping];
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [undoManager removeAllActionsWithTarget:m_undoTarget.get()];
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < groupingLevel; ++i)
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [undoManager beginUndoGrouping];
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_haveUndoRedoOperations = NO;
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool WebEditorClient::canCopyCut(bool defaultValue) const
57681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
57781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return defaultValue;
57881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
57981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
58081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool WebEditorClient::canPaste(bool defaultValue) const
58181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
58281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return defaultValue;
58381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
58481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::canUndo() const
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView undoManager] canUndo];
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::canRedo() const
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[m_webView undoManager] canRedo];
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::undo()
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (canUndo())
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[m_webView undoManager] undo];
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::redo()
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (canRedo())
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[m_webView undoManager] redo];
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::handleKeyboardEvent(KeyboardEvent* event)
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = event->target()->toNode()->document()->frame();
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebHTMLView *webHTMLView = [[kit(frame) frameView] documentView];
6112bde8e466a4451c7319e3a072d118917957d6554Steve Block    if ([webHTMLView _interpretKeyEvent:event savingCommands:NO])
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::handleInputMethodKeydown(KeyboardEvent* event)
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = event->target()->toNode()->document()->frame();
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebHTMLView *webHTMLView = [[kit(frame) frameView] documentView];
6192bde8e466a4451c7319e3a072d118917957d6554Steve Block    if ([webHTMLView _interpretKeyEvent:event savingCommands:YES])
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define FormDelegateLog(ctrl)  LOG(FormDelegate, "control=%@", ctrl)
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textFieldDidBeginEditing(Element* element)
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!element->hasTagName(inputTag))
628635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DOMHTMLInputElement* inputElement = kit(static_cast<HTMLInputElement*>(element));
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormDelegateLog(inputElement);
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFormDelegate(m_webView, @selector(textFieldDidBeginEditing:inFrame:), inputElement, kit(element->document()->frame()));
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textFieldDidEndEditing(Element* element)
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!element->hasTagName(inputTag))
638635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
639635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DOMHTMLInputElement* inputElement = kit(static_cast<HTMLInputElement*>(element));
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormDelegateLog(inputElement);
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFormDelegate(m_webView, @selector(textFieldDidEndEditing:inFrame:), inputElement, kit(element->document()->frame()));
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textDidChangeInTextField(Element* element)
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!element->hasTagName(inputTag))
648635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
6490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
6500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!UserTypingGestureIndicator::processingUserTypingGesture() || UserTypingGestureIndicator::focusedElementAtGestureStart() != element)
6510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
652635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DOMHTMLInputElement* inputElement = kit(static_cast<HTMLInputElement*>(element));
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormDelegateLog(inputElement);
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFormDelegate(m_webView, @selector(textDidChangeInTextField:inFrame:), inputElement, kit(element->document()->frame()));
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic SEL selectorForKeyEvent(KeyboardEvent* event)
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This helper function is for the auto-fill code so we can pass a selector to the form delegate.
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Eventually, we should move all of the auto-fill code down to WebKit and remove the need for this function by
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // not relying on the selector in the new implementation.
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The key identifiers are from <http://www.w3.org/TR/DOM-Level-3-Events/keyset.html#KeySet-Set>
6646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    const String& key = event->keyIdentifier();
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (key == "Up")
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return @selector(moveUp:);
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (key == "Down")
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return @selector(moveDown:);
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (key == "U+001B")
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return @selector(cancel:);
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (key == "U+0009") {
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (event->shiftKey())
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return @selector(insertBacktab:);
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return @selector(insertTab:);
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (key == "Enter")
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return @selector(insertNewline:);
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::doTextFieldCommandFromEvent(Element* element, KeyboardEvent* event)
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!element->hasTagName(inputTag))
684635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return NO;
685635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DOMHTMLInputElement* inputElement = kit(static_cast<HTMLInputElement*>(element));
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormDelegateLog(inputElement);
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SEL commandSelector = selectorForKeyEvent(event))
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return CallFormDelegateReturningBoolean(NO, m_webView, @selector(textField:doCommandBySelector:inFrame:), inputElement, commandSelector, kit(element->document()->frame()));
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textWillBeDeletedInTextField(Element* element)
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!element->hasTagName(inputTag))
696635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
697635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DOMHTMLInputElement* inputElement = kit(static_cast<HTMLInputElement*>(element));
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormDelegateLog(inputElement);
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We're using the deleteBackward selector for all deletion operations since the autofill code treats all deletions the same way.
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFormDelegateReturningBoolean(NO, m_webView, @selector(textField:doCommandBySelector:inFrame:), inputElement, @selector(deleteBackward:), kit(element->document()->frame()));
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textDidChangeInTextArea(Element* element)
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!element->hasTagName(textareaTag))
707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
708635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DOMHTMLTextAreaElement* textAreaElement = kit(static_cast<HTMLTextAreaElement*>(element));
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FormDelegateLog(textAreaElement);
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFormDelegate(m_webView, @selector(textDidChangeInTextArea:inFrame:), textAreaElement, kit(element->document()->frame()));
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::ignoreWordInSpellDocument(const String& text)
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSSpellChecker sharedSpellChecker] ignoreWord:text
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                             inSpellDocumentWithTag:spellCheckerDocumentTag()];
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::learnWord(const String& text)
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSSpellChecker sharedSpellChecker] learnWord:text];
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::checkSpellingOfString(const UChar* text, int length, int* misspellingLocation, int* misspellingLength)
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString* textString = [[NSString alloc] initWithCharactersNoCopy:const_cast<UChar*>(text) length:length freeWhenDone:NO];
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRange range = [[NSSpellChecker sharedSpellChecker] checkSpellingOfString:textString startingAt:0 language:nil wrap:NO inSpellDocumentWithTag:spellCheckerDocumentTag() wordCount:NULL];
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [textString release];
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (misspellingLocation) {
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // WebCore expects -1 to represent "not found"
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (range.location == NSNotFound)
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *misspellingLocation = -1;
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *misspellingLocation = range.location;
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (misspellingLength)
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *misspellingLength = range.length;
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString WebEditorClient::getAutoCorrectSuggestionForMisspelledWord(const String& inputWord)
7430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
7440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // This method can be implemented using customized algorithms for the particular browser.
7450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Currently, it computes an empty string.
7460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return String();
7470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
7480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::checkGrammarOfString(const UChar* text, int length, Vector<GrammarDetail>& details, int* badGrammarLocation, int* badGrammarLength)
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *grammarDetails;
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString* textString = [[NSString alloc] initWithCharactersNoCopy:const_cast<UChar*>(text) length:length freeWhenDone:NO];
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRange range = [[NSSpellChecker sharedSpellChecker] checkGrammarOfString:textString startingAt:0 language:nil wrap:NO inSpellDocumentWithTag:spellCheckerDocumentTag() details:&grammarDetails];
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [textString release];
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (badGrammarLocation)
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // WebCore expects -1 to represent "not found"
75881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        *badGrammarLocation = (range.location == NSNotFound) ? -1 : static_cast<int>(range.location);
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (badGrammarLength)
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *badGrammarLength = range.length;
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (NSDictionary *detail in grammarDetails) {
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(detail);
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        GrammarDetail grammarDetail;
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSValue *detailRangeAsNSValue = [detail objectForKey:NSGrammarRange];
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(detailRangeAsNSValue);
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSRange detailNSRange = [detailRangeAsNSValue rangeValue];
767cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        ASSERT(detailNSRange.location != NSNotFound);
768cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        ASSERT(detailNSRange.length > 0);
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        grammarDetail.location = detailNSRange.location;
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        grammarDetail.length = detailNSRange.length;
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        grammarDetail.userDescription = [detail objectForKey:NSGrammarUserDescription];
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSArray *guesses = [detail objectForKey:NSGrammarCorrections];
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (NSString *guess in guesses)
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            grammarDetail.guesses.append(String(guess));
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        details.append(grammarDetail);
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
780563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
7812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic Vector<TextCheckingResult> core(NSArray *incomingResults, TextCheckingTypeMask checkingTypes)
7822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
7832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Vector<TextCheckingResult> results;
7842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
785563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (NSTextCheckingResult *incomingResult in incomingResults) {
786563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        NSRange resultRange = [incomingResult range];
787563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        NSTextCheckingType resultType = [incomingResult resultType];
788cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        ASSERT(resultRange.location != NSNotFound);
789cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        ASSERT(resultRange.length > 0);
7900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (NSTextCheckingTypeSpelling == resultType && 0 != (checkingTypes & NSTextCheckingTypeSpelling)) {
791563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            TextCheckingResult result;
7920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.type = TextCheckingTypeSpelling;
793563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            result.location = resultRange.location;
794563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            result.length = resultRange.length;
795563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            results.append(result);
7960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (NSTextCheckingTypeGrammar == resultType && 0 != (checkingTypes & NSTextCheckingTypeGrammar)) {
797563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            TextCheckingResult result;
798563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            NSArray *details = [incomingResult grammarDetails];
7990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.type = TextCheckingTypeGrammar;
800563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            result.location = resultRange.location;
801563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            result.length = resultRange.length;
802563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            for (NSDictionary *incomingDetail in details) {
803563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                ASSERT(incomingDetail);
804563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                GrammarDetail detail;
805563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                NSValue *detailRangeAsNSValue = [incomingDetail objectForKey:NSGrammarRange];
806563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                ASSERT(detailRangeAsNSValue);
807563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                NSRange detailNSRange = [detailRangeAsNSValue rangeValue];
808cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                ASSERT(detailNSRange.location != NSNotFound);
809cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                ASSERT(detailNSRange.length > 0);
810563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                detail.location = detailNSRange.location;
811563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                detail.length = detailNSRange.length;
812563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                detail.userDescription = [incomingDetail objectForKey:NSGrammarUserDescription];
813563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                NSArray *guesses = [incomingDetail objectForKey:NSGrammarCorrections];
814563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                for (NSString *guess in guesses)
815563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                    detail.guesses.append(String(guess));
816563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                result.details.append(detail);
817563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
818563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            results.append(result);
8190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (NSTextCheckingTypeLink == resultType && 0 != (checkingTypes & NSTextCheckingTypeLink)) {
8200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            TextCheckingResult result;
8210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.type = TextCheckingTypeLink;
8220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.location = resultRange.location;
8230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.length = resultRange.length;
8240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.replacement = [[incomingResult URL] absoluteString];
8250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            results.append(result);
8260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (NSTextCheckingTypeQuote == resultType && 0 != (checkingTypes & NSTextCheckingTypeQuote)) {
8270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            TextCheckingResult result;
8280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.type = TextCheckingTypeQuote;
8290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.location = resultRange.location;
8300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.length = resultRange.length;
8310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.replacement = [incomingResult replacementString];
8320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            results.append(result);
8330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (NSTextCheckingTypeDash == resultType && 0 != (checkingTypes & NSTextCheckingTypeDash)) {
8340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            TextCheckingResult result;
8350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.type = TextCheckingTypeDash;
8360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.location = resultRange.location;
8370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.length = resultRange.length;
8380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.replacement = [incomingResult replacementString];
8390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            results.append(result);
8400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (NSTextCheckingTypeReplacement == resultType && 0 != (checkingTypes & NSTextCheckingTypeReplacement)) {
8410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            TextCheckingResult result;
8420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.type = TextCheckingTypeReplacement;
8430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.location = resultRange.location;
8440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.length = resultRange.length;
8450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.replacement = [incomingResult replacementString];
8460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            results.append(result);
8470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (NSTextCheckingTypeCorrection == resultType && 0 != (checkingTypes & NSTextCheckingTypeCorrection)) {
8480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            TextCheckingResult result;
8490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.type = TextCheckingTypeCorrection;
8500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.location = resultRange.location;
8510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.length = resultRange.length;
8520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            result.replacement = [incomingResult replacementString];
8530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            results.append(result);
854563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
855563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
8562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return results;
8582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
8592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
8602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebEditorClient::checkTextOfParagraph(const UChar* text, int length, TextCheckingTypeMask checkingTypes, Vector<TextCheckingResult>& results)
8622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
8632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
8642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSString *textString = [[NSString alloc] initWithCharactersNoCopy:const_cast<UChar*>(text) length:length freeWhenDone:NO];
8652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSArray *incomingResults = [[NSSpellChecker sharedSpellChecker] checkString:textString range:NSMakeRange(0, [textString length]) types:(checkingTypes|NSTextCheckingTypeOrthography) options:nil inSpellDocumentWithTag:spellCheckerDocumentTag() orthography:NULL wordCount:NULL];
8662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [textString release];
8672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    results = core(incomingResults, checkingTypes);
868563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
869563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
870563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::updateSpellingUIWithGrammarString(const String& badGrammarPhrase, const GrammarDetail& grammarDetail)
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableArray* corrections = [NSMutableArray array];
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < grammarDetail.guesses.size(); i++) {
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSString* guess = grammarDetail.guesses[i];
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [corrections addObject:guess];
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRange grammarRange = NSMakeRange(grammarDetail.location, grammarDetail.length);
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString* grammarUserDescription = grammarDetail.userDescription;
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableDictionary* grammarDetailDict = [NSDictionary dictionaryWithObjectsAndKeys:[NSValue valueWithRange:grammarRange], NSGrammarRange, grammarUserDescription, NSGrammarUserDescription, corrections, NSGrammarCorrections, nil];
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSSpellChecker sharedSpellChecker] updateSpellingPanelWithGrammarString:badGrammarPhrase detail:grammarDetailDict];
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
8882bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebEditorClient::showCorrectionPanel(CorrectionPanelInfo::PanelType panelType, const FloatRect& boundingBoxOfReplacedString, const String& replacedString, const String& replacementString, const Vector<String>& alternativeReplacementStrings)
8892bde8e466a4451c7319e3a072d118917957d6554Steve Block{
8902bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_correctionPanel.show(m_webView, panelType, boundingBoxOfReplacedString, replacedString, replacementString, alternativeReplacementStrings);
8915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
8925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
893f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebEditorClient::dismissCorrectionPanel(ReasonForDismissingCorrectionPanel reasonForDismissing)
8945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
8952bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_correctionPanel.dismiss(reasonForDismissing);
8965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
89768513a70bcd92384395513322f1b801e7bf9c729Steve Block
8982bde8e466a4451c7319e3a072d118917957d6554Steve BlockString WebEditorClient::dismissCorrectionPanelSoon(ReasonForDismissingCorrectionPanel reasonForDismissing)
89968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
9002bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_correctionPanel.dismissSoon(reasonForDismissing);
90168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
90281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
90381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebEditorClient::recordAutocorrectionResponse(EditorClient::AutocorrectionResponseType responseType, const String& replacedString, const String& replacementString)
90481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
9052bde8e466a4451c7319e3a072d118917957d6554Steve Block    NSCorrectionResponse response = responseType == EditorClient::AutocorrectionReverted ? NSCorrectionResponseReverted : NSCorrectionResponseEdited;
9062bde8e466a4451c7319e3a072d118917957d6554Steve Block    CorrectionPanel::recordAutocorrectionResponse(m_webView, response, replacedString, replacementString);
90781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
9085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
9095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::updateSpellingUIWithMisspelledWord(const String& misspelledWord)
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSSpellChecker sharedSpellChecker] updateSpellingPanelWithMisspelledWord:misspelledWord];
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::showSpellingUI(bool show)
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPanel *spellingPanel = [[NSSpellChecker sharedSpellChecker] spellingPanel];
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (show)
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [spellingPanel orderFront:nil];
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [spellingPanel orderOut:nil];
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::spellingUIIsShowing()
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[[NSSpellChecker sharedSpellChecker] spellingPanel] isVisible];
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
929f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebEditorClient::getGuessesForWord(const String& word, const String& context, Vector<String>& guesses) {
930f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    guesses.clear();
931f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
932f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSString* language = nil;
933f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSOrthography* orthography = nil;
934f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker];
935f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (context.length()) {
936f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        [checker checkString:context range:NSMakeRange(0, context.length()) types:NSTextCheckingTypeOrthography options:0 inSpellDocumentWithTag:spellCheckerDocumentTag() orthography:&orthography wordCount:0];
937f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        language = [checker languageForWordRange:NSMakeRange(0, context.length()) inString:context orthography:orthography];
938f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
939f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSArray* stringsArray = [checker guessesForWordRange:NSMakeRange(0, word.length()) inString:word language:language inSpellDocumentWithTag:spellCheckerDocumentTag()];
940f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray* stringsArray = [[NSSpellChecker sharedSpellChecker] guessesForWord:word];
942f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned count = [stringsArray count];
944f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (count > 0) {
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSEnumerator* enumerator = [stringsArray objectEnumerator];
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSString* string;
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while ((string = [enumerator nextObject]) != nil)
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            guesses.append(string);
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
953967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid WebEditorClient::willSetInputMethodState()
954967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
955967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
956967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::setInputMethodState(bool)
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
960f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
961f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
962f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch@interface WebEditorSpellCheckResponder : NSObject
963f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
964f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WebCore::SpellChecker* _sender;
965f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    int _sequence;
9662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    TextCheckingTypeMask _types;
967f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RetainPtr<NSArray> _results;
968f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
9692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (id)initWithSender:(WebCore::SpellChecker*)sender sequence:(int)sequence types:(WebCore::TextCheckingTypeMask)types results:(NSArray*)results;
970f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (void)perform;
971f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch@end
972f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
973f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch@implementation WebEditorSpellCheckResponder
9742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (id)initWithSender:(WebCore::SpellChecker*)sender sequence:(int)sequence types:(WebCore::TextCheckingTypeMask)types results:(NSArray*)results
975f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
976f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    self = [super init];
977f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!self)
978f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return nil;
979f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _sender = sender;
980f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _sequence = sequence;
9812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _types = types;
982f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _results = results;
983f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return self;
984f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
985f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
986f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (void)perform
987f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
9882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _sender->didCheck(_sequence, core(_results.get(), _types));
989f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
990f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
991f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch@end
992f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
993f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
9942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebEditorClient::requestCheckingOfString(WebCore::SpellChecker* sender, int sequence, WebCore::TextCheckingTypeMask checkingTypes, const String& text)
995f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
996f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
997f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSRange range = NSMakeRange(0, text.length());
998f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSRunLoop* currentLoop = [NSRunLoop currentRunLoop];
999f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [[NSSpellChecker sharedSpellChecker] requestCheckingOfString:text range:range types:NSTextCheckingAllSystemTypes options:0 inSpellDocumentWithTag:0
1000f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                         completionHandler:^(NSInteger, NSArray* results, NSOrthography*, NSInteger) {
1001f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            [currentLoop performSelector:@selector(perform)
10022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                  target:[[[WebEditorSpellCheckResponder alloc] initWithSender:sender sequence:sequence types:checkingTypes results:results] autorelease]
1003f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                argument:nil order:0 modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]];
1004f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }];
1005f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
1006f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
1007