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 "WebView.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ChunkedUpdateDrawingAreaProxy.h"
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "DrawingAreaProxyImpl.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "FindIndicator.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Logging.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NativeWebKeyboardEvent.h"
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "NativeWebMouseEvent.h"
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Region.h"
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "RunLoop.h"
372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "WKAPICast.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContext.h"
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContextMenuProxyWin.h"
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebEditCommandProxy.h"
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebEventFactory.h"
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageProxy.h"
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPopupMenuProxyWin.h"
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <Commctrl.h>
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <WebCore/BitmapInfo.h>
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Cursor.h>
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FloatRect.h>
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG)
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <WebCore/GraphicsContextCG.h>
502bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/IntRect.h>
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/SoftLinking.h>
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/WebCoreInstanceHandle.h>
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/WindowMessageBroadcaster.h>
552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebCore/WindowsTouch.h>
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h>
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace Ime {
592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// We need these functions in a separate namespace, because in the global namespace they conflict
602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// with the definitions in imm.h only by the type modifier (the macro defines them as static) and
612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// imm.h is included by windows.h
622fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK_LIBRARY(IMM32)
632fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmGetContext, HIMC, WINAPI, (HWND hwnd), (hwnd))
642fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmReleaseContext, BOOL, WINAPI, (HWND hWnd, HIMC hIMC), (hWnd, hIMC))
652fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmGetCompositionStringW, LONG, WINAPI, (HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen), (hIMC, dwIndex, lpBuf, dwBufLen))
662fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmSetCandidateWindow, BOOL, WINAPI, (HIMC hIMC, LPCANDIDATEFORM lpCandidate), (hIMC, lpCandidate))
672fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmSetOpenStatus, BOOL, WINAPI, (HIMC hIMC, BOOL fOpen), (hIMC, fOpen))
682fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmNotifyIME, BOOL, WINAPI, (HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue), (hIMC, dwAction, dwIndex, dwValue))
692fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmAssociateContextEx, BOOL, WINAPI, (HWND hWnd, HIMC hIMC, DWORD dwFlags), (hWnd, hIMC, dwFlags))
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// Soft link functions for gestures and panning.
732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSOFT_LINK_LIBRARY(USER32);
742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSOFT_LINK_OPTIONAL(USER32, GetGestureInfo, BOOL, WINAPI, (HGESTUREINFO, PGESTUREINFO));
752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSOFT_LINK_OPTIONAL(USER32, SetGestureConfig, BOOL, WINAPI, (HWND, DWORD, UINT, PGESTURECONFIG, UINT));
762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSOFT_LINK_OPTIONAL(USER32, CloseGestureInfoHandle, BOOL, WINAPI, (HGESTUREINFO));
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSOFT_LINK_LIBRARY(Uxtheme);
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSOFT_LINK_OPTIONAL(Uxtheme, BeginPanningFeedback, BOOL, WINAPI, (HWND));
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSOFT_LINK_OPTIONAL(Uxtheme, EndPanningFeedback, BOOL, WINAPI, (HWND, BOOL));
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSOFT_LINK_OPTIONAL(Uxtheme, UpdatePanningFeedback, BOOL, WINAPI, (HWND, LONG, LONG, BOOL));
822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const LPCWSTR kWebKit2WebViewWindowClassName = L"WebKit2WebViewWindowClass";
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Constants not available on all platforms.
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst int WM_XP_THEMECHANGED = 0x031A;
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst int WM_VISTA_MOUSEHWHEEL = 0x020E;
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const int kMaxToolTipWidth = 250;
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochenum {
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UpdateActiveStateTimer = 1,
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic bool useNewDrawingArea()
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Remove this function and the old drawing area code once we aren't interested in
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // testing the old drawing area anymore.
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT CALLBACK WebView::WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LONG_PTR longPtr = ::GetWindowLongPtr(hWnd, 0);
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (WebView* webView = reinterpret_cast<WebView*>(longPtr))
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return webView->wndProc(hWnd, message, wParam, lParam);
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (message == WM_CREATE) {
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        LPCREATESTRUCT createStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Associate the WebView with the window.
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::SetWindowLongPtr(hWnd, 0, (LONG_PTR)createStruct->lpCreateParams);
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ::DefWindowProc(hWnd, message, wParam, lParam);
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LRESULT lResult = 0;
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = true;
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (message) {
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_CLOSE:
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->tryClose();
1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_DESTROY:
1342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_isBeingDestroyed = true;
1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        close();
1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_ERASEBKGND:
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = 1;
1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_PAINT:
1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onPaintEvent(hWnd, message, wParam, lParam, handled);
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_PRINTCLIENT:
1442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onPrintClientEvent(hWnd, message, wParam, lParam, handled);
1452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSEACTIVATE:
1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        setWasActivatedByMouseEvent(true);
1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = false;
1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSEMOVE:
1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONDOWN:
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONDOWN:
1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONDOWN:
1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONDBLCLK:
1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONDBLCLK:
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONDBLCLK:
1572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONUP:
1582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONUP:
1592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONUP:
1602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSELEAVE:
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onMouseEvent(hWnd, message, wParam, lParam, handled);
1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSEWHEEL:
1642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_VISTA_MOUSEHWHEEL:
1652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onWheelEvent(hWnd, message, wParam, lParam, handled);
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1672bde8e466a4451c7319e3a072d118917957d6554Steve Block    case WM_HSCROLL:
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block        lResult = onHorizontalScroll(hWnd, message, wParam, lParam, handled);
1692bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
1702bde8e466a4451c7319e3a072d118917957d6554Steve Block    case WM_VSCROLL:
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block        lResult = onVerticalScroll(hWnd, message, wParam, lParam, handled);
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case WM_GESTURENOTIFY:
1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        lResult = onGestureNotify(hWnd, message, wParam, lParam, handled);
1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        break;
1762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case WM_GESTURE:
1772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        lResult = onGesture(hWnd, message, wParam, lParam, handled);
1782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        break;
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SYSKEYDOWN:
1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_KEYDOWN:
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SYSCHAR:
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_CHAR:
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SYSKEYUP:
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_KEYUP:
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onKeyEvent(hWnd, message, wParam, lParam, handled);
1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SIZE:
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onSizeEvent(hWnd, message, wParam, lParam, handled);
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_WINDOWPOSCHANGED:
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onWindowPositionChangedEvent(hWnd, message, wParam, lParam, handled);
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SETFOCUS:
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onSetFocusEvent(hWnd, message, wParam, lParam, handled);
1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_KILLFOCUS:
1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onKillFocusEvent(hWnd, message, wParam, lParam, handled);
1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_TIMER:
2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onTimerEvent(hWnd, message, wParam, lParam, handled);
2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SHOWWINDOW:
2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onShowWindowEvent(hWnd, message, wParam, lParam, handled);
2042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SETCURSOR:
2062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onSetCursor(hWnd, message, wParam, lParam, handled);
2072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_STARTCOMPOSITION:
2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMEStartComposition();
2102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_REQUEST:
2122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onIMERequest(wParam, lParam);
2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_COMPOSITION:
2152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMEComposition(lParam);
2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_ENDCOMPOSITION:
2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMEEndComposition();
2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_SELECT:
2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMESelect(wParam, lParam);
2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_SETCONTEXT:
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMESetContext(wParam, lParam);
2252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    default:
2272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = false;
2282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!handled)
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        lResult = ::DefWindowProc(hWnd, message, wParam, lParam);
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return lResult;
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::registerWebViewWindowClass()
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool haveRegisteredWindowClass = false;
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (haveRegisteredWindowClass)
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    haveRegisteredWindowClass = true;
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WNDCLASSEX wcex;
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbSize = sizeof(WNDCLASSEX);
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.style          = CS_DBLCLKS;
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpfnWndProc    = WebView::WebViewWndProc;
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbClsExtra     = 0;
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbWndExtra     = sizeof(WebView*);
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hInstance      = instanceHandle();
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hIcon          = 0;
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hCursor        = ::LoadCursor(0, IDC_ARROW);
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hbrBackground  = 0;
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpszMenuName   = 0;
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpszClassName  = kWebKit2WebViewWindowClassName;
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hIconSm        = 0;
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return !!::RegisterClassEx(&wcex);
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebView::WebView(RECT rect, WebContext* context, WebPageGroup* pageGroup, HWND parentWindow)
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_topLevelParentWindow(0)
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_toolTipWindow(0)
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_lastCursorSet(0)
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_webCoreCursor(0)
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_overrideCursor(0)
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_trackingMouseLeave(false)
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_isInWindow(false)
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_isVisible(false)
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_wasActivatedByMouseEvent(false)
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_isBeingDestroyed(false)
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_inIMEComposition(0)
2742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_findIndicatorCallback(0)
2752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_findIndicatorCallbackContext(0)
2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_lastPanX(0)
2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_lastPanY(0)
2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_overPanY(0)
2792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_gestureReachedScrollingLimit(false)
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    registerWebViewWindowClass();
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_window = ::CreateWindowExW(0, kWebKit2WebViewWindowClassName, 0, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE,
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        rect.top, rect.left, rect.right - rect.left, rect.bottom - rect.top, parentWindow ? parentWindow : HWND_MESSAGE, 0, instanceHandle(), this);
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(::IsWindow(m_window));
2862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // We only check our window style, and not ::IsWindowVisible, because m_isVisible only tracks
2872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // this window's visibility status, while ::IsWindowVisible takes our ancestors' visibility
2882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // status into account. <http://webkit.org/b/54104>
2892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_isVisible == static_cast<bool>(::GetWindowLong(m_window, GWL_STYLE) & WS_VISIBLE));
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_page = context->createWebPage(this, pageGroup);
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->initializeWebPage();
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CoCreateInstance(CLSID_DragDropHelper, 0, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, (void**)&m_dropTargetHelper);
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Initializing the tooltip window here matches WebKit win, but seems like something
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // we could do on demand to save resources.
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    initializeToolTipWindow();
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Initialize the top level parent window and register it with the WindowMessageBroadcaster.
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    windowAncestryDidChange();
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebView::~WebView()
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Tooltip window needs to be explicitly destroyed since it isn't a WS_CHILD.
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (::IsWindow(m_toolTipWindow))
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::DestroyWindow(m_toolTipWindow);
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3112fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::initialize()
3122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::RegisterDragDrop(m_window, this);
3142bde8e466a4451c7319e3a072d118917957d6554Steve Block
3152bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (shouldInitializeTrackPointHack()) {
3162bde8e466a4451c7319e3a072d118917957d6554Steve Block        // If we detected a registry key belonging to a TrackPoint driver, then create fake
3172bde8e466a4451c7319e3a072d118917957d6554Steve Block        // scrollbars, so the WebView will receive WM_VSCROLL and WM_HSCROLL messages.
3182bde8e466a4451c7319e3a072d118917957d6554Steve Block        // We create an invisible vertical scrollbar and an invisible horizontal scrollbar to allow
3192bde8e466a4451c7319e3a072d118917957d6554Steve Block        // for receiving both types of messages.
3202bde8e466a4451c7319e3a072d118917957d6554Steve Block        ::CreateWindow(TEXT("SCROLLBAR"), TEXT("FAKETRACKPOINTHSCROLLBAR"), WS_CHILD | WS_VISIBLE | SBS_HORZ, 0, 0, 0, 0, m_window, 0, instanceHandle(), 0);
3212bde8e466a4451c7319e3a072d118917957d6554Steve Block        ::CreateWindow(TEXT("SCROLLBAR"), TEXT("FAKETRACKPOINTVSCROLLBAR"), WS_CHILD | WS_VISIBLE | SBS_VERT, 0, 0, 0, 0, m_window, 0, instanceHandle(), 0);
3222bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
3232bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3242bde8e466a4451c7319e3a072d118917957d6554Steve Block
3252bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebView::initializeUndoClient(const WKViewUndoClient* client)
3262bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3272bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_undoClient.initialize(client);
3282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setParentWindow(HWND parentWindow)
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_window) {
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // If the host window hasn't changed, bail.
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (::GetParent(m_window) == parentWindow)
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (parentWindow)
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ::SetParent(m_window, parentWindow);
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (!m_isBeingDestroyed) {
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Turn the WebView into a message-only window so it will no longer be a child of the
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // old parent window and will be hidden from screen. We only do this when
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // isBeingDestroyed() is false because doing this while handling WM_DESTROY can leave
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // m_window in a weird state (see <http://webkit.org/b/29337>).
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ::SetParent(m_window, HWND_MESSAGE);
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    windowAncestryDidChange();
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic HWND findTopLevelParentWindow(HWND window)
35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!window)
35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HWND current = window;
35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (HWND parent = GetParent(current); current; current = parent, parent = GetParent(parent)) {
35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!parent || !(GetWindowLongPtr(current, GWL_STYLE) & (WS_POPUP | WS_CHILD)))
35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return current;
35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::windowAncestryDidChange()
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HWND newTopLevelParentWindow;
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_window)
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        newTopLevelParentWindow = findTopLevelParentWindow(m_window);
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    else {
37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // There's no point in tracking active state changes of our parent window if we don't have
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // a window ourselves.
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        newTopLevelParentWindow = 0;
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (newTopLevelParentWindow == m_topLevelParentWindow)
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_topLevelParentWindow)
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        WindowMessageBroadcaster::removeListener(m_topLevelParentWindow, this);
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_topLevelParentWindow = newTopLevelParentWindow;
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_topLevelParentWindow)
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        WindowMessageBroadcaster::addListener(m_topLevelParentWindow, this);
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateActiveState();
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onMouseEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
3912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NativeWebMouseEvent mouseEvent = NativeWebMouseEvent(hWnd, message, wParam, lParam, m_wasActivatedByMouseEvent);
39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setWasActivatedByMouseEvent(false);
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (message) {
3952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONDOWN:
3962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONDOWN:
3972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONDOWN:
3982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::SetFocus(m_window);
3992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::SetCapture(m_window);
4002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
4012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONUP:
4022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONUP:
4032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONUP:
4042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::ReleaseCapture();
4052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
4062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSEMOVE:
4072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        startTrackingMouseLeave();
4082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
4092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSELEAVE:
4102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        stopTrackingMouseLeave();
4112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
4122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONDBLCLK:
4132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONDBLCLK:
4142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONDBLCLK:
4152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
4162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    default:
4172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT_NOT_REACHED();
41865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
41965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->handleMouseEvent(mouseEvent);
42165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
42365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
42565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onWheelEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebWheelEvent wheelEvent = WebEventFactory::createWebWheelEvent(hWnd, message, wParam, lParam);
42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (wheelEvent.controlKey()) {
43065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // We do not want WebKit to handle Control + Wheel, this should be handled by the client application
43165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // to zoom the page.
43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = false;
43365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
43565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->handleWheelEvent(wheelEvent);
43765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
44065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4422bde8e466a4451c7319e3a072d118917957d6554Steve BlockLRESULT WebView::onHorizontalScroll(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
4432bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4442bde8e466a4451c7319e3a072d118917957d6554Steve Block    ScrollDirection direction;
4452bde8e466a4451c7319e3a072d118917957d6554Steve Block    ScrollGranularity granularity;
4462bde8e466a4451c7319e3a072d118917957d6554Steve Block    switch (LOWORD(wParam)) {
4472bde8e466a4451c7319e3a072d118917957d6554Steve Block    case SB_LINELEFT:
4482bde8e466a4451c7319e3a072d118917957d6554Steve Block        granularity = ScrollByLine;
4492bde8e466a4451c7319e3a072d118917957d6554Steve Block        direction = ScrollLeft;
4502bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
4512bde8e466a4451c7319e3a072d118917957d6554Steve Block    case SB_LINERIGHT:
4522bde8e466a4451c7319e3a072d118917957d6554Steve Block        granularity = ScrollByLine;
4532bde8e466a4451c7319e3a072d118917957d6554Steve Block        direction = ScrollRight;
4542bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
4552bde8e466a4451c7319e3a072d118917957d6554Steve Block    case SB_PAGELEFT:
4562bde8e466a4451c7319e3a072d118917957d6554Steve Block        granularity = ScrollByDocument;
4572bde8e466a4451c7319e3a072d118917957d6554Steve Block        direction = ScrollLeft;
4582bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
4592bde8e466a4451c7319e3a072d118917957d6554Steve Block    case SB_PAGERIGHT:
4602bde8e466a4451c7319e3a072d118917957d6554Steve Block        granularity = ScrollByDocument;
4612bde8e466a4451c7319e3a072d118917957d6554Steve Block        direction = ScrollRight;
4622bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
4632bde8e466a4451c7319e3a072d118917957d6554Steve Block    default:
4642bde8e466a4451c7319e3a072d118917957d6554Steve Block        handled = false;
4652bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
4662bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
4672bde8e466a4451c7319e3a072d118917957d6554Steve Block
4682bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_page->scrollBy(direction, granularity);
4692bde8e466a4451c7319e3a072d118917957d6554Steve Block
4702bde8e466a4451c7319e3a072d118917957d6554Steve Block    handled = true;
4712bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
4722bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4732bde8e466a4451c7319e3a072d118917957d6554Steve Block
4742bde8e466a4451c7319e3a072d118917957d6554Steve BlockLRESULT WebView::onVerticalScroll(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
4752bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4762bde8e466a4451c7319e3a072d118917957d6554Steve Block    ScrollDirection direction;
4772bde8e466a4451c7319e3a072d118917957d6554Steve Block    ScrollGranularity granularity;
4782bde8e466a4451c7319e3a072d118917957d6554Steve Block    switch (LOWORD(wParam)) {
4792bde8e466a4451c7319e3a072d118917957d6554Steve Block    case SB_LINEDOWN:
4802bde8e466a4451c7319e3a072d118917957d6554Steve Block        granularity = ScrollByLine;
4812bde8e466a4451c7319e3a072d118917957d6554Steve Block        direction = ScrollDown;
4822bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
4832bde8e466a4451c7319e3a072d118917957d6554Steve Block    case SB_LINEUP:
4842bde8e466a4451c7319e3a072d118917957d6554Steve Block        granularity = ScrollByLine;
4852bde8e466a4451c7319e3a072d118917957d6554Steve Block        direction = ScrollUp;
4862bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
4872bde8e466a4451c7319e3a072d118917957d6554Steve Block    case SB_PAGEDOWN:
4882bde8e466a4451c7319e3a072d118917957d6554Steve Block        granularity = ScrollByDocument;
4892bde8e466a4451c7319e3a072d118917957d6554Steve Block        direction = ScrollDown;
4902bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
4912bde8e466a4451c7319e3a072d118917957d6554Steve Block    case SB_PAGEUP:
4922bde8e466a4451c7319e3a072d118917957d6554Steve Block        granularity = ScrollByDocument;
4932bde8e466a4451c7319e3a072d118917957d6554Steve Block        direction = ScrollUp;
4942bde8e466a4451c7319e3a072d118917957d6554Steve Block        break;
4952bde8e466a4451c7319e3a072d118917957d6554Steve Block    default:
4962bde8e466a4451c7319e3a072d118917957d6554Steve Block        handled = false;
4972bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
4982bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
4992bde8e466a4451c7319e3a072d118917957d6554Steve Block
5002bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_page->scrollBy(direction, granularity);
5012bde8e466a4451c7319e3a072d118917957d6554Steve Block
5022bde8e466a4451c7319e3a072d118917957d6554Steve Block    handled = true;
5032bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
5042bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5052bde8e466a4451c7319e3a072d118917957d6554Steve Block
5062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochLRESULT WebView::onGestureNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
5072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
5082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // We shouldn't be getting any gesture messages without SetGestureConfig soft-linking correctly.
5092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(SetGestureConfigPtr());
5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GESTURENOTIFYSTRUCT* gn = reinterpret_cast<GESTURENOTIFYSTRUCT*>(lParam);
5122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    POINT localPoint = { gn->ptsLocation.x, gn->ptsLocation.y };
5142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ::ScreenToClient(m_window, &localPoint);
5152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool canPan = m_page->gestureWillBegin(localPoint);
5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DWORD dwPanWant = GC_PAN | GC_PAN_WITH_INERTIA | GC_PAN_WITH_GUTTER;
5192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DWORD dwPanBlock = GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY;
5202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (canPan)
5212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        dwPanWant |= GC_PAN_WITH_SINGLE_FINGER_VERTICALLY;
5222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        dwPanBlock |= GC_PAN_WITH_SINGLE_FINGER_VERTICALLY;
5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GESTURECONFIG gc = { GID_PAN, dwPanWant, dwPanBlock };
5262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return SetGestureConfigPtr()(m_window, 0, 1, &gc, sizeof(gc));
5272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
5282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochLRESULT WebView::onGesture(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
5302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
5312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(GetGestureInfoPtr());
5322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(CloseGestureInfoHandlePtr());
5332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(UpdatePanningFeedbackPtr());
5342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(BeginPanningFeedbackPtr());
5352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(EndPanningFeedbackPtr());
5362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!GetGestureInfoPtr() || !CloseGestureInfoHandlePtr() || !UpdatePanningFeedbackPtr() || !BeginPanningFeedbackPtr() || !EndPanningFeedbackPtr()) {
5382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        handled = false;
5392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0;
5402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HGESTUREINFO gestureHandle = reinterpret_cast<HGESTUREINFO>(lParam);
5432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GESTUREINFO gi = {0};
5442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    gi.cbSize = sizeof(GESTUREINFO);
5452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!GetGestureInfoPtr()(gestureHandle, &gi)) {
5472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        handled = false;
5482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0;
5492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    switch (gi.dwID) {
5522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case GID_BEGIN:
5532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_lastPanX = gi.ptsLocation.x;
5542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_lastPanY = gi.ptsLocation.y;
5552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        break;
5562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case GID_END:
5572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_page->gestureDidEnd();
5582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        break;
5592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case GID_PAN: {
5602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int currentX = gi.ptsLocation.x;
5612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int currentY = gi.ptsLocation.y;
5622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Reverse the calculations because moving your fingers up should move the screen down, and
5642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // vice-versa.
5652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int deltaX = m_lastPanX - currentX;
5662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        int deltaY = m_lastPanY - currentY;
5672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_lastPanX = currentX;
5692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_lastPanY = currentY;
5702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Calculate the overpan for window bounce.
5722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_overPanY -= deltaY;
5732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (deltaX || deltaY)
5752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_page->gestureDidScroll(IntSize(deltaX, deltaY));
5762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (gi.dwFlags & GF_BEGIN) {
5782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            BeginPanningFeedbackPtr()(m_window);
5792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_gestureReachedScrollingLimit = false;
5802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_overPanY = 0;
5812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        } else if (gi.dwFlags & GF_END) {
5822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            EndPanningFeedbackPtr()(m_window, true);
5832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_overPanY = 0;
5842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
5852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // FIXME: Support horizontal window bounce - <http://webkit.org/b/58068>.
5872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // FIXME: Window Bounce doesn't undo until user releases their finger - <http://webkit.org/b/58069>.
5882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_gestureReachedScrollingLimit)
5902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            UpdatePanningFeedbackPtr()(m_window, 0, m_overPanY, gi.dwFlags & GF_INERTIA);
5912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        CloseGestureInfoHandlePtr()(gestureHandle);
5932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        handled = true;
5952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0;
5962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    default:
5982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        break;
5992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // If we get to this point, the gesture has not been handled. We forward
6022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // the call to DefWindowProc by returning false, and we don't need to
6032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // to call CloseGestureInfoHandle.
6042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // http://msdn.microsoft.com/en-us/library/dd353228(VS.85).aspx
6052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    handled = false;
6062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return 0;
6072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
6082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
60965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onKeyEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
61065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
61165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->handleKeyboardEvent(NativeWebKeyboardEvent(hWnd, message, wParam, lParam));
61265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We claim here to always have handled the event. If the event is not in fact handled, we will
61465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // find out later in didNotHandleKeyEvent.
61565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
61665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
61765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
61865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6192fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void drawPageBackground(HDC dc, const RECT& rect)
6202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Mac checks WebPageProxy::drawsBackground and
6222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // WebPageProxy::drawsTransparentBackground here, but those are always false on
6232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Windows currently (see <http://webkit.org/b/52009>).
6242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::FillRect(dc, &rect, reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1));
6252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6272fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::paint(HDC hdc, const IntRect& dirtyRect)
6282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
62981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_page->endPrinting();
6302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (useNewDrawingArea()) {
6312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(m_page->drawingArea())) {
6322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            // FIXME: We should port WebKit1's rect coalescing logic here.
6332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            Region unpaintedRegion;
6342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            drawingArea->paint(hdc, dirtyRect, unpaintedRegion);
6352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            Vector<IntRect> unpaintedRects = unpaintedRegion.rects();
6372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            for (size_t i = 0; i < unpaintedRects.size(); ++i) {
6382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                RECT winRect = unpaintedRects[i];
6392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                drawPageBackground(hdc, unpaintedRects[i]);
6402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
6412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        } else
6422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            drawPageBackground(hdc, dirtyRect);
6432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->didDraw();
6452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else {
6462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_page->isValid() && m_page->drawingArea() && m_page->drawingArea()->paint(dirtyRect, hdc))
6472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_page->didDraw();
6482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else
6492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            drawPageBackground(hdc, dirtyRect);
6502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
65381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void flashRects(HDC dc, const IntRect rects[], size_t rectCount, HBRUSH brush)
65481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
65581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (size_t i = 0; i < rectCount; ++i) {
65681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RECT winRect = rects[i];
65781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ::FillRect(dc, &winRect, brush);
65881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
65981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
66081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ::GdiFlush();
66181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ::Sleep(50);
66281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
66381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
66481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic OwnPtr<HBRUSH> createBrush(const Color& color)
66581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
66681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return adoptPtr(::CreateSolidBrush(RGB(color.red(), color.green(), color.blue())));
66781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
66881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
66965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onPaintEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled)
67065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
67165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PAINTSTRUCT paintStruct;
67265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HDC hdc = ::BeginPaint(m_window, &paintStruct);
67365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
67481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (WebPageProxy::debugPaintFlags() & kWKDebugFlashViewUpdates) {
67581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static HBRUSH brush = createBrush(WebPageProxy::viewUpdatesFlashColor().rgb()).leakPtr();
67681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        IntRect rect = paintStruct.rcPaint;
67781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        flashRects(hdc, &rect, 1, brush);
67881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
67981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    paint(hdc, paintStruct.rcPaint);
68165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
68265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::EndPaint(m_window, &paintStruct);
68365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
68465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
68565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
68665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
68765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
68865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onPrintClientEvent(HWND hWnd, UINT, WPARAM wParam, LPARAM, bool& handled)
68965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
69065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HDC hdc = reinterpret_cast<HDC>(wParam);
69165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT winRect;
69265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::GetClientRect(hWnd, &winRect);
69365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Twidding the visibility flags tells the DrawingArea to resume painting. Right now, the
6952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // the visible state of the view only affects whether or not painting happens, but in the
6962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // future it could affect more, which we wouldn't want to touch here.
6972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME: We should have a better way of telling the WebProcess to draw even if we're
6992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // invisible than twiddling the visibility flag.
7002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool wasVisible = isViewVisible();
7022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!wasVisible)
7032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        setIsVisible(true);
7042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    paint(hdc, winRect);
70665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!wasVisible)
7082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        setIsVisible(false);
7092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
71065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onSizeEvent(HWND, UINT, WPARAM, LPARAM lParam, bool& handled)
71565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
71665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int width = LOWORD(lParam);
71765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int height = HIWORD(lParam);
71865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7192bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_page && m_page->drawingArea()) {
7202bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_page->drawingArea()->setSize(IntSize(width, height), m_nextResizeScrollOffset);
7212bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_nextResizeScrollOffset = IntSize();
7222bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
72365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
72565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onWindowPositionChangedEvent(HWND, UINT, WPARAM, LPARAM lParam, bool& handled)
72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (reinterpret_cast<WINDOWPOS*>(lParam)->flags & SWP_SHOWWINDOW)
73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        updateActiveStateSoon();
73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = false;
73465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
73565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
73665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onSetFocusEvent(HWND, UINT, WPARAM, LPARAM lParam, bool& handled)
73865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
73965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->viewStateDidChange(WebPageProxy::ViewIsFocused);
74065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
74165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
74265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
74365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
74465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onKillFocusEvent(HWND, UINT, WPARAM, LPARAM lParam, bool& handled)
74565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
74665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->viewStateDidChange(WebPageProxy::ViewIsFocused);
74765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
74865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
74965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
75065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onTimerEvent(HWND hWnd, UINT, WPARAM wParam, LPARAM, bool& handled)
75265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
75365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (wParam) {
7542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case UpdateActiveStateTimer:
7552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::KillTimer(hWnd, UpdateActiveStateTimer);
7562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        updateActiveState();
7572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
75865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
75965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
76165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
76265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
76365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onShowWindowEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
76565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
76665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // lParam is 0 when the message is sent because of a ShowWindow call.
7672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Since we don't get notified when an ancestor window is hidden or shown, we will keep
7682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // painting even when we have a hidden ancestor. <http://webkit.org/b/54104>
7692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!lParam)
7702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        setIsVisible(wParam);
77165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    handled = false;
77365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
77465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
77565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onSetCursor(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
77765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
77865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_lastCursorSet) {
77965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = false;
78065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
78165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
78265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetCursor(m_lastCursorSet);
78465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
78565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
78665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::updateActiveState()
78865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
78965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
79065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
79165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::updateActiveStateSoon()
79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
79465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This function is called while processing the WM_NCACTIVATE message.
79565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // While processing WM_NCACTIVATE when we are being deactivated, GetActiveWindow() will
79665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // still return our window. If we were to call updateActiveState() in that case, we would
79765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // wrongly think that we are still the active window. To work around this, we update our
79865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // active state after a 0-delay timer fires, at which point GetActiveWindow() will return
79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // the newly-activated window.
80065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetTimer(m_window, UpdateActiveStateTimer, 0, 0);
80265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool initCommonControls()
80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool haveInitialized = false;
80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (haveInitialized)
80865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
80965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    INITCOMMONCONTROLSEX init;
81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    init.dwSize = sizeof(init);
81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    init.dwICC = ICC_TREEVIEW_CLASSES;
81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    haveInitialized = !!::InitCommonControlsEx(&init);
81465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return haveInitialized;
81565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
81665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::initializeToolTipWindow()
81865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
81965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!initCommonControls())
82065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
82165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_toolTipWindow = ::CreateWindowEx(WS_EX_TRANSPARENT, TOOLTIPS_CLASS, 0, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                       CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                       m_window, 0, 0, 0);
82565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_toolTipWindow)
82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
82765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TOOLINFO info = {0};
82965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    info.cbSize = sizeof(info);
83065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    info.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
83165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    info.uId = reinterpret_cast<UINT_PTR>(m_window);
83265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SendMessage(m_toolTipWindow, TTM_ADDTOOL, 0, reinterpret_cast<LPARAM>(&info));
83465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SendMessage(m_toolTipWindow, TTM_SETMAXTIPWIDTH, 0, kMaxToolTipWidth);
83565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetWindowPos(m_toolTipWindow, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
83665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
83765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::startTrackingMouseLeave()
83965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
84065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_trackingMouseLeave)
84165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
84265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_trackingMouseLeave = true;
84365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TRACKMOUSEEVENT trackMouseEvent;
84565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
84665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.dwFlags = TME_LEAVE;
84765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.hwndTrack = m_window;
84865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::TrackMouseEvent(&trackMouseEvent);
85065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
85165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::stopTrackingMouseLeave()
85365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
85465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_trackingMouseLeave)
85565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
85665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_trackingMouseLeave = false;
85765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TRACKMOUSEEVENT trackMouseEvent;
85965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
86065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.dwFlags = TME_LEAVE | TME_CANCEL;
86165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.hwndTrack = m_window;
86265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
86365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::TrackMouseEvent(&trackMouseEvent);
86465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
86565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8662bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebView::shouldInitializeTrackPointHack()
8672bde8e466a4451c7319e3a072d118917957d6554Steve Block{
8682bde8e466a4451c7319e3a072d118917957d6554Steve Block    static bool shouldCreateScrollbars;
8692bde8e466a4451c7319e3a072d118917957d6554Steve Block    static bool hasRunTrackPointCheck;
8702bde8e466a4451c7319e3a072d118917957d6554Steve Block
8712bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (hasRunTrackPointCheck)
8722bde8e466a4451c7319e3a072d118917957d6554Steve Block        return shouldCreateScrollbars;
8732bde8e466a4451c7319e3a072d118917957d6554Steve Block
8742bde8e466a4451c7319e3a072d118917957d6554Steve Block    hasRunTrackPointCheck = true;
8752bde8e466a4451c7319e3a072d118917957d6554Steve Block    const wchar_t* trackPointKeys[] = {
8762bde8e466a4451c7319e3a072d118917957d6554Steve Block        L"Software\\Lenovo\\TrackPoint",
8772bde8e466a4451c7319e3a072d118917957d6554Steve Block        L"Software\\Lenovo\\UltraNav",
8782bde8e466a4451c7319e3a072d118917957d6554Steve Block        L"Software\\Alps\\Apoint\\TrackPoint",
8792bde8e466a4451c7319e3a072d118917957d6554Steve Block        L"Software\\Synaptics\\SynTPEnh\\UltraNavUSB",
8802bde8e466a4451c7319e3a072d118917957d6554Steve Block        L"Software\\Synaptics\\SynTPEnh\\UltraNavPS2"
8812bde8e466a4451c7319e3a072d118917957d6554Steve Block    };
8822bde8e466a4451c7319e3a072d118917957d6554Steve Block
8832bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (size_t i = 0; i < WTF_ARRAY_LENGTH(trackPointKeys); ++i) {
8842bde8e466a4451c7319e3a072d118917957d6554Steve Block        HKEY trackPointKey;
8852bde8e466a4451c7319e3a072d118917957d6554Steve Block        int readKeyResult = ::RegOpenKeyExW(HKEY_CURRENT_USER, trackPointKeys[i], 0, KEY_READ, &trackPointKey);
8862bde8e466a4451c7319e3a072d118917957d6554Steve Block        ::RegCloseKey(trackPointKey);
8872bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (readKeyResult == ERROR_SUCCESS) {
8882bde8e466a4451c7319e3a072d118917957d6554Steve Block            shouldCreateScrollbars = true;
8892bde8e466a4451c7319e3a072d118917957d6554Steve Block            return shouldCreateScrollbars;
8902bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
8912bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
8922bde8e466a4451c7319e3a072d118917957d6554Steve Block
8932bde8e466a4451c7319e3a072d118917957d6554Steve Block    return shouldCreateScrollbars;
8942bde8e466a4451c7319e3a072d118917957d6554Steve Block}
8952bde8e466a4451c7319e3a072d118917957d6554Steve Block
89665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::close()
89765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8982bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_undoClient.initialize(0);
8992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::RevokeDragDrop(m_window);
9002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_window) {
9012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // We can't check IsWindow(m_window) here, because that will return true even while
9022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // we're already handling WM_DESTROY. So we check !m_isBeingDestroyed instead.
9032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!m_isBeingDestroyed)
9042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            DestroyWindow(m_window);
9052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Either we just destroyed m_window, or it's in the process of being destroyed. Either
9062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // way, we clear it out to make sure we don't try to use it later.
9072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_window = 0;
9082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
90965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setParentWindow(0);
91065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->close();
91165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
91265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
91365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// PageClient
91465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
91565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassOwnPtr<DrawingAreaProxy> WebView::createDrawingAreaProxy()
91665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (useNewDrawingArea())
9182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return DrawingAreaProxyImpl::create(m_page.get());
9192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
92065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ChunkedUpdateDrawingAreaProxy::create(this, m_page.get());
92165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
92265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
92365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setViewNeedsDisplay(const WebCore::IntRect& rect)
92465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
92565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT r = rect;
92665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::InvalidateRect(m_window, &r, false);
92765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
92865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
92965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::displayView()
93065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
93165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::UpdateWindow(m_window);
93265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
93365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
934ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid WebView::scrollView(const IntRect& scrollRect, const IntSize& scrollOffset)
935ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
936ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // FIXME: Actually scroll the view contents.
937ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    setViewNeedsDisplay(scrollRect);
938ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
939ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
94081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebView::flashBackingStoreUpdates(const Vector<IntRect>& updateRects)
94181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
94281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static HBRUSH brush = createBrush(WebPageProxy::backingStoreUpdatesFlashColor().rgb()).leakPtr();
94381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    HDC dc = ::GetDC(m_window);
94481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    flashRects(dc, updateRects.data(), updateRects.size(), brush);
94581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ::ReleaseDC(m_window, dc);
94681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
94781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
94865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebCore::IntSize WebView::viewSize()
94965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
95065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT clientRect;
95165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GetClientRect(m_window, &clientRect);
95265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
95365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return IntRect(clientRect).size();
95465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
95565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
95665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::isViewWindowActive()
95765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
95865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HWND activeWindow = ::GetActiveWindow();
95965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return (activeWindow && m_topLevelParentWindow == findTopLevelParentWindow(activeWindow));
96065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
96165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::isViewFocused()
96365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
96465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ::GetFocus() == m_window;
96565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
96665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::isViewVisible()
96865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
96965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_isVisible;
97065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
97165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
97265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::isViewInWindow()
97365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
97465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_isInWindow;
97565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
97665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9772fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::pageClosed()
9782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
98165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::processDidCrash()
98265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
98365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateNativeCursor();
98465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::InvalidateRect(m_window, 0, TRUE);
98565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
98665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
98765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::didRelaunchProcess()
98865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
98965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateNativeCursor();
99065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::InvalidateRect(m_window, 0, TRUE);
99165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
99265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
99365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::toolTipChanged(const String&, const String& newToolTip)
99465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
99565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_toolTipWindow)
99665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
99765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
99865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!newToolTip.isEmpty()) {
99965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // This is necessary because String::charactersWithNullTermination() is not const.
100065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        String toolTip = newToolTip;
100165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
100265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        TOOLINFO info = {0};
100365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        info.cbSize = sizeof(info);
100465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        info.uFlags = TTF_IDISHWND;
100565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        info.uId = reinterpret_cast<UINT_PTR>(m_window);
100665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        info.lpszText = const_cast<UChar*>(toolTip.charactersWithNullTermination());
100765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::SendMessage(m_toolTipWindow, TTM_UPDATETIPTEXT, 0, reinterpret_cast<LPARAM>(&info));
100865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
100965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
101065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SendMessage(m_toolTipWindow, TTM_ACTIVATE, !newToolTip.isEmpty(), 0);
101165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
101265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
101365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochHCURSOR WebView::cursorToShow() const
101465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
101565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page->isValid())
101665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
101765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
101865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We only show the override cursor if the default (arrow) cursor is showing.
101965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static HCURSOR arrowCursor = ::LoadCursor(0, IDC_ARROW);
102065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_overrideCursor && m_webCoreCursor == arrowCursor)
102165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return m_overrideCursor;
102265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
102365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_webCoreCursor;
102465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
102565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
102665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::updateNativeCursor()
102765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
102865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_lastCursorSet = cursorToShow();
102965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_lastCursorSet)
103065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
103165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetCursor(m_lastCursorSet);
103265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
103365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
103465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setCursor(const WebCore::Cursor& cursor)
103565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
103665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!cursor.platformCursor()->nativeCursor())
103765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
103865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webCoreCursor = cursor.platformCursor()->nativeCursor();
103965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateNativeCursor();
104065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
104165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
104265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setOverrideCursor(HCURSOR overrideCursor)
104365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
104465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_overrideCursor = overrideCursor;
104565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateNativeCursor();
104665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
104765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
104865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setInitialFocus(bool forward)
104965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
105065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->setInitialFocus(forward);
105165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
105265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10532bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebView::setScrollOffsetOnNextResize(const IntSize& scrollOffset)
10542bde8e466a4451c7319e3a072d118917957d6554Steve Block{
10552bde8e466a4451c7319e3a072d118917957d6554Steve Block    // The next time we get a WM_SIZE message, scroll by the specified amount in onSizeEvent().
10562bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_nextResizeScrollOffset = scrollOffset;
10572bde8e466a4451c7319e3a072d118917957d6554Steve Block}
10582bde8e466a4451c7319e3a072d118917957d6554Steve Block
105965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setViewportArguments(const WebCore::ViewportArguments&)
106065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
106165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
106265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10632bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebView::registerEditCommand(PassRefPtr<WebEditCommandProxy> prpCommand, WebPageProxy::UndoOrRedo undoOrRedo)
106465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10652bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<WebEditCommandProxy> command = prpCommand;
10662bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_undoClient.registerEditCommand(this, command, undoOrRedo);
106765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
106865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
106965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::clearAllEditCommands()
107065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10712bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_undoClient.clearAllEditCommands(this);
10722bde8e466a4451c7319e3a072d118917957d6554Steve Block}
10732bde8e466a4451c7319e3a072d118917957d6554Steve Block
10742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool WebView::canUndoRedo(WebPageProxy::UndoOrRedo undoOrRedo)
10752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
10762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return m_undoClient.canUndoRedo(this, undoOrRedo);
10772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
10782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebView::executeUndoRedo(WebPageProxy::UndoOrRedo undoOrRedo)
10802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
10812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_undoClient.executeUndoRedo(this, undoOrRedo);
10822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
10832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10842bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebView::reapplyEditCommand(WebEditCommandProxy* command)
10852bde8e466a4451c7319e3a072d118917957d6554Steve Block{
10862bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_page->isValid() || !m_page->isValidEditCommand(command))
10872bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
10882bde8e466a4451c7319e3a072d118917957d6554Steve Block
10892bde8e466a4451c7319e3a072d118917957d6554Steve Block    command->reapply();
10902bde8e466a4451c7319e3a072d118917957d6554Steve Block}
10912bde8e466a4451c7319e3a072d118917957d6554Steve Block
10922bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebView::unapplyEditCommand(WebEditCommandProxy* command)
10932bde8e466a4451c7319e3a072d118917957d6554Steve Block{
10942bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_page->isValid() || !m_page->isValidEditCommand(command))
10952bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
10962bde8e466a4451c7319e3a072d118917957d6554Steve Block
10972bde8e466a4451c7319e3a072d118917957d6554Steve Block    command->unapply();
109865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
109965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
110065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochFloatRect WebView::convertToDeviceSpace(const FloatRect& rect)
110165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
110265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return rect;
110365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
110465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11052bde8e466a4451c7319e3a072d118917957d6554Steve BlockIntRect WebView::windowToScreen(const IntRect& rect)
11062bde8e466a4451c7319e3a072d118917957d6554Steve Block{
11072bde8e466a4451c7319e3a072d118917957d6554Steve Block    return rect;
11082bde8e466a4451c7319e3a072d118917957d6554Steve Block}
11092bde8e466a4451c7319e3a072d118917957d6554Steve Block
111065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochFloatRect WebView::convertToUserSpace(const FloatRect& rect)
111165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
111265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return rect;
111365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
111465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
111565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochHIMC WebView::getIMMContext()
111665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
111765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return Ime::ImmGetContext(m_window);
111865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
111965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
112065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::prepareCandidateWindow(HIMC hInputContext)
112165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
112265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect caret = m_page->firstRectForCharacterInSelectedRange(0);
112365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CANDIDATEFORM form;
112465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.dwIndex = 0;
112565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.dwStyle = CFS_EXCLUDE;
112665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.ptCurrentPos.x = caret.x();
11272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    form.ptCurrentPos.y = caret.maxY();
112865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.rcArea.top = caret.y();
11292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    form.rcArea.bottom = caret.maxY();
113065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.rcArea.left = caret.x();
11312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    form.rcArea.right = caret.maxX();
113265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmSetCandidateWindow(hInputContext, &form);
113365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
113465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
113565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::resetIME()
113665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
113765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HIMC hInputContext = getIMMContext();
113865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!hInputContext)
113965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
114065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmNotifyIME(hInputContext, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
114165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmReleaseContext(m_window, hInputContext);
114265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
114365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
114465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setInputMethodState(bool enabled)
114565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
114665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmAssociateContextEx(m_window, 0, enabled ? IACE_DEFAULT : 0);
114765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
114865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
114965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::compositionSelectionChanged(bool hasChanged)
115065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_page->editorState().hasComposition && !hasChanged)
115265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        resetIME();
115365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
115465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
115565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMEStartComposition()
115665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
115765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMEStartComposition");
115865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_inIMEComposition++;
115965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
116065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HIMC hInputContext = getIMMContext();
116165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!hInputContext)
116265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
116365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    prepareCandidateWindow(hInputContext);
116465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmReleaseContext(m_window, hInputContext);
116565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
116665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
116765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
116865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool getCompositionString(HIMC hInputContext, DWORD type, String& result)
116965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
117065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LONG compositionLength = Ime::ImmGetCompositionStringW(hInputContext, type, 0, 0);
117165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (compositionLength <= 0)
117265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
117365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<UChar> compositionBuffer(compositionLength / 2);
117465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    compositionLength = Ime::ImmGetCompositionStringW(hInputContext, type, compositionBuffer.data(), compositionLength);
117565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    result = String::adopt(compositionBuffer);
117665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
117765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
117865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
117965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void compositionToUnderlines(const Vector<DWORD>& clauses, const Vector<BYTE>& attributes, Vector<CompositionUnderline>& underlines)
118065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
118165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (clauses.isEmpty()) {
118265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines.clear();
118365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
118465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
118565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
118665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    size_t numBoundaries = clauses.size() - 1;
118765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    underlines.resize(numBoundaries);
118865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (unsigned i = 0; i < numBoundaries; ++i) {
118965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines[i].startOffset = clauses[i];
119065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines[i].endOffset = clauses[i + 1];
119165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        BYTE attribute = attributes[clauses[i]];
119265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines[i].thick = attribute == ATTR_TARGET_CONVERTED || attribute == ATTR_TARGET_NOTCONVERTED;
119365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines[i].color = Color::black;
119465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
119565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
119665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
119765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !LOG_DISABLED
119865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define APPEND_ARGUMENT_NAME(name) \
119965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (lparam & name) { \
120065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (needsComma) \
120165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result += ", "; \
120265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result += #name; \
120365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        needsComma = true; \
120465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
120565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
120665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic String imeCompositionArgumentNames(LPARAM lparam)
120765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
120865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String result;
120965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool needsComma = false;
121065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
121165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPATTR);
121265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPCLAUSE);
121365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPREADSTR);
121465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPREADATTR);
121565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPREADCLAUSE);
121665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPSTR);
121765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_CURSORPOS);
121865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_DELTASTART);
121965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_RESULTCLAUSE);
122065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_RESULTREADCLAUSE);
122165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_RESULTREADSTR);
122265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_RESULTSTR);
122365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(CS_INSERTCHAR);
122465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(CS_NOMOVECARET);
122565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
122665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return result;
122765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
122865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
122965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic String imeRequestName(WPARAM wparam)
123065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
123165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (wparam) {
123265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_CANDIDATEWINDOW:
123365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_CANDIDATEWINDOW";
123465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_COMPOSITIONFONT:
123565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_COMPOSITIONFONT";
123665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_COMPOSITIONWINDOW:
123765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_COMPOSITIONWINDOW";
123865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_CONFIRMRECONVERTSTRING:
123965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_CONFIRMRECONVERTSTRING";
124065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_DOCUMENTFEED:
124165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_DOCUMENTFEED";
124265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_QUERYCHARPOSITION:
124365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_QUERYCHARPOSITION";
124465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_RECONVERTSTRING:
124565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_RECONVERTSTRING";
124665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
124765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "Unknown (" + String::number(wparam) + ")";
124865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
124965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
125065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
125165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
125265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMEComposition(LPARAM lparam)
125365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
125465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMEComposition %s", imeCompositionArgumentNames(lparam).latin1().data());
125565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HIMC hInputContext = getIMMContext();
125665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!hInputContext)
125765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
125865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_page->editorState().isContentEditable)
126065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
126165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
126265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    prepareCandidateWindow(hInputContext);
126365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
126465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (lparam & GCS_RESULTSTR || !lparam) {
126565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        String compositionString;
126665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!getCompositionString(hInputContext, GCS_RESULTSTR, compositionString) && lparam)
126765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return true;
126865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
126965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_page->confirmComposition(compositionString);
127065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
127165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
127265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
127365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String compositionString;
127465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!getCompositionString(hInputContext, GCS_COMPSTR, compositionString))
127565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
127665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
127765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Composition string attributes
127865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int numAttributes = Ime::ImmGetCompositionStringW(hInputContext, GCS_COMPATTR, 0, 0);
127965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<BYTE> attributes(numAttributes);
128065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmGetCompositionStringW(hInputContext, GCS_COMPATTR, attributes.data(), numAttributes);
128165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
128265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Get clauses
128365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int numBytes = Ime::ImmGetCompositionStringW(hInputContext, GCS_COMPCLAUSE, 0, 0);
128465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<DWORD> clauses(numBytes / sizeof(DWORD));
128565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmGetCompositionStringW(hInputContext, GCS_COMPCLAUSE, clauses.data(), numBytes);
128665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
128765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<CompositionUnderline> underlines;
128865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    compositionToUnderlines(clauses, attributes, underlines);
128965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
129065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int cursorPosition = LOWORD(Ime::ImmGetCompositionStringW(hInputContext, GCS_CURSORPOS, 0, 0));
129165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
129265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->setComposition(compositionString, underlines, cursorPosition);
129365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
129465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
129565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
129665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
129765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMEEndComposition()
129865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
129965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMEEndComposition");
130065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If the composition hasn't been confirmed yet, it needs to be cancelled.
130165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This happens after deleting the last character from inline input hole.
13022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_page->editorState().hasComposition)
130365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_page->confirmComposition(String());
130465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
130565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_inIMEComposition)
130665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_inIMEComposition--;
130765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
130865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
130965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
131065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
131165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onIMERequestCharPosition(IMECHARPOSITION* charPos)
131265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (charPos->dwCharPos && !m_page->editorState().hasComposition)
131465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
131565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect caret = m_page->firstRectForCharacterInSelectedRange(charPos->dwCharPos);
131665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    charPos->pt.x = caret.x();
131765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    charPos->pt.y = caret.y();
131865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::ClientToScreen(m_window, &charPos->pt);
131965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    charPos->cLineHeight = caret.height();
132065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::GetWindowRect(m_window, &charPos->rcDocument);
132165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
132265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
132365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
132465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onIMERequestReconvertString(RECONVERTSTRING* reconvertString)
132565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
132665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String text = m_page->getSelectedText();
132765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned totalSize = sizeof(RECONVERTSTRING) + text.length() * sizeof(UChar);
132865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
132965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!reconvertString)
133065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return totalSize;
133165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
133265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (totalSize > reconvertString->dwSize)
133365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
133465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reconvertString->dwCompStrLen = text.length();
133565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reconvertString->dwStrLen = text.length();
133665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reconvertString->dwTargetStrLen = text.length();
133765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reconvertString->dwStrOffset = sizeof(RECONVERTSTRING);
133865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memcpy(reconvertString + 1, text.characters(), text.length() * sizeof(UChar));
133965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return totalSize;
134065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
134165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
134265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onIMERequest(WPARAM request, LPARAM data)
134365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
134465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMERequest %s", imeRequestName(request).latin1().data());
13452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_page->editorState().isContentEditable)
134665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
134765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
134865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (request) {
13492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case IMR_RECONVERTSTRING:
13502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return onIMERequestReconvertString(reinterpret_cast<RECONVERTSTRING*>(data));
135165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case IMR_QUERYCHARPOSITION:
13532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return onIMERequestCharPosition(reinterpret_cast<IMECHARPOSITION*>(data));
135465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
135565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
135665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
135765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
135865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMESelect(WPARAM wparam, LPARAM lparam)
135965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
136065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UNUSED_PARAM(wparam);
136165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UNUSED_PARAM(lparam);
136265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMESelect locale %ld %s", lparam, wparam ? "select" : "deselect");
136365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
136465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
136565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
136665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMESetContext(WPARAM wparam, LPARAM)
136765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
136865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMESetContext %s", wparam ? "active" : "inactive");
136965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
137065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
137165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13722fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::doneWithKeyEvent(const NativeWebKeyboardEvent& event, bool wasEventHandled)
137365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
137465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Calling ::DefWindowProcW will ensure that pressing the Alt key will generate a WM_SYSCOMMAND
137565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // event, e.g. See <http://webkit.org/b/47671>.
13762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!wasEventHandled)
13772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::DefWindowProcW(event.nativeEvent()->hwnd, event.nativeEvent()->message, event.nativeEvent()->wParam, event.nativeEvent()->lParam);
137865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
137965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
138065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebPopupMenuProxy> WebView::createPopupMenuProxy(WebPageProxy* page)
138165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
138265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return WebPopupMenuProxyWin::create(this, page);
138365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
138465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
138565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebContextMenuProxy> WebView::createContextMenuProxy(WebPageProxy* page)
138665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
138765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return WebContextMenuProxyWin::create(m_window, page);
138865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
138965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13902fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::setFindIndicator(PassRefPtr<FindIndicator> prpFindIndicator, bool fadeOut)
139165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_findIndicatorCallback)
13932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
13942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    HBITMAP hbmp = 0;
13962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntRect selectionRect;
13972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (RefPtr<FindIndicator> findIndicator = prpFindIndicator) {
13992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (ShareableBitmap* contentImage = findIndicator->contentImage()) {
14002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            // Render the contentImage to an HBITMAP.
14012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            void* bits;
14022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            HDC hdc = ::CreateCompatibleDC(0);
14032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            int width = contentImage->bounds().width();
14042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            int height = contentImage->bounds().height();
14052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            BitmapInfo bitmapInfo = BitmapInfo::create(contentImage->size());
14062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            hbmp = CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, static_cast<void**>(&bits), 0, 0);
14082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            HBITMAP hbmpOld = static_cast<HBITMAP>(SelectObject(hdc, hbmp));
14092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG)
14102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            RetainPtr<CGContextRef> context(AdoptCF, CGBitmapContextCreate(bits, width, height,
14112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                8, width * sizeof(RGBQUAD), deviceRGBColorSpaceRef(), kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst));
14122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            GraphicsContext graphicsContext(context.get());
14142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            contentImage->paint(graphicsContext, IntPoint(), contentImage->bounds());
14152bde8e466a4451c7319e3a072d118917957d6554Steve Block#else
14162bde8e466a4451c7319e3a072d118917957d6554Steve Block            // FIXME: Implement!
14172bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
14182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ::SelectObject(hdc, hbmpOld);
14202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ::DeleteDC(hdc);
14212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
14222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        selectionRect = IntRect(findIndicator->selectionRectInWindowCoordinates());
14242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
14252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The callback is responsible for calling ::DeleteObject(hbmp).
14272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    (*m_findIndicatorCallback)(toAPI(this), hbmp, selectionRect, fadeOut, m_findIndicatorCallbackContext);
14282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
14292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14302fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::setFindIndicatorCallback(WKViewFindIndicatorCallback callback, void* context)
14312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
14322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_findIndicatorCallback = callback;
14332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_findIndicatorCallbackContext = context;
14342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
14352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14362fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWKViewFindIndicatorCallback WebView::getFindIndicatorCallback(void** context)
14372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
14382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (context)
14392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *context = m_findIndicatorCallbackContext;
14402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_findIndicatorCallback;
144265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
144365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
144465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::didCommitLoadForMainFrame(bool useCustomRepresentation)
144565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
144665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
144765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
144881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebView::didFinishLoadingDataForCustomRepresentation(const String& suggestedFilename, const CoreIPC::DataReference&)
144965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
145065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
145165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
145265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochdouble WebView::customRepresentationZoomFactor()
145365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
145465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 1;
145565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
145665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
145765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setCustomRepresentationZoomFactor(double)
145865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
145965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
146065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::didChangeScrollbarsForMainFrame() const
14622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
14632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
14642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebView::findStringInCustomRepresentation(const String&, FindOptions, unsigned)
14662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
14672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
14682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebView::countStringMatchesInCustomRepresentation(const String&, FindOptions, unsigned)
14702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
14712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
14722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
147365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setIsInWindow(bool isInWindow)
147465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
147565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_isInWindow = isInWindow;
147665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->viewStateDidChange(WebPageProxy::ViewIsInWindow);
147765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
147865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebView::setIsVisible(bool isVisible)
14802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
14812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_isVisible = isVisible;
14822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_page)
14842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
14852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
14862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
148765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
148865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14892fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::enterAcceleratedCompositingMode(const LayerTreeContext&)
14902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
14912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(useNewDrawingArea());
14922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Implement.
14932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_NOT_REACHED();
14942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
14952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14962fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::exitAcceleratedCompositingMode()
14972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
14982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(useNewDrawingArea());
14992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Implement.
15002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_NOT_REACHED();
15012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
15022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
150365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // USE(ACCELERATED_COMPOSITING)
150465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
150565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochHWND WebView::nativeWindow()
150665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
150765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_window;
150865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
150965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
151065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// WebCore::WindowMessageListener
151165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
151265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::windowReceivedMessage(HWND, UINT message, WPARAM wParam, LPARAM)
151365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
151465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (message) {
15152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_NCACTIVATE:
15162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        updateActiveStateSoon();
15172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
15182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SETTINGCHANGE:
15192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // systemParameterChanged(wParam);
15202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
152165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
152265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
152365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15242fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::QueryInterface(REFIID riid, void** ppvObject)
15252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
15262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    *ppvObject = 0;
15272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (IsEqualGUID(riid, IID_IUnknown))
15282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *ppvObject = static_cast<IUnknown*>(this);
15292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (IsEqualGUID(riid, IID_IDropTarget))
15302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *ppvObject = static_cast<IDropTarget*>(this);
15312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
15322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return E_NOINTERFACE;
15332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    AddRef();
15352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
15362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
15372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15382fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockULONG STDMETHODCALLTYPE WebView::AddRef(void)
15392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
15402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ref();
15412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return refCount();
15422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
15432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15442fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockULONG STDMETHODCALLTYPE WebView::Release(void)
15452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
15462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    deref();
15472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return refCount();
15482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
15492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15502fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic DWORD dragOperationToDragCursor(DragOperation op)
15512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
15522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DWORD res = DROPEFFECT_NONE;
15532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (op & DragOperationCopy)
15542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        res = DROPEFFECT_COPY;
15552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (op & DragOperationLink)
15562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        res = DROPEFFECT_LINK;
15572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (op & DragOperationMove)
15582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        res = DROPEFFECT_MOVE;
15592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (op & DragOperationGeneric)
15602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        res = DROPEFFECT_MOVE; // This appears to be the Firefox behaviour
15612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return res;
15622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
15632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15642fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebCore::DragOperation WebView::keyStateToDragOperation(DWORD grfKeyState) const
15652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
15662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_page)
15672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return DragOperationNone;
15682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Conforms to Microsoft's key combinations as documented for
15702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // IDropTarget::DragOver. Note, grfKeyState is the current
15712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // state of the keyboard modifier keys on the keyboard. See:
15722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // <http://msdn.microsoft.com/en-us/library/ms680129(VS.85).aspx>.
15732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DragOperation operation = m_page->dragOperation();
15742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if ((grfKeyState & (MK_CONTROL | MK_SHIFT)) == (MK_CONTROL | MK_SHIFT))
15762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        operation = DragOperationLink;
15772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if ((grfKeyState & MK_CONTROL) == MK_CONTROL)
15782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        operation = DragOperationCopy;
15792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if ((grfKeyState & MK_SHIFT) == MK_SHIFT)
15802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        operation = DragOperationGeneric;
15812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return operation;
15832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
15842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15852fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
15862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
15872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_dragData = 0;
15882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_page->resetDragOperation();
15892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dropTargetHelper)
15912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dropTargetHelper->DragEnter(m_window, pDataObject, (POINT*)&pt, *pdwEffect);
15922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    POINTL localpt = pt;
15942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::ScreenToClient(m_window, (LPPOINT)&localpt);
15952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DragData data(pDataObject, IntPoint(localpt.x, localpt.y), IntPoint(pt.x, pt.y), keyStateToDragOperation(grfKeyState));
15962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_page->dragEntered(&data);
15972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    *pdwEffect = dragOperationToDragCursor(m_page->dragOperation());
15982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_lastDropEffect = *pdwEffect;
16002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_dragData = pDataObject;
16012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
16032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
16042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16052fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
16062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
16072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dropTargetHelper)
16082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dropTargetHelper->DragOver((POINT*)&pt, *pdwEffect);
16092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dragData) {
16112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        POINTL localpt = pt;
16122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::ScreenToClient(m_window, (LPPOINT)&localpt);
16132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        DragData data(m_dragData.get(), IntPoint(localpt.x, localpt.y), IntPoint(pt.x, pt.y), keyStateToDragOperation(grfKeyState));
16142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_page->dragUpdated(&data);
16152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *pdwEffect = dragOperationToDragCursor(m_page->dragOperation());
16162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else
16172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *pdwEffect = DROPEFFECT_NONE;
16182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_lastDropEffect = *pdwEffect;
16202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
16212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
16222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16232fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::DragLeave()
16242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
16252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dropTargetHelper)
16262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dropTargetHelper->DragLeave();
16272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dragData) {
16292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        DragData data(m_dragData.get(), IntPoint(), IntPoint(), DragOperationNone);
16302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_page->dragExited(&data);
16312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dragData = 0;
16322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->resetDragOperation();
16332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
16342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
16352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
16362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16372fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
16382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
16392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dropTargetHelper)
16402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dropTargetHelper->Drop(pDataObject, (POINT*)&pt, *pdwEffect);
16412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_dragData = 0;
16432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    *pdwEffect = m_lastDropEffect;
16442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    POINTL localpt = pt;
16452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::ScreenToClient(m_window, (LPPOINT)&localpt);
16462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DragData data(pDataObject, IntPoint(localpt.x, localpt.y), IntPoint(pt.x, pt.y), keyStateToDragOperation(grfKeyState));
16472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
16482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SandboxExtension::Handle sandboxExtensionHandle;
16492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_page->performDrag(&data, String(), sandboxExtensionHandle);
16502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
16512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
16522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
165365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
1654