123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593 |
- /*
- * Copyright (C) 2008 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2012 Sony Computer Entertainment Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include "config.h"
- #include "EditorClientManx.h"
- #include "EditCommand.h"
- #include "Editor.h"
- #include "Frame.h"
- #include "KeyboardEvent.h"
- #include "NotImplemented.h"
- #include "PlatformKeyboardEvent.h"
- #include "Settings.h"
- #include "WebViewPrivate.h"
- #include <manx/KeyboardCodes.h>
- #include <webkit/WebView.h>
- // #define MYTRACE printf("+++ EditorClientManx::%s() +++ :L%d\n", __FUNCTION__, __LINE__);
- #define MYTRACE
- namespace WebCore {
- EditorClientManx::EditorClientManx(WebKit::WebViewPrivate* webView)
- : m_webView(webView)
- {
- }
- EditorClientManx::~EditorClientManx()
- {
- }
- void EditorClientManx::pageDestroyed()
- {
- MYTRACE;
- delete this;
- }
- void EditorClientManx::frameWillDetachPage(Frame*)
- {
- }
- bool EditorClientManx::shouldDeleteRange(Range*)
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::shouldShowDeleteInterface(HTMLElement*)
- {
- MYTRACE;
- notImplemented();
- return false;
- }
- bool EditorClientManx::smartInsertDeleteEnabled()
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::isSelectTrailingWhitespaceEnabled()
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::isContinuousSpellCheckingEnabled()
- {
- MYTRACE;
- notImplemented();
- return false;
- }
- void EditorClientManx::toggleContinuousSpellChecking()
- {
- MYTRACE;
- notImplemented();
- }
- bool EditorClientManx::isGrammarCheckingEnabled()
- {
- MYTRACE;
- notImplemented();
- return false;
- }
- void EditorClientManx::toggleGrammarChecking()
- {
- MYTRACE;
- notImplemented();
- }
- int EditorClientManx::spellCheckerDocumentTag()
- {
- MYTRACE;
- notImplemented();
- return 0;
- }
- bool EditorClientManx::selectWordBeforeMenuEvent()
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::isEditable()
- {
- MYTRACE;
- notImplemented();
- return false;
- }
- bool EditorClientManx::shouldBeginEditing(Range*)
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::shouldEndEditing(Range*)
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::shouldInsertNode(Node*, Range*,
- EditorInsertAction)
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::shouldInsertText(const String& str, Range*,
- EditorInsertAction)
- {
- MYTRACE;
- // printf(" InsertText: {%s}\n", str.utf8().data());
- return true;
- }
- bool EditorClientManx::shouldApplyStyle(StylePropertySet*,
- Range*)
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::shouldMoveRangeAfterDelete(Range*, Range*)
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- bool EditorClientManx::shouldChangeSelectedRange(Range* fromRange, Range* toRange,
- EAffinity, bool stillSelecting)
- {
- MYTRACE;
- notImplemented();
- return true;
- }
- void EditorClientManx::didBeginEditing()
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::didEndEditing()
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::willWriteSelectionToPasteboard(WebCore::Range*)
- {
- }
- void EditorClientManx::getClientPasteboardDataForRange(WebCore::Range*, Vector<String>&, Vector<RefPtr<WebCore::SharedBuffer> >&)
- {
- }
- void EditorClientManx::didWriteSelectionToPasteboard()
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::didSetSelectionTypesForPasteboard()
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::respondToChangedContents()
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::respondToChangedSelection(Frame*)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::registerUndoStep(PassRefPtr<UndoStep>)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::registerRedoStep(PassRefPtr<UndoStep>)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::clearUndoRedoOperations()
- {
- MYTRACE;
- notImplemented();
- }
- bool EditorClientManx::canCopyCut(Frame*, bool defaultValue) const
- {
- MYTRACE;
- notImplemented();
- return defaultValue;
- }
- bool EditorClientManx::canPaste(Frame*, bool defaultValue) const
- {
- MYTRACE;
- notImplemented();
- return defaultValue;
- }
- bool EditorClientManx::canUndo() const
- {
- MYTRACE;
- notImplemented();
- return false;
- }
- bool EditorClientManx::canRedo() const
- {
- MYTRACE;
- notImplemented();
- return false;
- }
- void EditorClientManx::undo()
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::redo()
- {
- MYTRACE;
- notImplemented();
- }
- static const unsigned CtrlKey = 1 << 0;
- static const unsigned AltKey = 1 << 1;
- static const unsigned ShiftKey = 1 << 2;
- struct KeyDownEntry {
- unsigned virtualKey;
- unsigned modifiers;
- const char* name;
- };
- struct KeyPressEntry {
- unsigned charCode;
- unsigned modifiers;
- const char* name;
- };
- static const KeyDownEntry keyDownEntries[] = {
- { Manx::VK_LEFT, 0, "MoveLeft" },
- { Manx::VK_LEFT, ShiftKey, "MoveLeftAndModifySelection" },
- { Manx::VK_LEFT, CtrlKey, "MoveWordLeft" },
- { Manx::VK_LEFT, CtrlKey | ShiftKey, "MoveWordLeftAndModifySelection" },
- { Manx::VK_RIGHT, 0, "MoveRight" },
- { Manx::VK_RIGHT, ShiftKey, "MoveRightAndModifySelection" },
- { Manx::VK_RIGHT, CtrlKey, "MoveWordRight" },
- { Manx::VK_RIGHT, CtrlKey | ShiftKey, "MoveWordRightAndModifySelection" },
- { Manx::VK_UP, 0, "MoveUp" },
- { Manx::VK_UP, ShiftKey, "MoveUpAndModifySelection" },
- { Manx::VK_PRIOR, ShiftKey, "MovePageUpAndModifySelection" },
- { Manx::VK_DOWN, 0, "MoveDown" },
- { Manx::VK_DOWN, ShiftKey, "MoveDownAndModifySelection" },
- { Manx::VK_NEXT, ShiftKey, "MovePageDownAndModifySelection" },
- { Manx::VK_PRIOR, 0, "MovePageUp" },
- { Manx::VK_NEXT, 0, "MovePageDown" },
- { Manx::VK_HOME, 0, "MoveToBeginningOfLine" },
- { Manx::VK_HOME, ShiftKey, "MoveToBeginningOfLineAndModifySelection" },
- { Manx::VK_HOME, CtrlKey, "MoveToBeginningOfDocument" },
- { Manx::VK_HOME, CtrlKey | ShiftKey, "MoveToBeginningOfDocumentAndModifySelection" },
- { Manx::VK_END, 0, "MoveToEndOfLine" },
- { Manx::VK_END, ShiftKey, "MoveToEndOfLineAndModifySelection" },
- { Manx::VK_END, CtrlKey, "MoveToEndOfDocument" },
- { Manx::VK_END, CtrlKey | ShiftKey, "MoveToEndOfDocumentAndModifySelection" },
- { Manx::VK_BACK, 0, "DeleteBackward" },
- { Manx::VK_BACK, ShiftKey, "DeleteBackward" },
- { Manx::VK_DELETE, 0, "DeleteForward" },
- { Manx::VK_BACK, CtrlKey, "DeleteWordBackward" },
- { Manx::VK_DELETE, CtrlKey, "DeleteWordForward" },
- { 'B', CtrlKey, "ToggleBold" },
- { 'I', CtrlKey, "ToggleItalic" },
- { Manx::VK_ESCAPE, 0, "Cancel" },
- { Manx::VK_OEM_PERIOD, CtrlKey, "Cancel" },
- { Manx::VK_TAB, 0, "InsertTab" },
- { Manx::VK_TAB, ShiftKey, "InsertBacktab" },
- { Manx::VK_RETURN, 0, "InsertNewline" },
- { Manx::VK_RETURN, CtrlKey, "InsertNewline" },
- { Manx::VK_RETURN, AltKey, "InsertNewline" },
- { Manx::VK_RETURN, AltKey | ShiftKey, "InsertNewline" },
- { Manx::VKX_PS_CARET_LEFT, 0, "MoveLeft" },
- { Manx::VKX_PS_CARET_LEFT, ShiftKey, "MoveLeftAndModifySelection" },
- { Manx::VKX_PS_CARET_RIGHT, 0, "MoveRight" },
- { Manx::VKX_PS_CARET_RIGHT, ShiftKey, "MoveRightAndModifySelection" },
- { Manx::VKX_PS_CARET_UP, 0, "MoveUp" },
- { Manx::VKX_PS_CARET_UP, ShiftKey, "MoveUpAndModifySelection" },
- { Manx::VKX_PS_CARET_DOWN, 0, "MoveDown" },
- { Manx::VKX_PS_CARET_DOWN, ShiftKey, "MoveDownAndModifySelection" },
- };
- static const KeyPressEntry keyPressEntries[] = {
- { '\t', 0, "InsertTab" },
- { '\t', ShiftKey, "InsertBacktab" },
- { '\r', 0, "InsertNewline" },
- { '\r', CtrlKey, "InsertNewline" },
- { '\r', AltKey, "InsertNewline" },
- { '\r', AltKey | ShiftKey, "InsertNewline" },
- };
- #define NUM_ELEMENTS(array) (sizeof(array) / sizeof(array[0]))
- static const char* interpretEditorCommandKeyEvent(const KeyboardEvent* evt)
- {
- MYTRACE;
- ASSERT(evt->type() == eventNames().keydownEvent || evt->type() == eventNames().keypressEvent);
- static HashMap<int, const char*>* keyDownCommandsMap = 0;
- static HashMap<int, const char*>* keyPressCommandsMap = 0;
- if (!keyDownCommandsMap) {
- keyDownCommandsMap = new HashMap<int, const char*>;
- keyPressCommandsMap = new HashMap<int, const char*>;
- for (unsigned i = 0; i < NUM_ELEMENTS(keyDownEntries); i++)
- keyDownCommandsMap->set(keyDownEntries[i].modifiers << 16 | keyDownEntries[i].virtualKey, keyDownEntries[i].name);
- for (unsigned i = 0; i < NUM_ELEMENTS(keyPressEntries); i++)
- keyPressCommandsMap->set(keyPressEntries[i].modifiers << 16 | keyPressEntries[i].charCode, keyPressEntries[i].name);
- }
- unsigned modifiers = 0;
- if (evt->shiftKey())
- modifiers |= ShiftKey;
- if (evt->altKey())
- modifiers |= AltKey;
- if (evt->ctrlKey())
- modifiers |= CtrlKey;
- if (evt->type() == eventNames().keydownEvent) {
- int mapKey = modifiers << 16 | evt->keyCode();
- return mapKey ? keyDownCommandsMap->get(mapKey) : 0;
- }
- int mapKey = modifiers << 16 | evt->charCode();
- return mapKey ? keyPressCommandsMap->get(mapKey) : 0;
- }
- void EditorClientManx::handleKeyboardEvent(KeyboardEvent* event)
- {
- MYTRACE;
- Node* node = event->target()->toNode();
- ASSERT(node);
- Frame* frame = node->document()->frame();
- ASSERT(frame);
- const PlatformKeyboardEvent* platformEvent = event->keyEvent();
- if (!platformEvent)
- return;
- // Don't allow editor commands or text insertion for nodes that
- // cannot edit, unless we are in caret mode.
- if (!frame->editor().canEdit() && !(frame->settings() && frame->settings()->caretBrowsingEnabled()))
- return;
- const char* editorCommandString = interpretEditorCommandKeyEvent(event);
- if (editorCommandString) {
- Editor::Command command = frame->editor().command(editorCommandString);
- // On editor commands from key down events, we only want to let the event bubble up to
- // the DOM if it inserts text. If it doesn't insert text (e.g. Tab that changes focus)
- // we just want WebKit to handle it immediately without a DOM event.
- if (platformEvent->type() == PlatformKeyboardEvent::RawKeyDown) {
- if (!command.isTextInsertion() && command.execute(event))
- event->setDefaultHandled();
- return;
- }
- if (command.execute(event)) {
- event->setDefaultHandled();
- return;
- }
- }
- // This is just a normal text insertion, so wait to execute the insertion
- // until a keypress event happens. This will ensure that the insertion will not
- // be reflected in the contents of the field until the keyup DOM event.
- if (event->type() == eventNames().keypressEvent) {
- // Don't insert null or control characters as they can result in unexpected behaviour
- if (event->charCode() < ' ')
- return;
- // Don't insert anything if a modifier is pressed
- if (platformEvent->ctrlKey() || platformEvent->altKey())
- return;
- if (frame->editor().insertText(platformEvent->text(), event))
- event->setDefaultHandled();
- }
- }
- void EditorClientManx::handleInputMethodKeydown(KeyboardEvent* event)
- {
- MYTRACE;
- // NOTE: we don't currently need to handle this. When key events occur,
- // both this method and handleKeyboardEvent get a chance at handling them.
- // We might use this method later on for IME-specific handling.
- }
- void EditorClientManx::textFieldDidBeginEditing(Element*)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::textFieldDidEndEditing(Element*)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::textDidChangeInTextField(Element*)
- {
- MYTRACE;
- notImplemented();
- }
- bool EditorClientManx::doTextFieldCommandFromEvent(Element*, KeyboardEvent*)
- {
- MYTRACE;
- return false;
- }
- void EditorClientManx::textWillBeDeletedInTextField(Element*)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::textDidChangeInTextArea(Element*)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::ignoreWordInSpellDocument(const String&)
- {
- MYTRACE;
- notImplemented();
- }
- bool EditorClientManx::shouldEraseMarkersAfterChangeSelection(TextCheckingType) const
- {
- return true;
- }
- void EditorClientManx::learnWord(const String&)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::checkSpellingOfString(const UChar*, int length, int* misspellingLocation, int* misspellingLength)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::checkGrammarOfString(const UChar*, int length, Vector<GrammarDetail>&, int* badGrammarLocation, int* badGrammarLength)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::updateSpellingUIWithGrammarString(const String&, const GrammarDetail& detail)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::updateSpellingUIWithMisspelledWord(const String&)
- {
- MYTRACE;
- notImplemented();
- }
- void EditorClientManx::showSpellingUI(bool show)
- {
- MYTRACE;
- notImplemented();
- }
- bool EditorClientManx::spellingUIIsShowing()
- {
- MYTRACE;
- notImplemented();
- return false;
- }
- void EditorClientManx::getGuessesForWord(const String&, const String&, Vector<String>&)
- {
- MYTRACE;
- notImplemented();
- }
- String EditorClientManx::getAutoCorrectSuggestionForMisspelledWord(const WTF::String&)
- {
- MYTRACE;
- notImplemented();
- return String();
- }
- void EditorClientManx::willSetInputMethodState()
- {
- MYTRACE;
- m_webView->confirmComposition();
- }
- void EditorClientManx::setInputMethodState(bool enabled)
- {
- m_webView->client().setInputMethodState(enabled);
- }
- void EditorClientManx::requestCheckingOfString(PassRefPtr<TextCheckingRequest>)
- {
- }
- }
|