WebPageWin.cpp revision 2fc2651226baac27029e38c9d6ef883fa32084db
165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h" 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPage.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "FontSmoothingLevel.h" 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebEvent.h" 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPreferencesStore.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FocusController.h> 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FontRenderingMode.h> 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Frame.h> 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FrameView.h> 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/KeyboardEvent.h> 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Page.h> 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/PlatformKeyboardEvent.h> 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Settings.h> 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(CG) 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebKitSystemInterface/WebKitSystemInterface.h> 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WinUser.h> 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(CFNETWORK) 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <CFNetwork/CFURLCachePriv.h> 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <CFNetwork/CFURLProtocolPriv.h> 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <CFNetwork/CFURLRequestPriv.h> 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore; 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::platformInitialize() 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->settings()->setFontRenderingMode(AlternateRenderingMode); 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::platformPreferencesDidChange(const WebPreferencesStore& store) 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FontSmoothingLevel fontSmoothingLevel = static_cast<FontSmoothingLevel>(store.getUInt32ValueForKey(WebPreferencesKey::fontSmoothingLevelKey())); 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(CG) 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FontSmoothingLevel adjustedLevel = fontSmoothingLevel; 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (adjustedLevel == FontSmoothingLevelWindows) 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch adjustedLevel = FontSmoothingLevelMedium; 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch wkSetFontSmoothingLevel(adjustedLevel); 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->settings()->setFontRenderingMode(fontSmoothingLevel == FontSmoothingLevelWindows ? AlternateRenderingMode : NormalRenderingMode); 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const unsigned CtrlKey = 1 << 0; 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const unsigned AltKey = 1 << 1; 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const unsigned ShiftKey = 1 << 2; 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstruct KeyDownEntry { 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned virtualKey; 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned modifiers; 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const char* name; 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstruct KeyPressEntry { 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned charCode; 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned modifiers; 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const char* name; 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const KeyDownEntry keyDownEntries[] = { 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_LEFT, 0, "MoveLeft" }, 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_LEFT, ShiftKey, "MoveLeftAndModifySelection" }, 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_LEFT, CtrlKey, "MoveWordLeft" }, 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_LEFT, CtrlKey | ShiftKey, "MoveWordLeftAndModifySelection" }, 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RIGHT, 0, "MoveRight" }, 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RIGHT, ShiftKey, "MoveRightAndModifySelection" }, 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RIGHT, CtrlKey, "MoveWordRight" }, 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RIGHT, CtrlKey | ShiftKey, "MoveWordRightAndModifySelection" }, 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_UP, 0, "MoveUp" }, 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_UP, ShiftKey, "MoveUpAndModifySelection" }, 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_PRIOR, ShiftKey, "MovePageUpAndModifySelection" }, 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DOWN, 0, "MoveDown" }, 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DOWN, ShiftKey, "MoveDownAndModifySelection" }, 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_NEXT, ShiftKey, "MovePageDownAndModifySelection" }, 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_PRIOR, 0, "MovePageUp" }, 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_NEXT, 0, "MovePageDown" }, 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_HOME, 0, "MoveToBeginningOfLine" }, 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_HOME, ShiftKey, "MoveToBeginningOfLineAndModifySelection" }, 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_HOME, CtrlKey, "MoveToBeginningOfDocument" }, 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_HOME, CtrlKey | ShiftKey, "MoveToBeginningOfDocumentAndModifySelection" }, 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_END, 0, "MoveToEndOfLine" }, 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_END, ShiftKey, "MoveToEndOfLineAndModifySelection" }, 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_END, CtrlKey, "MoveToEndOfDocument" }, 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_END, CtrlKey | ShiftKey, "MoveToEndOfDocumentAndModifySelection" }, 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_BACK, 0, "DeleteBackward" }, 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_BACK, ShiftKey, "DeleteBackward" }, 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DELETE, 0, "DeleteForward" }, 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_BACK, CtrlKey, "DeleteWordBackward" }, 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DELETE, CtrlKey, "DeleteWordForward" }, 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'B', CtrlKey, "ToggleBold" }, 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'I', CtrlKey, "ToggleItalic" }, 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_ESCAPE, 0, "Cancel" }, 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_OEM_PERIOD, CtrlKey, "Cancel" }, 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_TAB, 0, "InsertTab" }, 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_TAB, ShiftKey, "InsertBacktab" }, 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, 0, "InsertNewline" }, 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, CtrlKey, "InsertNewline" }, 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, AltKey, "InsertNewline" }, 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, ShiftKey, "InsertNewline" }, 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, AltKey | ShiftKey, "InsertNewline" }, 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // It's not quite clear whether clipboard shortcuts and Undo/Redo should be handled 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // in the application or in WebKit. We chose WebKit. 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'C', CtrlKey, "Copy" }, 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'V', CtrlKey, "Paste" }, 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'X', CtrlKey, "Cut" }, 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'A', CtrlKey, "SelectAll" }, 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_INSERT, CtrlKey, "Copy" }, 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DELETE, ShiftKey, "Cut" }, 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_INSERT, ShiftKey, "Paste" }, 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'Z', CtrlKey, "Undo" }, 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'Z', CtrlKey | ShiftKey, "Redo" }, 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const KeyPressEntry keyPressEntries[] = { 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\t', 0, "InsertTab" }, 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\t', ShiftKey, "InsertBacktab" }, 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', 0, "InsertNewline" }, 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', CtrlKey, "InsertNewline" }, 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', AltKey, "InsertNewline" }, 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', ShiftKey, "InsertNewline" }, 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', AltKey | ShiftKey, "InsertNewline" }, 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst char* WebPage::interpretKeyEvent(const KeyboardEvent* evt) 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(evt->type() == eventNames().keydownEvent || evt->type() == eventNames().keypressEvent); 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static HashMap<int, const char*>* keyDownCommandsMap = 0; 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static HashMap<int, const char*>* keyPressCommandsMap = 0; 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!keyDownCommandsMap) { 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch keyDownCommandsMap = new HashMap<int, const char*>; 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch keyPressCommandsMap = new HashMap<int, const char*>; 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < WTF_ARRAY_LENGTH(keyDownEntries); ++i) 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch keyDownCommandsMap->set(keyDownEntries[i].modifiers << 16 | keyDownEntries[i].virtualKey, keyDownEntries[i].name); 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < WTF_ARRAY_LENGTH(keyPressEntries); ++i) 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch keyPressCommandsMap->set(keyPressEntries[i].modifiers << 16 | keyPressEntries[i].charCode, keyPressEntries[i].name); 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned modifiers = 0; 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (evt->shiftKey()) 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch modifiers |= ShiftKey; 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (evt->altKey()) 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch modifiers |= AltKey; 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (evt->ctrlKey()) 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch modifiers |= CtrlKey; 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (evt->type() == eventNames().keydownEvent) { 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch int mapKey = modifiers << 16 | evt->keyCode(); 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return mapKey ? keyDownCommandsMap->get(mapKey) : 0; 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch int mapKey = modifiers << 16 | evt->charCode(); 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return mapKey ? keyPressCommandsMap->get(mapKey) : 0; 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic inline void scroll(Page* page, ScrollDirection direction, ScrollGranularity granularity) 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch page->focusController()->focusedOrMainFrame()->eventHandler()->scrollRecursively(direction, granularity); 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic inline void logicalScroll(Page* page, ScrollLogicalDirection direction, ScrollGranularity granularity) 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch page->focusController()->focusedOrMainFrame()->eventHandler()->logicalScrollRecursively(direction, granularity); 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebPage::performDefaultBehaviorForKeyEvent(const WebKeyboardEvent& keyboardEvent) 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (keyboardEvent.type() != WebEvent::KeyDown && keyboardEvent.type() != WebEvent::RawKeyDown) 20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (keyboardEvent.windowsVirtualKeyCode()) { 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_BACK: 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (keyboardEvent.shiftKey()) 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->goForward(); 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch else 21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->goBack(); 21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_LEFT: 21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch scroll(m_page.get(), ScrollLeft, ScrollByLine); 21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_RIGHT: 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch scroll(m_page.get(), ScrollRight, ScrollByLine); 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_UP: 22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch scroll(m_page.get(), ScrollUp, ScrollByLine); 22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_DOWN: 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch scroll(m_page.get(), ScrollDown, ScrollByLine); 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_HOME: 22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch logicalScroll(m_page.get(), ScrollBlockDirectionBackward, ScrollByDocument); 23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_END: 23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch logicalScroll(m_page.get(), ScrollBlockDirectionForward, ScrollByDocument); 23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_PRIOR: 23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch logicalScroll(m_page.get(), ScrollBlockDirectionBackward, ScrollByPage); 23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_NEXT: 23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch logicalScroll(m_page.get(), ScrollBlockDirectionForward, ScrollByPage); 23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch default: 24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebPage::platformHasLocalDataForURL(const WebCore::KURL& url) 24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(CFNETWORK) 25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFURLRef> cfURL(AdoptCF, url.createCFURL()); 25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFMutableURLRequestRef> request(AdoptCF, CFURLRequestCreateMutable(0, cfURL.get(), kCFURLRequestCachePolicyReloadIgnoringCache, 60, 0)); 25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFStringRef> userAgent(AdoptCF, userAgent().createCFString()); 25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFURLRequestSetHTTPHeaderFieldValue(request.get(), CFSTR("User-Agent"), userAgent.get()); 25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFURLCacheRef> cache(AdoptCF, CFURLCacheCopySharedURLCache()); 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFCachedURLResponseRef> response(AdoptCF, CFURLCacheCopyResponseForRequest(cache.get(), request.get())); 25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return response; 26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else 26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2652fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockString WebPage::cachedResponseMIMETypeForURL(const WebCore::KURL& url) 2662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 2672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if USE(CFNETWORK) 2682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFURLRef> cfURL(AdoptCF, url.createCFURL()); 2692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFMutableURLRequestRef> request(AdoptCF, CFURLRequestCreateMutable(0, cfURL.get(), kCFURLRequestCachePolicyReloadIgnoringCache, 60, 0)); 2702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFStringRef> userAgent(AdoptCF, userAgent().createCFString()); 2722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CFURLRequestSetHTTPHeaderFieldValue(request.get(), CFSTR("User-Agent"), userAgent.get()); 2732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFURLCacheRef> cache(AdoptCF, CFURLCacheCopySharedURLCache()); 2752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFCachedURLResponseRef> cachedResponse(AdoptCF, CFURLCacheCopyResponseForRequest(cache.get(), request.get())); 2772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CFURLResponseRef response = CFCachedURLResponseGetWrappedResponse(cachedResponse.get()); 2792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return response ? CFURLResponseGetMIMEType(response) : String(); 2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#else 2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return String(); 2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 2842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebPage::canHandleRequest(const WebCore::ResourceRequest& request) 28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(CFNETWORK) 28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: Are there other requests we need to be able to handle? WebKit1's WebView.cpp has a FIXME here as well. 29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFURLProtocolCanHandleRequest(request.cfURLRequest()); 29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else 29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::confirmComposition(const String& compositionString) 29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame || !frame->editor()->canEdit()) 30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame->editor()->confirmComposition(compositionString); 30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::setComposition(const String& compositionString, const Vector<WebCore::CompositionUnderline>& underlines, uint64_t cursorPosition) 30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame || !frame->editor()->canEdit()) 30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame->editor()->setComposition(compositionString, underlines, cursorPosition, 0); 31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::firstRectForCharacterInSelectedRange(const uint64_t characterPosition, WebCore::IntRect& resultRect) 31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect rect; 31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (RefPtr<Range> range = frame->editor()->hasComposition() ? frame->editor()->compositionRange() : frame->selection()->selection().toNormalizedRange()) { 31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ExceptionCode ec = 0; 31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Range> tempRange = range->cloneRange(ec); 31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch tempRange->setStart(tempRange->startContainer(ec), tempRange->startOffset(ec) + characterPosition, ec); 32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch rect = frame->editor()->firstRectForRange(tempRange.get()); 32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch resultRect = frame->view()->contentsToWindow(rect); 32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::getSelectedText(String& text) 32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Range> selectedRange = frame->selection()->toNormalizedRange(); 32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch text = selectedRange->text(); 33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 333