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