18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2007, The Android Open Source Project 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 * * 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 * * 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 THE COPYRIGHT HOLDERS ``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 163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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 */ 253298a7d84b96ade73c6b170671711a8f2792ae59Steve Block 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "WebCore" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Editor.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EditorClientAndroid.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Event.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FocusController.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 35d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch#include "HTMLNames.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KeyboardEvent.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformKeyboardEvent.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 4044206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins#include "WebViewCore.h" 41330bb52cdd4c0c38e2918b3da78420992dc09d55Steve Block#include "WindowsKeyboardCodes.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 43d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdochusing namespace WebCore::HTMLNames; 44d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android { 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::pageDestroyed() { 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete this; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldDeleteRange(Range*) { return true; } 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldShowDeleteInterface(HTMLElement*) { notImplemented(); return false; } 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::smartInsertDeleteEnabled() { notImplemented(); return false; } 54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool EditorClientAndroid::isSelectTrailingWhitespaceEnabled(){ notImplemented(); return false; } 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::isContinuousSpellCheckingEnabled() { notImplemented(); return false; } 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::toggleContinuousSpellChecking() { notImplemented(); } 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::isGrammarCheckingEnabled() { notImplemented(); return false; } 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::toggleGrammarChecking() { notImplemented(); } 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint EditorClientAndroid::spellCheckerDocumentTag() { notImplemented(); return -1; } 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::isEditable() { /* notImplemented(); */ return false; } 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Following Qt's implementation. For shouldBeginEditing and shouldEndEditing. 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Returning true for these fixes issue http://b/issue?id=735185 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldBeginEditing(Range*) 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldEndEditing(Range*) 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldInsertNode(Node*, Range*, EditorInsertAction) { notImplemented(); return true; } 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldInsertText(const String&, Range*, EditorInsertAction) { return true; } 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldApplyStyle(CSSStyleDeclaration*, Range*) { notImplemented(); return true; } 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::didBeginEditing() { notImplemented(); } 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called so that the platform can handle changes to content. It is called 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// after the contents have been edited or unedited (ie undo) 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::respondToChangedContents() { notImplemented(); } 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::didEndEditing() { notImplemented(); } 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::didWriteSelectionToPasteboard() { notImplemented(); } 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::didSetSelectionTypesForPasteboard() { notImplemented(); } 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Copied from the Window's port of WebKit. 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const unsigned AltKey = 1 << 0; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const unsigned ShiftKey = 1 << 1; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct KeyDownEntry { 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned virtualKey; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned modifiers; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char* name; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct KeyPressEntry { 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned charCode; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned modifiers; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char* name; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const KeyDownEntry keyDownEntries[] = { 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_LEFT, 0, "MoveLeft" }, 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_LEFT, ShiftKey, "MoveLeftAndModifySelection" }, 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_LEFT, AltKey, "MoveWordLeft" }, 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_LEFT, AltKey | ShiftKey, "MoveWordLeftAndModifySelection" }, 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_RIGHT, 0, "MoveRight" }, 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_RIGHT, ShiftKey, "MoveRightAndModifySelection" }, 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_RIGHT, AltKey, "MoveWordRight" }, 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_RIGHT, AltKey | ShiftKey, "MoveWordRightAndModifySelection" }, 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_UP, 0, "MoveUp" }, 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_UP, ShiftKey, "MoveUpAndModifySelection" }, 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_DOWN, 0, "MoveDown" }, 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_DOWN, ShiftKey, "MoveDownAndModifySelection" }, 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_BACK, 0, "BackwardDelete" }, 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_BACK, ShiftKey, "ForwardDelete" }, 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_BACK, AltKey, "DeleteWordBackward" }, 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_BACK, AltKey | ShiftKey, "DeleteWordForward" }, 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_ESCAPE, 0, "Cancel" }, 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_TAB, 0, "InsertTab" }, 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_TAB, ShiftKey, "InsertBacktab" }, 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_RETURN, 0, "InsertNewline" }, 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_RETURN, AltKey, "InsertNewline" }, 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { VK_RETURN, AltKey | ShiftKey, "InsertNewline" } 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const KeyPressEntry keyPressEntries[] = { 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { '\t', 0, "InsertTab" }, 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { '\t', ShiftKey, "InsertBackTab" }, 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { '\r', 0, "InsertNewline" }, 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { '\r', AltKey, "InsertNewline" }, 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { '\r', AltKey | ShiftKey, "InsertNewline" } 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char* interpretKeyEvent(const KeyboardEvent* evt) 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const PlatformKeyboardEvent* keyEvent = evt->keyEvent(); 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static HashMap<int, const char*>* keyDownCommandsMap = 0; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static HashMap<int, const char*>* keyPressCommandsMap = 0; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!keyDownCommandsMap) { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keyDownCommandsMap = new HashMap<int, const char*>; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keyPressCommandsMap = new HashMap<int, const char*>; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < sizeof(keyDownEntries)/sizeof(KeyDownEntry); i++) 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keyDownCommandsMap->set(keyDownEntries[i].modifiers << 16 | keyDownEntries[i].virtualKey, keyDownEntries[i].name); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < sizeof(keyPressEntries)/sizeof(KeyPressEntry); i++) 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project keyPressCommandsMap->set(keyPressEntries[i].modifiers << 16 | keyPressEntries[i].charCode, keyPressEntries[i].name); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned modifiers = 0; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keyEvent->shiftKey()) 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers |= ShiftKey; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keyEvent->altKey()) 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers |= AltKey; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (evt->type() == eventNames().keydownEvent) { 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int mapKey = modifiers << 16 | evt->keyCode(); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mapKey ? keyDownCommandsMap->get(mapKey) : 0; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int mapKey = modifiers << 16 | evt->charCode(); 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mapKey ? keyPressCommandsMap->get(mapKey) : 0; 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::handleKeyboardEvent(KeyboardEvent* event) { 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_page); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = m_page->focusController()->focusedOrMainFrame(); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frame) 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const PlatformKeyboardEvent* keyEvent = event->keyEvent(); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // TODO: If the event is not coming from Android Java, e.g. from JavaScript, 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // PlatformKeyboardEvent is null. We should support this later. 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!keyEvent) 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Editor::Command command = frame->editor()->command(interpretKeyEvent(event)); 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keyEvent->type() == PlatformKeyboardEvent::RawKeyDown) { 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!command.isTextInsertion() && command.execute(event)) { 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This function mimics the Windows version. However, calling event->setDefaultHandled() 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // prevents the javascript key events for the delete key from happening. 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Update: Safari doesn't send delete key events to javascript so 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we will mimic that behavior. 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event->setDefaultHandled(); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (command.execute(event)) { 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event->setDefaultHandled(); 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't insert null or control characters as they can result in unexpected behaviour 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (event->charCode() < ' ') 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frame->editor()->insertText(keyEvent->text(), event)) 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event->setDefaultHandled(); 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////////////////// 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// we just don't support Undo/Redo at the moment 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::registerCommandForUndo(PassRefPtr<EditCommand>) {} 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::registerCommandForRedo(PassRefPtr<EditCommand>) {} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::clearUndoRedoOperations() {} 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::canUndo() const { return false; } 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::canRedo() const { return false; } 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::undo() {} 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::redo() {} 220c2a132734701e9acb0c0b0c4b3bf37f505a5b538Ben Murdochbool EditorClientAndroid::canCopyCut(bool defaultValue) const { return defaultValue; } 221c2a132734701e9acb0c0b0c4b3bf37f505a5b538Ben Murdochbool EditorClientAndroid::canPaste(bool defaultValue) const { return defaultValue; } 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge: 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::showSpellingUI(bool) {} 225a2f40ea74a5aafd6112542dde371e8a3916c5e5aBen Murdochvoid EditorClientAndroid::getGuessesForWord(String const&, const String&, WTF::Vector<String>&) {} 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::spellingUIIsShowing() { return false; } 22714f586c9666e68bd7b138911aa63a3081d5b2e49Grace Klobavoid EditorClientAndroid::checkGrammarOfString(unsigned short const*, int, WTF::Vector<GrammarDetail>&, int*, int*) {} 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::checkSpellingOfString(unsigned short const*, int, int*, int*) {} 2295f1ab04193ad0130ca8204aadaceae083aca9881Feng QianString EditorClientAndroid::getAutoCorrectSuggestionForMisspelledWord(const String&) { return String(); } 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::textFieldDidEndEditing(Element*) {} 231a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mountvoid EditorClientAndroid::textDidChangeInTextArea(Element* element) 232a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount{ 233a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount Frame* frame = m_page->focusController()->focusedOrMainFrame(); 234a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount if (!frame || !frame->view()) 235a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount return; 236a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount WebViewCore* webViewCore = WebViewCore::getWebViewCore(frame->view()); 237a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount webViewCore->updateTextSizeAndScroll(element); 238a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount} 239a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mountvoid EditorClientAndroid::textDidChangeInTextField(Element* element) 240a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount{ 241a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount Frame* frame = m_page->focusController()->focusedOrMainFrame(); 242a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount if (!frame || !frame->view()) 243a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount return; 244a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount WebViewCore* webViewCore = WebViewCore::getWebViewCore(frame->view()); 245a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount webViewCore->updateTextSizeAndScroll(element); 246a9cb027a0b6e5a76a39be3702d3c67f3d162a21fGeorge Mount} 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::textFieldDidBeginEditing(Element*) {} 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::ignoreWordInSpellDocument(String const&) {} 24944206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins 25044206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins// We need to pass the selection up to the WebTextView 25144206d7109052a5a98a832db4a9b960cf859dee9Leon Scrogginsvoid EditorClientAndroid::respondToChangedSelection() { 25244206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins if (m_uiGeneratedSelectionChange) 25344206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins return; 25444206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins Frame* frame = m_page->focusController()->focusedOrMainFrame(); 25544206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins if (!frame || !frame->view()) 25644206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins return; 25744206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins WebViewCore* webViewCore = WebViewCore::getWebViewCore(frame->view()); 25844206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins webViewCore->updateTextSelection(); 25944206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins} 26044206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins 26144206d7109052a5a98a832db4a9b960cf859dee9Leon Scrogginsbool EditorClientAndroid::shouldChangeSelectedRange(Range*, Range*, EAffinity, 26244206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins bool) { 26344206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins return m_shouldChangeSelectedRange; 26444206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins} 26544206d7109052a5a98a832db4a9b960cf859dee9Leon Scroggins 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::doTextFieldCommandFromEvent(Element*, KeyboardEvent*) { return false; } 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::textWillBeDeletedInTextField(Element*) {} 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::updateSpellingUIWithGrammarString(String const&, GrammarDetail const&) {} 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::updateSpellingUIWithMisspelledWord(String const&) {} 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::learnWord(String const&) {} 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to the Nov-16-08 tip of tree merge: 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool EditorClientAndroid::shouldMoveRangeAfterDelete(Range*, Range*) { return true; } 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::setInputMethodState(bool) {} 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Feb-19 tip of tree merge: 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid EditorClientAndroid::handleInputMethodKeydown(KeyboardEvent*) {} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 279f7b9e1372a8483ca361a3de2727538704fea8368Ben Murdochvoid EditorClientAndroid::willSetInputMethodState() 280f7b9e1372a8483ca361a3de2727538704fea8368Ben Murdoch{ 281f7b9e1372a8483ca361a3de2727538704fea8368Ben Murdoch notImplemented(); 282f7b9e1372a8483ca361a3de2727538704fea8368Ben Murdoch} 283d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch 284f729537b6d266be0c7b5ceca85a8089a9ee89da5Ben Murdochvoid EditorClientAndroid::requestCheckingOfString(SpellChecker*, int, TextCheckingTypeMask, const String&) {} 285c7daeac4737acbbac7f7cd35ac16ad015d433aaeBen Murdoch 286d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch#if ENABLE(WEB_AUTOFILL) 287a5b05f64bda3dea3ba23e77e9eb2ef59812cdc86Kristian MonsenWebAutofill* EditorClientAndroid::getAutofill() 288d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch{ 289d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch if (!m_autoFill) 290a5b05f64bda3dea3ba23e77e9eb2ef59812cdc86Kristian Monsen m_autoFill.set(new WebAutofill()); 291d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch 292d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch return m_autoFill.get(); 293d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch} 294d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch#endif 295d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 297