18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2006, 2007, 2011 Apple Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitDLL.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebEditorClient.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKit.h"
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "WebNotification.h"
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "WebNotificationCenter.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebView.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMCoreClasses.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/BString.h>
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/Document.h>
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/EditCommand.h>
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/HTMLElement.h>
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/HTMLInputElement.h>
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/HTMLNames.h>
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/KeyboardEvent.h>
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebCore/LocalizedStrings.h>
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/NotImplemented.h>
440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include <WebCore/PlatformKeyboardEvent.h>
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/Range.h>
460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include <WebCore/UserTypingGestureIndicator.h>
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// {09A11D2B-FAFB-4ca0-A6F7-791EE8932C88}
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const GUID IID_IWebUndoCommand =
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 0x9a11d2b, 0xfafb, 0x4ca0, { 0xa6, 0xf7, 0x79, 0x1e, 0xe8, 0x93, 0x2c, 0x88 } };
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass IWebUndoCommand : public IUnknown {
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void execute() = 0;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// WebEditorUndoTarget -------------------------------------------------------------
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WebEditorUndoTarget : public IWebUndoTarget
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebEditorUndoTarget();
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // IUnknown
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ULONG STDMETHODCALLTYPE AddRef(void);
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ULONG STDMETHODCALLTYPE Release(void);
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // IWebUndoTarget
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual HRESULT STDMETHODCALLTYPE invoke(
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [in] */ BSTR actionName,
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* [in] */ IUnknown *obj);
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ULONG m_refCount;
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebEditorUndoTarget::WebEditorUndoTarget()
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project: m_refCount(1)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebEditorUndoTarget::QueryInterface(REFIID riid, void** ppvObject)
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *ppvObject = 0;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (IsEqualGUID(riid, IID_IUnknown))
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *ppvObject = static_cast<IWebUndoTarget*>(this);
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (IsEqualGUID(riid, IID_IWebUndoTarget))
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *ppvObject = static_cast<IWebUndoTarget*>(this);
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return E_NOINTERFACE;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AddRef();
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectULONG STDMETHODCALLTYPE WebEditorUndoTarget::AddRef(void)
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ++m_refCount;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectULONG STDMETHODCALLTYPE WebEditorUndoTarget::Release(void)
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ULONG newRef = --m_refCount;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!newRef)
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete(this);
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return newRef;
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebEditorUndoTarget::invoke(
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* [in] */ BSTR /*actionName*/,
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* [in] */ IUnknown *obj)
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebUndoCommand* undoCommand = 0;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(obj->QueryInterface(IID_IWebUndoCommand, (void**)&undoCommand))) {
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        undoCommand->execute();
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        undoCommand->Release();
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// WebEditorClient ------------------------------------------------------------------
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebEditorClient::WebEditorClient(WebView* webView)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_webView(webView)
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_undoTarget(0)
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_undoTarget = new WebEditorUndoTarget();
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebEditorClient::~WebEditorClient()
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_undoTarget)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_undoTarget->Release();
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::pageDestroyed()
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::isContinuousSpellCheckingEnabled()
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL enabled;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->isContinuousSpellCheckingEnabled(&enabled)))
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!enabled;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::toggleContinuousSpellChecking()
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webView->toggleContinuousSpellChecking(0);
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::isGrammarCheckingEnabled()
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL enabled;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->isGrammarCheckingEnabled(&enabled)))
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!enabled;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::toggleGrammarChecking()
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webView->toggleGrammarChecking(0);
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void initViewSpecificSpelling(IWebViewEditing* viewEditing)
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we just use this as a flag to indicate that we've spell checked the document
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and need to close the spell checker out when the view closes.
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int tag;
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewEditing->spellCheckerDocumentTag(&tag);
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint WebEditorClient::spellCheckerDocumentTag()
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we don't use the concept of spelling tags
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT_NOT_REACHED();
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldBeginEditing(Range*)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldEndEditing(Range*)
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::didBeginEditing()
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::respondToChangedContents()
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::respondToChangedSelection()
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webView->selectionChanged();
213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static BSTR webViewDidChangeSelectionNotificationName = SysAllocString(WebViewDidChangeSelectionNotification);
215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    IWebNotificationCenter* notifyCenter = WebNotificationCenter::defaultCenterInternal();
216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notifyCenter->postNotificationName(webViewDidChangeSelectionNotificationName, static_cast<IWebView*>(m_webView), 0);
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::didEndEditing()
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::didWriteSelectionToPasteboard()
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::didSetSelectionTypesForPasteboard()
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldDeleteRange(Range* /*range*/)
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: calling m_webView->editingDelegate() will cause an assertion failure so we don't want to enable this code until that's implemented.
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //BOOL result = false;
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //IWebViewEditingDelegate* editingDelegate;
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //// FIXME: DOMRange needs to be implemented before anything meaningful can be done here
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //IDOMRange* domRange(0);
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //if (SUCCEEDED(m_webView->editingDelegate(&editingDelegate))) {
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //    editingDelegate->shouldDeleteDOMRange(m_webView, domRange, &result);
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //    editingDelegate->Release();
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //}
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //return !!result;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldInsertNode(Node* /*node*/, Range* /*replacingRange*/, EditorInsertAction /*givenAction*/)
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldInsertText(const String& /*str*/, Range* /* replacingRange */, EditorInsertAction /*givenAction*/)
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: calling m_webView->editingDelegate() will cause an assertion failure so we don't want to enable this code until that's implemented.
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //BOOL result = false;
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //IWebViewEditingDelegate* editingDelegate;
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //// FIXME: DOMRange needs to be implemented before anything meaningful can be done here
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //IDOMRange* domRange(0); // make a DOMRange from replacingRange
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //BString text(str);
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //if (SUCCEEDED(m_webView->editingDelegate(&editingDelegate))) {
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //    editingDelegate->shouldInsertText(m_webView, text, domRange, (WebViewInsertAction) givenAction, &result);
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //    editingDelegate->Release();
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //}
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //return !!result;
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//bool WebEditorClient::shouldChangeSelectedRange(Range *currentRange, Range *toProposedRange, SelectionAffinity selectionAffinity, bool stillSelecting)
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//{ notImplemented(); return false; }
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldApplyStyle(CSSStyleDeclaration* /*style*/, Range* /*toElementsInDOMRange*/)
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ notImplemented(); return true; }
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldMoveRangeAfterDelete(Range* /*range*/, Range* /*rangeToBeReplaced*/)
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ notImplemented(); return true; }
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldChangeTypingStyle(CSSStyleDeclaration* /*currentStyle*/, CSSStyleDeclaration* /*toProposedStyle*/)
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ notImplemented(); return false; }
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::webViewDidChangeTypingStyle(WebNotification* /*notification*/)
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{  notImplemented(); }
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::webViewDidChangeSelection(WebNotification* /*notification*/)
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{  notImplemented(); }
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldShowDeleteInterface(HTMLElement* /*element*/)
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ notImplemented(); return false; }
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::smartInsertDeleteEnabled(void)
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL enabled = FALSE;
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webView->smartInsertDeleteEnabled(&enabled);
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!enabled;
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool WebEditorClient::isSelectTrailingWhitespaceEnabled(void)
304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    BOOL enabled = FALSE;
306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_webView->isSelectTrailingWhitespaceEnabled(&enabled);
307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return !!enabled;
308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::shouldChangeSelectedRange(WebCore::Range*, WebCore::Range*, WebCore::EAffinity, bool)
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ notImplemented(); return true; }
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textFieldDidBeginEditing(Element* e)
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebFormDelegate* formDelegate;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) {
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IDOMElement* domElement = DOMElement::createInstance(e);
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (domElement) {
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            IDOMHTMLInputElement* domInputElement;
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) {
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                formDelegate->textFieldDidBeginEditing(domInputElement, kit(e->document()->frame()));
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                domInputElement->Release();
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            domElement->Release();
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        formDelegate->Release();
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textFieldDidEndEditing(Element* e)
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebFormDelegate* formDelegate;
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) {
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IDOMElement* domElement = DOMElement::createInstance(e);
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (domElement) {
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            IDOMHTMLInputElement* domInputElement;
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) {
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                formDelegate->textFieldDidEndEditing(domInputElement, kit(e->document()->frame()));
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                domInputElement->Release();
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            domElement->Release();
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        formDelegate->Release();
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textDidChangeInTextField(Element* e)
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!UserTypingGestureIndicator::processingUserTypingGesture() || UserTypingGestureIndicator::focusedElementAtGestureStart() != e)
3500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
3510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebFormDelegate* formDelegate;
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) {
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IDOMElement* domElement = DOMElement::createInstance(e);
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (domElement) {
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            IDOMHTMLInputElement* domInputElement;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) {
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                formDelegate->textDidChangeInTextField(domInputElement, kit(e->document()->frame()));
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                domInputElement->Release();
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            domElement->Release();
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        formDelegate->Release();
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::doTextFieldCommandFromEvent(Element* e, KeyboardEvent* ke)
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL result = FALSE;
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebFormDelegate* formDelegate;
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) {
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IDOMElement* domElement = DOMElement::createInstance(e);
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (domElement) {
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            IDOMHTMLInputElement* domInputElement;
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) {
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String command = m_webView->interpretKeyEvent(ke);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // We allow empty commands here because the app code actually depends on this being called for all key presses.
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // We may want to revisit this later because it doesn't really make sense to send an empty command.
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                formDelegate->doPlatformCommand(domInputElement, BString(command), kit(e->document()->frame()), &result);
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                domInputElement->Release();
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            domElement->Release();
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        formDelegate->Release();
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!result;
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textWillBeDeletedInTextField(Element* e)
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We're using the deleteBackward command for all deletion operations since the autofill code treats all deletions the same way.
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebFormDelegate* formDelegate;
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) {
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IDOMElement* domElement = DOMElement::createInstance(e);
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (domElement) {
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            IDOMHTMLInputElement* domInputElement;
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) {
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                BOOL result;
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                formDelegate->doPlatformCommand(domInputElement, BString(L"DeleteBackward"), kit(e->document()->frame()), &result);
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                domInputElement->Release();
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            domElement->Release();
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        formDelegate->Release();
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::textDidChangeInTextArea(Element* e)
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebFormDelegate* formDelegate;
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) {
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IDOMElement* domElement = DOMElement::createInstance(e);
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (domElement) {
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            IDOMHTMLTextAreaElement* domTextAreaElement;
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLTextAreaElement, (void**)&domTextAreaElement))) {
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                formDelegate->textDidChangeInTextArea(domTextAreaElement, kit(e->document()->frame()));
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                domTextAreaElement->Release();
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            domElement->Release();
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        formDelegate->Release();
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WebEditorUndoCommand : public IWebUndoCommand
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebEditorUndoCommand(PassRefPtr<EditCommand> editCommand, bool isUndo);
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void execute();
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // IUnknown
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ULONG STDMETHODCALLTYPE AddRef(void);
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ULONG STDMETHODCALLTYPE Release(void);
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ULONG m_refCount;
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<EditCommand> m_editCommand;
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_isUndo;
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebEditorUndoCommand::WebEditorUndoCommand(PassRefPtr<EditCommand> editCommand, bool isUndo)
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_editCommand(editCommand)
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_isUndo(isUndo)
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_refCount(1)
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorUndoCommand::execute()
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_isUndo)
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_editCommand->unapply();
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_editCommand->reapply();
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHRESULT STDMETHODCALLTYPE WebEditorUndoCommand::QueryInterface(REFIID riid, void** ppvObject)
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *ppvObject = 0;
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (IsEqualGUID(riid, IID_IUnknown))
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *ppvObject = static_cast<IWebUndoCommand*>(this);
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (IsEqualGUID(riid, IID_IWebUndoCommand))
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        *ppvObject = static_cast<IWebUndoCommand*>(this);
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return E_NOINTERFACE;
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AddRef();
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return S_OK;
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectULONG STDMETHODCALLTYPE WebEditorUndoCommand::AddRef(void)
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ++m_refCount;
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectULONG STDMETHODCALLTYPE WebEditorUndoCommand::Release(void)
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ULONG newRef = --m_refCount;
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!newRef)
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete(this);
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return newRef;
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic String undoNameForEditAction(EditAction editAction)
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (editAction) {
4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionUnspecified: return String();
4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionSetColor: return WEB_UI_STRING_KEY("Set Color", "Set Color (Undo action name)", "Undo action name");
4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionSetBackgroundColor: return WEB_UI_STRING_KEY("Set Background Color", "Set Background Color (Undo action name)", "Undo action name");
4912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionTurnOffKerning: return WEB_UI_STRING_KEY("Turn Off Kerning", "Turn Off Kerning (Undo action name)", "Undo action name");
4922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionTightenKerning: return WEB_UI_STRING_KEY("Tighten Kerning", "Tighten Kerning (Undo action name)", "Undo action name");
4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionLoosenKerning: return WEB_UI_STRING_KEY("Loosen Kerning", "Loosen Kerning (Undo action name)", "Undo action name");
4942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionUseStandardKerning: return WEB_UI_STRING_KEY("Use Standard Kerning", "Use Standard Kerning (Undo action name)", "Undo action name");
4952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionTurnOffLigatures: return WEB_UI_STRING_KEY("Turn Off Ligatures", "Turn Off Ligatures (Undo action name)", "Undo action name");
4962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionUseStandardLigatures: return WEB_UI_STRING_KEY("Use Standard Ligatures", "Use Standard Ligatures (Undo action name)", "Undo action name");
4972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionUseAllLigatures: return WEB_UI_STRING_KEY("Use All Ligatures", "Use All Ligatures (Undo action name)", "Undo action name");
4982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionRaiseBaseline: return WEB_UI_STRING_KEY("Raise Baseline", "Raise Baseline (Undo action name)", "Undo action name");
4992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionLowerBaseline: return WEB_UI_STRING_KEY("Lower Baseline", "Lower Baseline (Undo action name)", "Undo action name");
5002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionSetTraditionalCharacterShape: return WEB_UI_STRING_KEY("Set Traditional Character Shape", "Set Traditional Character Shape (Undo action name)", "Undo action name");
5012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionSetFont: return WEB_UI_STRING_KEY("Set Font", "Set Font (Undo action name)", "Undo action name");
5022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionChangeAttributes: return WEB_UI_STRING_KEY("Change Attributes", "Change Attributes (Undo action name)", "Undo action name");
5032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionAlignLeft: return WEB_UI_STRING_KEY("Align Left", "Align Left (Undo action name)", "Undo action name");
5042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionAlignRight: return WEB_UI_STRING_KEY("Align Right", "Align Right (Undo action name)", "Undo action name");
5052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionCenter: return WEB_UI_STRING_KEY("Center", "Center (Undo action name)", "Undo action name");
5062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionJustify: return WEB_UI_STRING_KEY("Justify", "Justify (Undo action name)", "Undo action name");
5072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionSetWritingDirection: return WEB_UI_STRING_KEY("Set Writing Direction", "Set Writing Direction (Undo action name)", "Undo action name");
5082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionSubscript: return WEB_UI_STRING_KEY("Subscript", "Subscript (Undo action name)", "Undo action name");
5092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionSuperscript: return WEB_UI_STRING_KEY("Superscript", "Superscript (Undo action name)", "Undo action name");
5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionUnderline: return WEB_UI_STRING_KEY("Underline", "Underline (Undo action name)", "Undo action name");
5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionOutline: return WEB_UI_STRING_KEY("Outline", "Outline (Undo action name)", "Undo action name");
5122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionUnscript: return WEB_UI_STRING_KEY("Unscript", "Unscript (Undo action name)", "Undo action name");
5132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionDrag: return WEB_UI_STRING_KEY("Drag", "Drag (Undo action name)", "Undo action name");
5142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionCut: return WEB_UI_STRING_KEY("Cut", "Cut (Undo action name)", "Undo action name");
5152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionPaste: return WEB_UI_STRING_KEY("Paste", "Paste (Undo action name)", "Undo action name");
5162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionPasteFont: return WEB_UI_STRING_KEY("Paste Font", "Paste Font (Undo action name)", "Undo action name");
5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionPasteRuler: return WEB_UI_STRING_KEY("Paste Ruler", "Paste Ruler (Undo action name)", "Undo action name");
5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionTyping: return WEB_UI_STRING_KEY("Typing", "Typing (Undo action name)", "Undo action name");
5192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionCreateLink: return WEB_UI_STRING_KEY("Create Link", "Create Link (Undo action name)", "Undo action name");
5202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionUnlink: return WEB_UI_STRING_KEY("Unlink", "Unlink (Undo action name)", "Undo action name");
5212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionInsertList: return WEB_UI_STRING_KEY("Insert List", "Insert List (Undo action name)", "Undo action name");
5222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionFormatBlock: return WEB_UI_STRING_KEY("Formatting", "Format Block (Undo action name)", "Undo action name");
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionIndent: return WEB_UI_STRING_KEY("Indent", "Indent (Undo action name)", "Undo action name");
5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case EditActionOutdent: return WEB_UI_STRING_KEY("Outdent", "Outdent (Undo action name)", "Undo action name");
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return String();
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::registerCommandForUndo(PassRefPtr<EditCommand> command)
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebUIDelegate* uiDelegate = 0;
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {
5332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        String actionName = undoNameForEditAction(command->editingAction());
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebEditorUndoCommand* undoCommand = new WebEditorUndoCommand(command, true);
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!undoCommand)
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->registerUndoWithTarget(m_undoTarget, 0, undoCommand);
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        undoCommand->Release(); // the undo manager owns the reference
5392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!actionName.isEmpty())
5402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            uiDelegate->setActionTitle(BString(actionName));
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->Release();
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::registerCommandForRedo(PassRefPtr<EditCommand> command)
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebUIDelegate* uiDelegate = 0;
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebEditorUndoCommand* undoCommand = new WebEditorUndoCommand(command, false);
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!undoCommand)
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->registerUndoWithTarget(m_undoTarget, 0, undoCommand);
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        undoCommand->Release(); // the undo manager owns the reference
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->Release();
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::clearUndoRedoOperations()
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebUIDelegate* uiDelegate = 0;
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->removeAllActionsWithTarget(m_undoTarget);
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->Release();
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool WebEditorClient::canCopyCut(bool defaultValue) const
56881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
56981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return defaultValue;
57081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
57181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
57281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool WebEditorClient::canPaste(bool defaultValue) const
57381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
57481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return defaultValue;
57581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
57681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::canUndo() const
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL result = FALSE;
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebUIDelegate* uiDelegate = 0;
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->canUndo(&result);
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->Release();
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!result;
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::canRedo() const
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL result = FALSE;
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebUIDelegate* uiDelegate = 0;
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->canRedo(&result);
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->Release();
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!result;
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::undo()
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebUIDelegate* uiDelegate = 0;
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->undo();
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->Release();
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::redo()
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IWebUIDelegate* uiDelegate = 0;
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) {
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->redo();
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uiDelegate->Release();
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::handleKeyboardEvent(KeyboardEvent* evt)
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_webView->handleEditingKeyboardEvent(evt))
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        evt->setDefaultHandled();
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::handleInputMethodKeydown(KeyboardEvent* )
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::ignoreWordInSpellDocument(const String& word)
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initViewSpecificSpelling(m_webView);
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ed->ignoreWordInSpellDocument(m_webView, BString(word));
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::learnWord(const String& word)
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ed->learnWord(BString(word));
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::checkSpellingOfString(const UChar* text, int length, int* misspellingLocation, int* misspellingLength)
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *misspellingLocation = -1;
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *misspellingLength = 0;
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initViewSpecificSpelling(m_webView);
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ed->checkSpellingOfString(m_webView, text, length, misspellingLocation, misspellingLength);
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString WebEditorClient::getAutoCorrectSuggestionForMisspelledWord(const String& inputWord)
6600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // This method can be implemented using customized algorithms for the particular browser.
6620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Currently, it computes an empty string.
6630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return String();
6640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::checkGrammarOfString(const UChar* text, int length, Vector<GrammarDetail>& details, int* badGrammarLocation, int* badGrammarLength)
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    details.clear();
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *badGrammarLocation = -1;
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *badGrammarLength = 0;
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initViewSpecificSpelling(m_webView);
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IEnumWebGrammarDetails> enumDetailsObj;
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(ed->checkGrammarOfString(m_webView, text, length, &enumDetailsObj, badGrammarLocation, badGrammarLength)))
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (true) {
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ULONG fetched;
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        COMPtr<IWebGrammarDetail> detailObj;
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (enumDetailsObj->Next(1, &detailObj, &fetched) != S_OK)
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        GrammarDetail detail;
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (FAILED(detailObj->length(&detail.length)))
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (FAILED(detailObj->location(&detail.location)))
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BSTR userDesc;
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (FAILED(detailObj->userDescription(&userDesc)))
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        detail.userDescription = String(userDesc, SysStringLen(userDesc));
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SysFreeString(userDesc);
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        COMPtr<IEnumSpellingGuesses> enumGuessesObj;
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (FAILED(detailObj->guesses(&enumGuessesObj)))
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (true) {
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            BSTR guess;
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (enumGuessesObj->Next(1, &guess, &fetched) != S_OK)
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            detail.guesses.append(String(guess, SysStringLen(guess)));
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            SysFreeString(guess);
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        details.append(detail);
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::updateSpellingUIWithGrammarString(const String& string, const WebCore::GrammarDetail& detail)
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<BSTR> guessesBSTRs;
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < detail.guesses.size(); i++) {
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BString guess(detail.guesses[i]);
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        guessesBSTRs.append(guess.release());
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BString userDescriptionBSTR(detail.userDescription);
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ed->updateSpellingUIWithGrammarString(BString(string), detail.location, detail.length, userDescriptionBSTR, guessesBSTRs.data(), (int)guessesBSTRs.size());
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < guessesBSTRs.size(); i++)
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SysFreeString(guessesBSTRs[i]);
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::updateSpellingUIWithMisspelledWord(const String& word)
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ed->updateSpellingUIWithMisspelledWord(BString(word));
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::showSpellingUI(bool show)
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ed->showSpellingUI(show);
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebEditorClient::spellingUIIsShowing()
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL showing;
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(ed->spellingUIIsShowing(&showing)))
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!showing;
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
761f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebEditorClient::getGuessesForWord(const String& word, const String& context, Vector<String>& guesses)
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    guesses.clear();
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IWebEditingDelegate> ed;
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(m_webView->editingDelegate(&ed)) || !ed.get())
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COMPtr<IEnumSpellingGuesses> enumGuessesObj;
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (FAILED(ed->guessesForWord(BString(word), &enumGuessesObj)))
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (true) {
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ULONG fetched;
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BSTR guess;
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (enumGuessesObj->Next(1, &guess, &fetched) != S_OK)
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        guesses.append(String(guess, SysStringLen(guess)));
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SysFreeString(guess);
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
783967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid WebEditorClient::willSetInputMethodState()
784967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
785967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
786967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebEditorClient::setInputMethodState(bool enabled)
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webView->setInputMethodState(enabled);
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
791