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" 312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WebPageProxyMessages.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPreferencesStore.h" 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FocusController.h> 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FontRenderingMode.h> 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Frame.h> 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FrameView.h> 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebCore/HitTestRequest.h> 382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebCore/HitTestResult.h> 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/KeyboardEvent.h> 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Page.h> 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/PlatformKeyboardEvent.h> 422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebCore/RenderLayer.h> 432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebCore/RenderView.h> 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <WebCore/ResourceHandle.h> 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Settings.h> 462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG) 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebKitSystemInterface/WebKitSystemInterface.h> 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WinUser.h> 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(CFNETWORK) 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <CFNetwork/CFURLCachePriv.h> 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <CFNetwork/CFURLProtocolPriv.h> 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <CFNetwork/CFURLRequestPriv.h> 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore; 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::platformInitialize() 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->settings()->setFontRenderingMode(AlternateRenderingMode); 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::platformPreferencesDidChange(const WebPreferencesStore& store) 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FontSmoothingLevel fontSmoothingLevel = static_cast<FontSmoothingLevel>(store.getUInt32ValueForKey(WebPreferencesKey::fontSmoothingLevelKey())); 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG) 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FontSmoothingLevel adjustedLevel = fontSmoothingLevel; 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (adjustedLevel == FontSmoothingLevelWindows) 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch adjustedLevel = FontSmoothingLevelMedium; 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch wkSetFontSmoothingLevel(adjustedLevel); 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->settings()->setFontRenderingMode(fontSmoothingLevel == FontSmoothingLevelWindows ? AlternateRenderingMode : NormalRenderingMode); 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const unsigned CtrlKey = 1 << 0; 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const unsigned AltKey = 1 << 1; 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const unsigned ShiftKey = 1 << 2; 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstruct KeyDownEntry { 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned virtualKey; 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned modifiers; 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const char* name; 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstruct KeyPressEntry { 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned charCode; 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned modifiers; 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const char* name; 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const KeyDownEntry keyDownEntries[] = { 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_LEFT, 0, "MoveLeft" }, 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_LEFT, ShiftKey, "MoveLeftAndModifySelection" }, 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_LEFT, CtrlKey, "MoveWordLeft" }, 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_LEFT, CtrlKey | ShiftKey, "MoveWordLeftAndModifySelection" }, 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RIGHT, 0, "MoveRight" }, 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RIGHT, ShiftKey, "MoveRightAndModifySelection" }, 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RIGHT, CtrlKey, "MoveWordRight" }, 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RIGHT, CtrlKey | ShiftKey, "MoveWordRightAndModifySelection" }, 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_UP, 0, "MoveUp" }, 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_UP, ShiftKey, "MoveUpAndModifySelection" }, 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_PRIOR, ShiftKey, "MovePageUpAndModifySelection" }, 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DOWN, 0, "MoveDown" }, 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DOWN, ShiftKey, "MoveDownAndModifySelection" }, 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_NEXT, ShiftKey, "MovePageDownAndModifySelection" }, 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_PRIOR, 0, "MovePageUp" }, 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_NEXT, 0, "MovePageDown" }, 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_HOME, 0, "MoveToBeginningOfLine" }, 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_HOME, ShiftKey, "MoveToBeginningOfLineAndModifySelection" }, 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_HOME, CtrlKey, "MoveToBeginningOfDocument" }, 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_HOME, CtrlKey | ShiftKey, "MoveToBeginningOfDocumentAndModifySelection" }, 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_END, 0, "MoveToEndOfLine" }, 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_END, ShiftKey, "MoveToEndOfLineAndModifySelection" }, 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_END, CtrlKey, "MoveToEndOfDocument" }, 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_END, CtrlKey | ShiftKey, "MoveToEndOfDocumentAndModifySelection" }, 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_BACK, 0, "DeleteBackward" }, 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_BACK, ShiftKey, "DeleteBackward" }, 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DELETE, 0, "DeleteForward" }, 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_BACK, CtrlKey, "DeleteWordBackward" }, 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DELETE, CtrlKey, "DeleteWordForward" }, 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'B', CtrlKey, "ToggleBold" }, 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'I', CtrlKey, "ToggleItalic" }, 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_ESCAPE, 0, "Cancel" }, 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_OEM_PERIOD, CtrlKey, "Cancel" }, 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_TAB, 0, "InsertTab" }, 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_TAB, ShiftKey, "InsertBacktab" }, 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, 0, "InsertNewline" }, 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, CtrlKey, "InsertNewline" }, 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, AltKey, "InsertNewline" }, 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, ShiftKey, "InsertNewline" }, 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_RETURN, AltKey | ShiftKey, "InsertNewline" }, 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // It's not quite clear whether clipboard shortcuts and Undo/Redo should be handled 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // in the application or in WebKit. We chose WebKit. 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'C', CtrlKey, "Copy" }, 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'V', CtrlKey, "Paste" }, 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'X', CtrlKey, "Cut" }, 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'A', CtrlKey, "SelectAll" }, 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_INSERT, CtrlKey, "Copy" }, 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_DELETE, ShiftKey, "Cut" }, 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { VK_INSERT, ShiftKey, "Paste" }, 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'Z', CtrlKey, "Undo" }, 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 'Z', CtrlKey | ShiftKey, "Redo" }, 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const KeyPressEntry keyPressEntries[] = { 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\t', 0, "InsertTab" }, 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\t', ShiftKey, "InsertBacktab" }, 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', 0, "InsertNewline" }, 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', CtrlKey, "InsertNewline" }, 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', AltKey, "InsertNewline" }, 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', ShiftKey, "InsertNewline" }, 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { '\r', AltKey | ShiftKey, "InsertNewline" }, 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst char* WebPage::interpretKeyEvent(const KeyboardEvent* evt) 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(evt->type() == eventNames().keydownEvent || evt->type() == eventNames().keypressEvent); 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static HashMap<int, const char*>* keyDownCommandsMap = 0; 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static HashMap<int, const char*>* keyPressCommandsMap = 0; 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!keyDownCommandsMap) { 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch keyDownCommandsMap = new HashMap<int, const char*>; 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch keyPressCommandsMap = new HashMap<int, const char*>; 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < WTF_ARRAY_LENGTH(keyDownEntries); ++i) 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch keyDownCommandsMap->set(keyDownEntries[i].modifiers << 16 | keyDownEntries[i].virtualKey, keyDownEntries[i].name); 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < WTF_ARRAY_LENGTH(keyPressEntries); ++i) 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch keyPressCommandsMap->set(keyPressEntries[i].modifiers << 16 | keyPressEntries[i].charCode, keyPressEntries[i].name); 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned modifiers = 0; 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (evt->shiftKey()) 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch modifiers |= ShiftKey; 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (evt->altKey()) 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch modifiers |= AltKey; 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (evt->ctrlKey()) 18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch modifiers |= CtrlKey; 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (evt->type() == eventNames().keydownEvent) { 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch int mapKey = modifiers << 16 | evt->keyCode(); 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return mapKey ? keyDownCommandsMap->get(mapKey) : 0; 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch int mapKey = modifiers << 16 | evt->charCode(); 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return mapKey ? keyPressCommandsMap->get(mapKey) : 0; 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebPage::performDefaultBehaviorForKeyEvent(const WebKeyboardEvent& keyboardEvent) 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (keyboardEvent.type() != WebEvent::KeyDown && keyboardEvent.type() != WebEvent::RawKeyDown) 20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (keyboardEvent.windowsVirtualKeyCode()) { 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_BACK: 2072bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2082bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (keyboardEvent.shiftKey()) 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->goForward(); 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch else 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->goBack(); 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_LEFT: 2152bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2162bde8e466a4451c7319e3a072d118917957d6554Steve Block m_page->goBack(); 2172bde8e466a4451c7319e3a072d118917957d6554Steve Block else 2182bde8e466a4451c7319e3a072d118917957d6554Steve Block scroll(m_page.get(), ScrollLeft, ScrollByLine); 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_RIGHT: 2212bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2222bde8e466a4451c7319e3a072d118917957d6554Steve Block m_page->goForward(); 2232bde8e466a4451c7319e3a072d118917957d6554Steve Block else 2242bde8e466a4451c7319e3a072d118917957d6554Steve Block scroll(m_page.get(), ScrollRight, ScrollByLine); 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_UP: 2272bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2282bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch scroll(m_page.get(), ScrollUp, ScrollByLine); 23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_DOWN: 2322bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2332bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch scroll(m_page.get(), ScrollDown, ScrollByLine); 23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_HOME: 2372bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2382bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch logicalScroll(m_page.get(), ScrollBlockDirectionBackward, ScrollByDocument); 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_END: 2422bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2432bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch logicalScroll(m_page.get(), ScrollBlockDirectionForward, ScrollByDocument); 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_PRIOR: 2472bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2482bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch logicalScroll(m_page.get(), ScrollBlockDirectionBackward, ScrollByPage); 25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case VK_NEXT: 2522bde8e466a4451c7319e3a072d118917957d6554Steve Block if (keyboardEvent.isSystemKey()) 2532bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch logicalScroll(m_page.get(), ScrollBlockDirectionForward, ScrollByPage); 25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch default: 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebPage::platformHasLocalDataForURL(const WebCore::KURL& url) 26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(CFNETWORK) 26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFURLRef> cfURL(AdoptCF, url.createCFURL()); 26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFMutableURLRequestRef> request(AdoptCF, CFURLRequestCreateMutable(0, cfURL.get(), kCFURLRequestCachePolicyReloadIgnoringCache, 60, 0)); 26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFStringRef> userAgent(AdoptCF, userAgent().createCFString()); 27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFURLRequestSetHTTPHeaderFieldValue(request.get(), CFSTR("User-Agent"), userAgent.get()); 27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RetainPtr<CFURLCacheRef> cache; 27381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CFURLSTORAGESESSIONS) 27481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (CFURLStorageSessionRef storageSession = ResourceHandle::privateBrowsingStorageSession()) 27581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch cache.adoptCF(wkCopyURLCache(storageSession)); 27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else 27781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 27881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch cache.adoptCF(CFURLCacheCopySharedURLCache()); 27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFCachedURLResponseRef> response(AdoptCF, CFURLCacheCopyResponseForRequest(cache.get(), request.get())); 28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return response; 28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else 28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2872fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockString WebPage::cachedResponseMIMETypeForURL(const WebCore::KURL& url) 2882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 2892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if USE(CFNETWORK) 2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFURLRef> cfURL(AdoptCF, url.createCFURL()); 2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFMutableURLRequestRef> request(AdoptCF, CFURLRequestCreateMutable(0, cfURL.get(), kCFURLRequestCachePolicyReloadIgnoringCache, 60, 0)); 2922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFStringRef> userAgent(AdoptCF, userAgent().createCFString()); 2942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CFURLRequestSetHTTPHeaderFieldValue(request.get(), CFSTR("User-Agent"), userAgent.get()); 2952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 29681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RetainPtr<CFURLCacheRef> cache; 29781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CFURLSTORAGESESSIONS) 29881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (CFURLStorageSessionRef storageSession = ResourceHandle::privateBrowsingStorageSession()) 29981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch cache.adoptCF(wkCopyURLCache(storageSession)); 30081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else 30181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 30281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch cache.adoptCF(CFURLCacheCopySharedURLCache()); 3032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CFCachedURLResponseRef> cachedResponse(AdoptCF, CFURLCacheCopyResponseForRequest(cache.get(), request.get())); 3052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CFURLResponseRef response = CFCachedURLResponseGetWrappedResponse(cachedResponse.get()); 3072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return response ? CFURLResponseGetMIMEType(response) : String(); 3092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#else 3102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return String(); 3112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 3122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 3132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3142bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebPage::platformCanHandleRequest(const WebCore::ResourceRequest& request) 31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(CFNETWORK) 31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFURLProtocolCanHandleRequest(request.cfURLRequest()); 31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else 31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::confirmComposition(const String& compositionString) 32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame || !frame->editor()->canEdit()) 32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame->editor()->confirmComposition(compositionString); 32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::setComposition(const String& compositionString, const Vector<WebCore::CompositionUnderline>& underlines, uint64_t cursorPosition) 33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame || !frame->editor()->canEdit()) 33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame->editor()->setComposition(compositionString, underlines, cursorPosition, 0); 33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::firstRectForCharacterInSelectedRange(const uint64_t characterPosition, WebCore::IntRect& resultRect) 34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect rect; 34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (RefPtr<Range> range = frame->editor()->hasComposition() ? frame->editor()->compositionRange() : frame->selection()->selection().toNormalizedRange()) { 34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ExceptionCode ec = 0; 34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Range> tempRange = range->cloneRange(ec); 34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch tempRange->setStart(tempRange->startContainer(ec), tempRange->startOffset(ec) + characterPosition, ec); 34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch rect = frame->editor()->firstRectForRange(tempRange.get()); 34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch resultRect = frame->view()->contentsToWindow(rect); 35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebPage::getSelectedText(String& text) 35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_page->focusController()->focusedOrMainFrame(); 35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Range> selectedRange = frame->selection()->toNormalizedRange(); 35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch text = selectedRange->text(); 35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebPage::gestureWillBegin(const WebCore::IntPoint& point, bool& canBeginPanning) 3602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_gestureReachedScrollingLimit = false; 3622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool hitScrollbar = false; 3642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch HitTestRequest request(HitTestRequest::ReadOnly); 3662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (Frame* childFrame = m_page->mainFrame(); childFrame; childFrame = EventHandler::subframeForTargetNode(m_gestureTargetNode.get())) { 3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ScrollView* scollView = childFrame->view(); 3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!scollView) 3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch break; 3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch RenderView* renderView = childFrame->document()->renderView(); 3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!renderView) 3732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch break; 3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch RenderLayer* layer = renderView->layer(); 3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!layer) 3772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch break; 3782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch HitTestResult result = scollView->windowToContents(point); 3802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch layer->hitTest(request, result); 3812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_gestureTargetNode = result.innerNode(); 3822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!hitScrollbar) 3842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch hitScrollbar = result.scrollbar(); 3852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (hitScrollbar) { 3882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch canBeginPanning = false; 3892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 3902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!m_gestureTargetNode) { 3932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch canBeginPanning = false; 3942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 3952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (RenderObject* renderer = m_gestureTargetNode->renderer(); renderer; renderer = renderer->parent()) { 3982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (renderer->isBox() && toRenderBox(renderer)->canBeScrolledAndHasScrollableArea()) { 3992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch canBeginPanning = true; 4002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 4012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch canBeginPanning = false; 4052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 4062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool scrollbarAtTopOrBottomOfDocument(Scrollbar* scrollbar) 4082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 4092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT_ARG(scrollbar, scrollbar); 4102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return !scrollbar->currentPos() || scrollbar->currentPos() >= scrollbar->maximum(); 4112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 4122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebPage::gestureDidScroll(const IntSize& size) 4142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 4152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT_ARG(size, !size.isZero()); 4162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!m_gestureTargetNode || !m_gestureTargetNode->renderer() || !m_gestureTargetNode->renderer()->enclosingLayer()) 4182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 4192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Scrollbar* verticalScrollbar = 0; 4212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (Frame* frame = m_page->mainFrame()) { 4222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (ScrollView* view = frame->view()) 4232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch verticalScrollbar = view->verticalScrollbar(); 4242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 4252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_gestureTargetNode->renderer()->enclosingLayer()->scrollByRecursively(size.width(), size.height()); 4272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool gestureReachedScrollingLimit = verticalScrollbar && scrollbarAtTopOrBottomOfDocument(verticalScrollbar); 4282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: We really only want to update this state if the state was updated via scrolling the main frame, 4302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // not scrolling something in a main frame when the main frame had already reached its scrolling limit. 4312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (gestureReachedScrollingLimit == m_gestureReachedScrollingLimit) 4332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 4342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch send(Messages::WebPageProxy::SetGestureReachedScrollingLimit(gestureReachedScrollingLimit)); 4362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_gestureReachedScrollingLimit = gestureReachedScrollingLimit; 4372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 4382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebPage::gestureDidEnd() 4402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 4412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_gestureTargetNode = nullptr; 4422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 4432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 445