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