WebView.cpp revision 2fc2651226baac27029e38c9d6ef883fa32084db
165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebView.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ChunkedUpdateDrawingAreaProxy.h"
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "DrawingAreaProxyImpl.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "FindIndicator.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "LayerBackedDrawingAreaProxy.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Logging.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NativeWebKeyboardEvent.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>
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <WebCore/GraphicsContextCG.h>
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/IntRect.h>
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/SoftLinking.h>
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/WebCoreInstanceHandle.h>
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/WindowMessageBroadcaster.h>
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h>
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace Ime {
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// We need these functions in a separate namespace, because in the global namespace they conflict
572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// with the definitions in imm.h only by the type modifier (the macro defines them as static) and
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// imm.h is included by windows.h
592fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK_LIBRARY(IMM32)
602fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmGetContext, HIMC, WINAPI, (HWND hwnd), (hwnd))
612fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmReleaseContext, BOOL, WINAPI, (HWND hWnd, HIMC hIMC), (hWnd, hIMC))
622fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmGetCompositionStringW, LONG, WINAPI, (HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen), (hIMC, dwIndex, lpBuf, dwBufLen))
632fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmSetCandidateWindow, BOOL, WINAPI, (HIMC hIMC, LPCANDIDATEFORM lpCandidate), (hIMC, lpCandidate))
642fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmSetOpenStatus, BOOL, WINAPI, (HIMC hIMC, BOOL fOpen), (hIMC, fOpen))
652fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmNotifyIME, BOOL, WINAPI, (HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue), (hIMC, dwAction, dwIndex, dwValue))
662fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSOFT_LINK(IMM32, ImmAssociateContextEx, BOOL, WINAPI, (HWND hWnd, HIMC hIMC, DWORD dwFlags), (hWnd, hIMC, dwFlags))
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const LPCWSTR kWebKit2WebViewWindowClassName = L"WebKit2WebViewWindowClass";
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Constants not available on all platforms.
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst int WM_XP_THEMECHANGED = 0x031A;
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst int WM_VISTA_MOUSEHWHEEL = 0x020E;
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const int kMaxToolTipWidth = 250;
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochenum {
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UpdateActiveStateTimer = 1,
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic bool useNewDrawingArea()
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Remove this function and the old drawing area code once we aren't interested in
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // testing the old drawing area anymore.
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT CALLBACK WebView::WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LONG_PTR longPtr = ::GetWindowLongPtr(hWnd, 0);
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (WebView* webView = reinterpret_cast<WebView*>(longPtr))
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return webView->wndProc(hWnd, message, wParam, lParam);
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (message == WM_CREATE) {
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        LPCREATESTRUCT createStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Associate the WebView with the window.
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::SetWindowLongPtr(hWnd, 0, (LONG_PTR)createStruct->lpCreateParams);
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ::DefWindowProc(hWnd, message, wParam, lParam);
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LRESULT lResult = 0;
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = true;
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (message) {
1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_CLOSE:
1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->tryClose();
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_DESTROY:
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_isBeingDestroyed = true;
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        close();
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_ERASEBKGND:
1242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = 1;
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_PAINT:
1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onPaintEvent(hWnd, message, wParam, lParam, handled);
1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_PRINTCLIENT:
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onPrintClientEvent(hWnd, message, wParam, lParam, handled);
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSEACTIVATE:
1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        setWasActivatedByMouseEvent(true);
1342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = false;
1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSEMOVE:
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONDOWN:
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONDOWN:
1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONDOWN:
1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONDBLCLK:
1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONDBLCLK:
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONDBLCLK:
1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONUP:
1442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONUP:
1452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONUP:
1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSELEAVE:
1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onMouseEvent(hWnd, message, wParam, lParam, handled);
1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSEWHEEL:
1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_VISTA_MOUSEHWHEEL:
1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onWheelEvent(hWnd, message, wParam, lParam, handled);
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SYSKEYDOWN:
1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_KEYDOWN:
1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SYSCHAR:
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_CHAR:
1572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SYSKEYUP:
1582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_KEYUP:
1592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onKeyEvent(hWnd, message, wParam, lParam, handled);
1602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SIZE:
1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onSizeEvent(hWnd, message, wParam, lParam, handled);
1632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_WINDOWPOSCHANGED:
1652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onWindowPositionChangedEvent(hWnd, message, wParam, lParam, handled);
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SETFOCUS:
1682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onSetFocusEvent(hWnd, message, wParam, lParam, handled);
1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_KILLFOCUS:
1712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onKillFocusEvent(hWnd, message, wParam, lParam, handled);
1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_TIMER:
1742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onTimerEvent(hWnd, message, wParam, lParam, handled);
1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SHOWWINDOW:
1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onShowWindowEvent(hWnd, message, wParam, lParam, handled);
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SETCURSOR:
1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onSetCursor(hWnd, message, wParam, lParam, handled);
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_STARTCOMPOSITION:
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMEStartComposition();
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_REQUEST:
1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        lResult = onIMERequest(wParam, lParam);
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_COMPOSITION:
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMEComposition(lParam);
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_ENDCOMPOSITION:
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMEEndComposition();
1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_SELECT:
1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMESelect(wParam, lParam);
1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_IME_SETCONTEXT:
1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = onIMESetContext(wParam, lParam);
1992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    default:
2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        handled = false;
2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!handled)
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        lResult = ::DefWindowProc(hWnd, message, wParam, lParam);
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return lResult;
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::registerWebViewWindowClass()
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool haveRegisteredWindowClass = false;
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (haveRegisteredWindowClass)
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    haveRegisteredWindowClass = true;
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WNDCLASSEX wcex;
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbSize = sizeof(WNDCLASSEX);
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.style          = CS_DBLCLKS;
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpfnWndProc    = WebView::WebViewWndProc;
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbClsExtra     = 0;
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbWndExtra     = sizeof(WebView*);
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hInstance      = instanceHandle();
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hIcon          = 0;
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hCursor        = ::LoadCursor(0, IDC_ARROW);
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hbrBackground  = 0;
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpszMenuName   = 0;
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpszClassName  = kWebKit2WebViewWindowClassName;
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hIconSm        = 0;
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return !!::RegisterClassEx(&wcex);
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebView::WebView(RECT rect, WebContext* context, WebPageGroup* pageGroup, HWND parentWindow)
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_topLevelParentWindow(0)
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_toolTipWindow(0)
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_lastCursorSet(0)
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_webCoreCursor(0)
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_overrideCursor(0)
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_trackingMouseLeave(false)
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_isInWindow(false)
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_isVisible(false)
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_wasActivatedByMouseEvent(false)
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_isBeingDestroyed(false)
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_inIMEComposition(0)
2482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_findIndicatorCallback(0)
2492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_findIndicatorCallbackContext(0)
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    registerWebViewWindowClass();
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_window = ::CreateWindowExW(0, kWebKit2WebViewWindowClassName, 0, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE,
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        rect.top, rect.left, rect.right - rect.left, rect.bottom - rect.top, parentWindow ? parentWindow : HWND_MESSAGE, 0, instanceHandle(), this);
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(::IsWindow(m_window));
2562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // We only check our window style, and not ::IsWindowVisible, because m_isVisible only tracks
2572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // this window's visibility status, while ::IsWindowVisible takes our ancestors' visibility
2582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // status into account. <http://webkit.org/b/54104>
2592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_isVisible == static_cast<bool>(::GetWindowLong(m_window, GWL_STYLE) & WS_VISIBLE));
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_page = context->createWebPage(this, pageGroup);
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->initializeWebPage();
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CoCreateInstance(CLSID_DragDropHelper, 0, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, (void**)&m_dropTargetHelper);
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Initializing the tooltip window here matches WebKit win, but seems like something
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // we could do on demand to save resources.
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    initializeToolTipWindow();
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Initialize the top level parent window and register it with the WindowMessageBroadcaster.
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    windowAncestryDidChange();
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebView::~WebView()
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Tooltip window needs to be explicitly destroyed since it isn't a WS_CHILD.
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (::IsWindow(m_toolTipWindow))
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::DestroyWindow(m_toolTipWindow);
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::initialize()
2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::RegisterDragDrop(m_window, this);
2842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setParentWindow(HWND parentWindow)
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_window) {
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // If the host window hasn't changed, bail.
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (::GetParent(m_window) == parentWindow)
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (parentWindow)
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ::SetParent(m_window, parentWindow);
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (!m_isBeingDestroyed) {
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Turn the WebView into a message-only window so it will no longer be a child of the
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // old parent window and will be hidden from screen. We only do this when
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // isBeingDestroyed() is false because doing this while handling WM_DESTROY can leave
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // m_window in a weird state (see <http://webkit.org/b/29337>).
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ::SetParent(m_window, HWND_MESSAGE);
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    windowAncestryDidChange();
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic HWND findTopLevelParentWindow(HWND window)
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!window)
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HWND current = window;
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (HWND parent = GetParent(current); current; current = parent, parent = GetParent(parent)) {
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!parent || !(GetWindowLongPtr(current, GWL_STYLE) & (WS_POPUP | WS_CHILD)))
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return current;
31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::windowAncestryDidChange()
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HWND newTopLevelParentWindow;
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_window)
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        newTopLevelParentWindow = findTopLevelParentWindow(m_window);
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    else {
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // There's no point in tracking active state changes of our parent window if we don't have
32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // a window ourselves.
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        newTopLevelParentWindow = 0;
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (newTopLevelParentWindow == m_topLevelParentWindow)
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_topLevelParentWindow)
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        WindowMessageBroadcaster::removeListener(m_topLevelParentWindow, this);
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_topLevelParentWindow = newTopLevelParentWindow;
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_topLevelParentWindow)
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        WindowMessageBroadcaster::addListener(m_topLevelParentWindow, this);
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateActiveState();
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onMouseEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebMouseEvent mouseEvent = WebEventFactory::createWebMouseEvent(hWnd, message, wParam, lParam, m_wasActivatedByMouseEvent);
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setWasActivatedByMouseEvent(false);
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (message) {
3512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONDOWN:
3522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONDOWN:
3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONDOWN:
3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::SetFocus(m_window);
3552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::SetCapture(m_window);
3562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
3572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONUP:
3582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONUP:
3592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONUP:
3602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::ReleaseCapture();
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
3622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSEMOVE:
3632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        startTrackingMouseLeave();
3642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
3652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MOUSELEAVE:
3662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        stopTrackingMouseLeave();
3672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
3682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_LBUTTONDBLCLK:
3692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_MBUTTONDBLCLK:
3702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_RBUTTONDBLCLK:
3712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
3722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    default:
3732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT_NOT_REACHED();
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->handleMouseEvent(mouseEvent);
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onWheelEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebWheelEvent wheelEvent = WebEventFactory::createWebWheelEvent(hWnd, message, wParam, lParam);
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (wheelEvent.controlKey()) {
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // We do not want WebKit to handle Control + Wheel, this should be handled by the client application
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // to zoom the page.
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = false;
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->handleWheelEvent(wheelEvent);
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onKeyEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->handleKeyboardEvent(NativeWebKeyboardEvent(hWnd, message, wParam, lParam));
40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We claim here to always have handled the event. If the event is not in fact handled, we will
40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // find out later in didNotHandleKeyEvent.
40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4082fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void drawPageBackground(HDC dc, const RECT& rect)
4092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Mac checks WebPageProxy::drawsBackground and
4112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // WebPageProxy::drawsTransparentBackground here, but those are always false on
4122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Windows currently (see <http://webkit.org/b/52009>).
4132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::FillRect(dc, &rect, reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1));
4142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4162fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::paint(HDC hdc, const IntRect& dirtyRect)
4172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (useNewDrawingArea()) {
4192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(m_page->drawingArea())) {
4202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            // FIXME: We should port WebKit1's rect coalescing logic here.
4212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            Region unpaintedRegion;
4222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            drawingArea->paint(hdc, dirtyRect, unpaintedRegion);
4232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            Vector<IntRect> unpaintedRects = unpaintedRegion.rects();
4252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            for (size_t i = 0; i < unpaintedRects.size(); ++i) {
4262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                RECT winRect = unpaintedRects[i];
4272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                drawPageBackground(hdc, unpaintedRects[i]);
4282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
4292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        } else
4302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            drawPageBackground(hdc, dirtyRect);
4312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->didDraw();
4332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else {
4342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_page->isValid() && m_page->drawingArea() && m_page->drawingArea()->paint(dirtyRect, hdc))
4352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_page->didDraw();
4362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else
4372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            drawPageBackground(hdc, dirtyRect);
4382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
4392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onPaintEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled)
44265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
44365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PAINTSTRUCT paintStruct;
44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HDC hdc = ::BeginPaint(m_window, &paintStruct);
44565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    paint(hdc, paintStruct.rcPaint);
44765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::EndPaint(m_window, &paintStruct);
44965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
45265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onPrintClientEvent(HWND hWnd, UINT, WPARAM wParam, LPARAM, bool& handled)
45565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
45665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HDC hdc = reinterpret_cast<HDC>(wParam);
45765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT winRect;
45865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::GetClientRect(hWnd, &winRect);
45965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    paint(hdc, winRect);
46165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
46365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
46465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
46565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onSizeEvent(HWND, UINT, WPARAM, LPARAM lParam, bool& handled)
46765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
46865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int width = LOWORD(lParam);
46965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int height = HIWORD(lParam);
47065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_page && m_page->drawingArea())
4722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->drawingArea()->setSize(IntSize(width, height), IntSize());
47365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
47465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
47565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
47665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
47765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
47865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onWindowPositionChangedEvent(HWND, UINT, WPARAM, LPARAM lParam, bool& handled)
47965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
48065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (reinterpret_cast<WINDOWPOS*>(lParam)->flags & SWP_SHOWWINDOW)
48165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        updateActiveStateSoon();
48265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
48365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = false;
48465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
48565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
48665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
48765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onSetFocusEvent(HWND, UINT, WPARAM, LPARAM lParam, bool& handled)
48865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
48965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->viewStateDidChange(WebPageProxy::ViewIsFocused);
49065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
49165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
49265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
49365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onKillFocusEvent(HWND, UINT, WPARAM, LPARAM lParam, bool& handled)
49565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
49665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->viewStateDidChange(WebPageProxy::ViewIsFocused);
49765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
49865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
49965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
50065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
50165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onTimerEvent(HWND hWnd, UINT, WPARAM wParam, LPARAM, bool& handled)
50265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
50365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (wParam) {
5042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case UpdateActiveStateTimer:
5052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::KillTimer(hWnd, UpdateActiveStateTimer);
5062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        updateActiveState();
5072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
50865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
50965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
51065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handled = true;
51165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
51265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
51365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
51465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onShowWindowEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
51565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
51665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // lParam is 0 when the message is sent because of a ShowWindow call.
5172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Since we don't get notified when an ancestor window is hidden or shown, we will keep
5182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // painting even when we have a hidden ancestor. <http://webkit.org/b/54104>
51965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!lParam) {
52065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_isVisible = wParam;
5212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_page)
5222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
52365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
52465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    handled = false;
52665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
52765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
52865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
52965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onSetCursor(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
53065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
53165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_lastCursorSet) {
53265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = false;
53365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
53465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
53565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
53665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetCursor(m_lastCursorSet);
53765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
53865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
53965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::updateActiveState()
54165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
54265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
54365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
54465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::updateActiveStateSoon()
54665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
54765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This function is called while processing the WM_NCACTIVATE message.
54865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // While processing WM_NCACTIVATE when we are being deactivated, GetActiveWindow() will
54965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // still return our window. If we were to call updateActiveState() in that case, we would
55065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // wrongly think that we are still the active window. To work around this, we update our
55165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // active state after a 0-delay timer fires, at which point GetActiveWindow() will return
55265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // the newly-activated window.
55365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetTimer(m_window, UpdateActiveStateTimer, 0, 0);
55565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool initCommonControls()
55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool haveInitialized = false;
56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (haveInitialized)
56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
56265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    INITCOMMONCONTROLSEX init;
56465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    init.dwSize = sizeof(init);
56565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    init.dwICC = ICC_TREEVIEW_CLASSES;
56665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    haveInitialized = !!::InitCommonControlsEx(&init);
56765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return haveInitialized;
56865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
56965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::initializeToolTipWindow()
57165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
57265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!initCommonControls())
57365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
57465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_toolTipWindow = ::CreateWindowEx(WS_EX_TRANSPARENT, TOOLTIPS_CLASS, 0, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
57665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                       CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
57765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                       m_window, 0, 0, 0);
57865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_toolTipWindow)
57965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
58065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TOOLINFO info = {0};
58265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    info.cbSize = sizeof(info);
58365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    info.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
58465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    info.uId = reinterpret_cast<UINT_PTR>(m_window);
58565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SendMessage(m_toolTipWindow, TTM_ADDTOOL, 0, reinterpret_cast<LPARAM>(&info));
58765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SendMessage(m_toolTipWindow, TTM_SETMAXTIPWIDTH, 0, kMaxToolTipWidth);
58865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetWindowPos(m_toolTipWindow, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
58965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
59065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::startTrackingMouseLeave()
59265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
59365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_trackingMouseLeave)
59465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
59565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_trackingMouseLeave = true;
59665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TRACKMOUSEEVENT trackMouseEvent;
59865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
59965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.dwFlags = TME_LEAVE;
60065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.hwndTrack = m_window;
60165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::TrackMouseEvent(&trackMouseEvent);
60365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
60465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::stopTrackingMouseLeave()
60665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
60765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_trackingMouseLeave)
60865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
60965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_trackingMouseLeave = false;
61065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TRACKMOUSEEVENT trackMouseEvent;
61265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
61365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.dwFlags = TME_LEAVE | TME_CANCEL;
61465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackMouseEvent.hwndTrack = m_window;
61565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::TrackMouseEvent(&trackMouseEvent);
61765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
61865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::close()
62065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::RevokeDragDrop(m_window);
62265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setParentWindow(0);
62365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->close();
62465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
62565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// PageClient
62765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassOwnPtr<DrawingAreaProxy> WebView::createDrawingAreaProxy()
62965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (useNewDrawingArea())
6312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return DrawingAreaProxyImpl::create(m_page.get());
6322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
63365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ChunkedUpdateDrawingAreaProxy::create(this, m_page.get());
63465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
63565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setViewNeedsDisplay(const WebCore::IntRect& rect)
63765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
63865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT r = rect;
63965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::InvalidateRect(m_window, &r, false);
64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::displayView()
64365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
64465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::UpdateWindow(m_window);
64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
647ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid WebView::scrollView(const IntRect& scrollRect, const IntSize& scrollOffset)
648ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
649ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // FIXME: Actually scroll the view contents.
650ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    setViewNeedsDisplay(scrollRect);
651ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
652ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
65365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebCore::IntSize WebView::viewSize()
65465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
65565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT clientRect;
65665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GetClientRect(m_window, &clientRect);
65765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return IntRect(clientRect).size();
65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
66065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
66165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::isViewWindowActive()
66265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
66365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HWND activeWindow = ::GetActiveWindow();
66465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return (activeWindow && m_topLevelParentWindow == findTopLevelParentWindow(activeWindow));
66565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
66665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
66765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::isViewFocused()
66865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
66965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ::GetFocus() == m_window;
67065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
67165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
67265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::isViewVisible()
67365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
67465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_isVisible;
67565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
67665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
67765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::isViewInWindow()
67865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
67965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_isInWindow;
68065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
68165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6822fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::pageClosed()
6832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
68665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::processDidCrash()
68765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
68865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateNativeCursor();
68965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::InvalidateRect(m_window, 0, TRUE);
69065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
69165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
69265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::didRelaunchProcess()
69365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
69465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateNativeCursor();
69565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::InvalidateRect(m_window, 0, TRUE);
69665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
69765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
69865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::takeFocus(bool)
69965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
70065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
70165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::toolTipChanged(const String&, const String& newToolTip)
70365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
70465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_toolTipWindow)
70565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
70665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!newToolTip.isEmpty()) {
70865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // This is necessary because String::charactersWithNullTermination() is not const.
70965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        String toolTip = newToolTip;
71065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        TOOLINFO info = {0};
71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        info.cbSize = sizeof(info);
71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        info.uFlags = TTF_IDISHWND;
71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        info.uId = reinterpret_cast<UINT_PTR>(m_window);
71565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        info.lpszText = const_cast<UChar*>(toolTip.charactersWithNullTermination());
71665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::SendMessage(m_toolTipWindow, TTM_UPDATETIPTEXT, 0, reinterpret_cast<LPARAM>(&info));
71765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
71865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SendMessage(m_toolTipWindow, TTM_ACTIVATE, !newToolTip.isEmpty(), 0);
72065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
72165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochHCURSOR WebView::cursorToShow() const
72365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
72465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page->isValid())
72565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We only show the override cursor if the default (arrow) cursor is showing.
72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static HCURSOR arrowCursor = ::LoadCursor(0, IDC_ARROW);
72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_overrideCursor && m_webCoreCursor == arrowCursor)
73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return m_overrideCursor;
73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_webCoreCursor;
73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
73465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::updateNativeCursor()
73665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
73765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_lastCursorSet = cursorToShow();
73865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_lastCursorSet)
73965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
74065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetCursor(m_lastCursorSet);
74165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
74265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
74365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setCursor(const WebCore::Cursor& cursor)
74465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
74565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!cursor.platformCursor()->nativeCursor())
74665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
74765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webCoreCursor = cursor.platformCursor()->nativeCursor();
74865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateNativeCursor();
74965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
75065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setOverrideCursor(HCURSOR overrideCursor)
75265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
75365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_overrideCursor = overrideCursor;
75465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    updateNativeCursor();
75565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
75665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setInitialFocus(bool forward)
75865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
75965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->setInitialFocus(forward);
76065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
76165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setViewportArguments(const WebCore::ViewportArguments&)
76365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
76465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
76565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo)
76765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
76865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
76965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::clearAllEditCommands()
77165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
77265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
77365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setEditCommandState(const String&, bool, int)
77565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
77665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
77765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochFloatRect WebView::convertToDeviceSpace(const FloatRect& rect)
77965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
78065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return rect;
78165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
78265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochFloatRect WebView::convertToUserSpace(const FloatRect& rect)
78465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
78565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return rect;
78665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
78765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochHIMC WebView::getIMMContext()
78965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
79065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return Ime::ImmGetContext(m_window);
79165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::prepareCandidateWindow(HIMC hInputContext)
79465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
79565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect caret = m_page->firstRectForCharacterInSelectedRange(0);
79665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CANDIDATEFORM form;
79765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.dwIndex = 0;
79865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.dwStyle = CFS_EXCLUDE;
79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.ptCurrentPos.x = caret.x();
8002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    form.ptCurrentPos.y = caret.maxY();
80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.rcArea.top = caret.y();
8022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    form.rcArea.bottom = caret.maxY();
80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    form.rcArea.left = caret.x();
8042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    form.rcArea.right = caret.maxX();
80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmSetCandidateWindow(hInputContext, &form);
80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::resetIME()
80965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
81065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HIMC hInputContext = getIMMContext();
81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!hInputContext)
81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmNotifyIME(hInputContext, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
81465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmReleaseContext(m_window, hInputContext);
81565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
81665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setInputMethodState(bool enabled)
81865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
81965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmAssociateContextEx(m_window, 0, enabled ? IACE_DEFAULT : 0);
82065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
82165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::compositionSelectionChanged(bool hasChanged)
82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_page->selectionState().hasComposition && !hasChanged)
82565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        resetIME();
82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
82765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMEStartComposition()
82965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
83065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMEStartComposition");
83165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_inIMEComposition++;
83265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HIMC hInputContext = getIMMContext();
83465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!hInputContext)
83565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
83665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    prepareCandidateWindow(hInputContext);
83765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmReleaseContext(m_window, hInputContext);
83865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
83965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
84065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool getCompositionString(HIMC hInputContext, DWORD type, String& result)
84265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
84365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LONG compositionLength = Ime::ImmGetCompositionStringW(hInputContext, type, 0, 0);
84465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (compositionLength <= 0)
84565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
84665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<UChar> compositionBuffer(compositionLength / 2);
84765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    compositionLength = Ime::ImmGetCompositionStringW(hInputContext, type, compositionBuffer.data(), compositionLength);
84865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    result = String::adopt(compositionBuffer);
84965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
85065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
85165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void compositionToUnderlines(const Vector<DWORD>& clauses, const Vector<BYTE>& attributes, Vector<CompositionUnderline>& underlines)
85365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
85465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (clauses.isEmpty()) {
85565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines.clear();
85665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
85765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
85865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    size_t numBoundaries = clauses.size() - 1;
86065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    underlines.resize(numBoundaries);
86165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (unsigned i = 0; i < numBoundaries; ++i) {
86265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines[i].startOffset = clauses[i];
86365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines[i].endOffset = clauses[i + 1];
86465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        BYTE attribute = attributes[clauses[i]];
86565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines[i].thick = attribute == ATTR_TARGET_CONVERTED || attribute == ATTR_TARGET_NOTCONVERTED;
86665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        underlines[i].color = Color::black;
86765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
86865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
86965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
87065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !LOG_DISABLED
87165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define APPEND_ARGUMENT_NAME(name) \
87265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (lparam & name) { \
87365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (needsComma) \
87465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result += ", "; \
87565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result += #name; \
87665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        needsComma = true; \
87765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
87865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
87965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic String imeCompositionArgumentNames(LPARAM lparam)
88065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
88165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String result;
88265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool needsComma = false;
88365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
88465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPATTR);
88565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPCLAUSE);
88665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPREADSTR);
88765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPREADATTR);
88865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPREADCLAUSE);
88965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_COMPSTR);
89065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_CURSORPOS);
89165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_DELTASTART);
89265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_RESULTCLAUSE);
89365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_RESULTREADCLAUSE);
89465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_RESULTREADSTR);
89565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(GCS_RESULTSTR);
89665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(CS_INSERTCHAR);
89765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    APPEND_ARGUMENT_NAME(CS_NOMOVECARET);
89865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
89965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return result;
90065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
90165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
90265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic String imeRequestName(WPARAM wparam)
90365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
90465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (wparam) {
90565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_CANDIDATEWINDOW:
90665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_CANDIDATEWINDOW";
90765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_COMPOSITIONFONT:
90865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_COMPOSITIONFONT";
90965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_COMPOSITIONWINDOW:
91065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_COMPOSITIONWINDOW";
91165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_CONFIRMRECONVERTSTRING:
91265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_CONFIRMRECONVERTSTRING";
91365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_DOCUMENTFEED:
91465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_DOCUMENTFEED";
91565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_QUERYCHARPOSITION:
91665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_QUERYCHARPOSITION";
91765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case IMR_RECONVERTSTRING:
91865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "IMR_RECONVERTSTRING";
91965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
92065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return "Unknown (" + String::number(wparam) + ")";
92165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
92265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
92365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
92465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
92565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMEComposition(LPARAM lparam)
92665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
92765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMEComposition %s", imeCompositionArgumentNames(lparam).latin1().data());
92865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HIMC hInputContext = getIMMContext();
92965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!hInputContext)
93065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
93165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
93265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page->selectionState().isContentEditable)
93365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
93465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
93565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    prepareCandidateWindow(hInputContext);
93665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
93765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (lparam & GCS_RESULTSTR || !lparam) {
93865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        String compositionString;
93965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!getCompositionString(hInputContext, GCS_RESULTSTR, compositionString) && lparam)
94065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return true;
94165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
94265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_page->confirmComposition(compositionString);
94365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
94465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
94565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
94665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String compositionString;
94765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!getCompositionString(hInputContext, GCS_COMPSTR, compositionString))
94865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
94965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
95065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Composition string attributes
95165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int numAttributes = Ime::ImmGetCompositionStringW(hInputContext, GCS_COMPATTR, 0, 0);
95265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<BYTE> attributes(numAttributes);
95365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmGetCompositionStringW(hInputContext, GCS_COMPATTR, attributes.data(), numAttributes);
95465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
95565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Get clauses
95665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int numBytes = Ime::ImmGetCompositionStringW(hInputContext, GCS_COMPCLAUSE, 0, 0);
95765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<DWORD> clauses(numBytes / sizeof(DWORD));
95865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Ime::ImmGetCompositionStringW(hInputContext, GCS_COMPCLAUSE, clauses.data(), numBytes);
95965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<CompositionUnderline> underlines;
96165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    compositionToUnderlines(clauses, attributes, underlines);
96265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int cursorPosition = LOWORD(Ime::ImmGetCompositionStringW(hInputContext, GCS_CURSORPOS, 0, 0));
96465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->setComposition(compositionString, underlines, cursorPosition);
96665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
96865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
96965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
97065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMEEndComposition()
97165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
97265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMEEndComposition");
97365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If the composition hasn't been confirmed yet, it needs to be cancelled.
97465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This happens after deleting the last character from inline input hole.
97565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_page->selectionState().hasComposition)
97665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_page->confirmComposition(String());
97765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
97865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_inIMEComposition)
97965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_inIMEComposition--;
98065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
98165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
98265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
98365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
98465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onIMERequestCharPosition(IMECHARPOSITION* charPos)
98565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
98665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (charPos->dwCharPos && !m_page->selectionState().hasComposition)
98765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
98865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect caret = m_page->firstRectForCharacterInSelectedRange(charPos->dwCharPos);
98965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    charPos->pt.x = caret.x();
99065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    charPos->pt.y = caret.y();
99165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::ClientToScreen(m_window, &charPos->pt);
99265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    charPos->cLineHeight = caret.height();
99365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::GetWindowRect(m_window, &charPos->rcDocument);
99465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
99565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
99665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
99765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onIMERequestReconvertString(RECONVERTSTRING* reconvertString)
99865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
99965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String text = m_page->getSelectedText();
100065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned totalSize = sizeof(RECONVERTSTRING) + text.length() * sizeof(UChar);
100165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
100265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!reconvertString)
100365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return totalSize;
100465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
100565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (totalSize > reconvertString->dwSize)
100665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
100765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reconvertString->dwCompStrLen = text.length();
100865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reconvertString->dwStrLen = text.length();
100965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reconvertString->dwTargetStrLen = text.length();
101065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    reconvertString->dwStrOffset = sizeof(RECONVERTSTRING);
101165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memcpy(reconvertString + 1, text.characters(), text.length() * sizeof(UChar));
101265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return totalSize;
101365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
101465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
101565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebView::onIMERequest(WPARAM request, LPARAM data)
101665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
101765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMERequest %s", imeRequestName(request).latin1().data());
101865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page->selectionState().isContentEditable)
101965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
102065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
102165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (request) {
10222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case IMR_RECONVERTSTRING:
10232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return onIMERequestReconvertString(reinterpret_cast<RECONVERTSTRING*>(data));
102465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case IMR_QUERYCHARPOSITION:
10262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return onIMERequestCharPosition(reinterpret_cast<IMECHARPOSITION*>(data));
102765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
102865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
102965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
103065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
103165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMESelect(WPARAM wparam, LPARAM lparam)
103265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
103365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UNUSED_PARAM(wparam);
103465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UNUSED_PARAM(lparam);
103565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMESelect locale %ld %s", lparam, wparam ? "select" : "deselect");
103665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
103765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
103865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
103965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebView::onIMESetContext(WPARAM wparam, LPARAM)
104065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
104165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "onIMESetContext %s", wparam ? "active" : "inactive");
104265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
104365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
104465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::doneWithKeyEvent(const NativeWebKeyboardEvent& event, bool wasEventHandled)
104665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
104765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Calling ::DefWindowProcW will ensure that pressing the Alt key will generate a WM_SYSCOMMAND
104865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // event, e.g. See <http://webkit.org/b/47671>.
10492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!wasEventHandled)
10502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::DefWindowProcW(event.nativeEvent()->hwnd, event.nativeEvent()->message, event.nativeEvent()->wParam, event.nativeEvent()->lParam);
105165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
105265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
105365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebPopupMenuProxy> WebView::createPopupMenuProxy(WebPageProxy* page)
105465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
105565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return WebPopupMenuProxyWin::create(this, page);
105665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
105765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
105865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebContextMenuProxy> WebView::createContextMenuProxy(WebPageProxy* page)
105965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
106065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return WebContextMenuProxyWin::create(m_window, page);
106165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
106265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10632fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::setFindIndicator(PassRefPtr<FindIndicator> prpFindIndicator, bool fadeOut)
106465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_findIndicatorCallback)
10662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
10672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    HBITMAP hbmp = 0;
10692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntRect selectionRect;
10702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (RefPtr<FindIndicator> findIndicator = prpFindIndicator) {
10722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (ShareableBitmap* contentImage = findIndicator->contentImage()) {
10732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            // Render the contentImage to an HBITMAP.
10742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            void* bits;
10752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            HDC hdc = ::CreateCompatibleDC(0);
10762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            int width = contentImage->bounds().width();
10772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            int height = contentImage->bounds().height();
10782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            BitmapInfo bitmapInfo = BitmapInfo::create(contentImage->size());
10792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            hbmp = CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, static_cast<void**>(&bits), 0, 0);
10812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            HBITMAP hbmpOld = static_cast<HBITMAP>(SelectObject(hdc, hbmp));
10822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            RetainPtr<CGContextRef> context(AdoptCF, CGBitmapContextCreate(bits, width, height,
10832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                8, width * sizeof(RGBQUAD), deviceRGBColorSpaceRef(), kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst));
10842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            GraphicsContext graphicsContext(context.get());
10862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            contentImage->paint(graphicsContext, IntPoint(), contentImage->bounds());
10872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ::SelectObject(hdc, hbmpOld);
10892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ::DeleteDC(hdc);
10902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
10912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        selectionRect = IntRect(findIndicator->selectionRectInWindowCoordinates());
10932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
10942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The callback is responsible for calling ::DeleteObject(hbmp).
10962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    (*m_findIndicatorCallback)(toAPI(this), hbmp, selectionRect, fadeOut, m_findIndicatorCallbackContext);
10972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
10982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10992fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::setFindIndicatorCallback(WKViewFindIndicatorCallback callback, void* context)
11002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_findIndicatorCallback = callback;
11022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_findIndicatorCallbackContext = context;
11032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11052fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWKViewFindIndicatorCallback WebView::getFindIndicatorCallback(void** context)
11062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (context)
11082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *context = m_findIndicatorCallbackContext;
11092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_findIndicatorCallback;
111165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
111265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
111365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::didCommitLoadForMainFrame(bool useCustomRepresentation)
111465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
111565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
111665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
111765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::didFinishLoadingDataForCustomRepresentation(const CoreIPC::DataReference&)
111865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
111965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
112065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
112165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochdouble WebView::customRepresentationZoomFactor()
112265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
112365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 1;
112465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
112565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
112665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setCustomRepresentationZoomFactor(double)
112765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
112865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
112965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11302fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::didChangeScrollbarsForMainFrame() const
11312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
113465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::setIsInWindow(bool isInWindow)
113565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
113665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_isInWindow = isInWindow;
113765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->viewStateDidChange(WebPageProxy::ViewIsInWindow);
113865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
113965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
114065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
114165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11422fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::enterAcceleratedCompositingMode(const LayerTreeContext&)
11432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(useNewDrawingArea());
11452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Implement.
11462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_NOT_REACHED();
11472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11492fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WebView::exitAcceleratedCompositingMode()
11502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(useNewDrawingArea());
11522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Implement.
11532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_NOT_REACHED();
11542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
115665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::pageDidEnterAcceleratedCompositing()
115765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!useNewDrawingArea());
115965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switchToDrawingAreaTypeIfNecessary(DrawingAreaInfo::LayerBacked);
116065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
116165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
116265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::pageDidLeaveAcceleratedCompositing()
116365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!useNewDrawingArea());
116565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switchToDrawingAreaTypeIfNecessary(DrawingAreaInfo::ChunkedUpdate);
116665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
116765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
116865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::switchToDrawingAreaTypeIfNecessary(DrawingAreaInfo::Type type)
116965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!useNewDrawingArea());
11712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
117265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DrawingAreaInfo::Type existingDrawingAreaType = m_page->drawingArea() ? m_page->drawingArea()->info().type : DrawingAreaInfo::None;
117365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (existingDrawingAreaType == type)
117465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
117565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
117665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<DrawingAreaProxy> newDrawingArea;
117765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (type) {
11782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case DrawingAreaInfo::Impl:
11792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case DrawingAreaInfo::None:
11802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
11812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case DrawingAreaInfo::ChunkedUpdate:
11822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        newDrawingArea = ChunkedUpdateDrawingAreaProxy::create(this, m_page.get());
11832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
11842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case DrawingAreaInfo::LayerBacked:
11852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        newDrawingArea = LayerBackedDrawingAreaProxy::create(this, m_page.get());
11862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
118765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
118865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
118965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_page->drawingArea())
11902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        newDrawingArea->setSize(m_page->drawingArea()->size(), IntSize());
119165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
119265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->drawingArea()->detachCompositingContext();
119365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->setDrawingArea(newDrawingArea.release());
119465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
119565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
119665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // USE(ACCELERATED_COMPOSITING)
119765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
119865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochHWND WebView::nativeWindow()
119965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
120065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_window;
120165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
120265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
120365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// WebCore::WindowMessageListener
120465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
120565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebView::windowReceivedMessage(HWND, UINT message, WPARAM wParam, LPARAM)
120665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
120765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (message) {
12082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_NCACTIVATE:
12092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        updateActiveStateSoon();
12102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
12112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case WM_SETTINGCHANGE:
12122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // systemParameterChanged(wParam);
12132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        break;
121465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
121565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
121665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12172fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::QueryInterface(REFIID riid, void** ppvObject)
12182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    *ppvObject = 0;
12202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (IsEqualGUID(riid, IID_IUnknown))
12212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *ppvObject = static_cast<IUnknown*>(this);
12222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (IsEqualGUID(riid, IID_IDropTarget))
12232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *ppvObject = static_cast<IDropTarget*>(this);
12242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
12252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return E_NOINTERFACE;
12262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    AddRef();
12282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
12292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12312fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockULONG STDMETHODCALLTYPE WebView::AddRef(void)
12322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ref();
12342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return refCount();
12352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12372fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockULONG STDMETHODCALLTYPE WebView::Release(void)
12382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    deref();
12402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return refCount();
12412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12432fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic DWORD dragOperationToDragCursor(DragOperation op)
12442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DWORD res = DROPEFFECT_NONE;
12462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (op & DragOperationCopy)
12472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        res = DROPEFFECT_COPY;
12482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (op & DragOperationLink)
12492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        res = DROPEFFECT_LINK;
12502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (op & DragOperationMove)
12512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        res = DROPEFFECT_MOVE;
12522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (op & DragOperationGeneric)
12532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        res = DROPEFFECT_MOVE; // This appears to be the Firefox behaviour
12542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return res;
12552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12572fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebCore::DragOperation WebView::keyStateToDragOperation(DWORD grfKeyState) const
12582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_page)
12602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return DragOperationNone;
12612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Conforms to Microsoft's key combinations as documented for
12632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // IDropTarget::DragOver. Note, grfKeyState is the current
12642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // state of the keyboard modifier keys on the keyboard. See:
12652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // <http://msdn.microsoft.com/en-us/library/ms680129(VS.85).aspx>.
12662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DragOperation operation = m_page->dragOperation();
12672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if ((grfKeyState & (MK_CONTROL | MK_SHIFT)) == (MK_CONTROL | MK_SHIFT))
12692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        operation = DragOperationLink;
12702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if ((grfKeyState & MK_CONTROL) == MK_CONTROL)
12712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        operation = DragOperationCopy;
12722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if ((grfKeyState & MK_SHIFT) == MK_SHIFT)
12732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        operation = DragOperationGeneric;
12742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return operation;
12762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12782fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
12792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_dragData = 0;
12812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_page->resetDragOperation();
12822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dropTargetHelper)
12842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dropTargetHelper->DragEnter(m_window, pDataObject, (POINT*)&pt, *pdwEffect);
12852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    POINTL localpt = pt;
12872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::ScreenToClient(m_window, (LPPOINT)&localpt);
12882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DragData data(pDataObject, IntPoint(localpt.x, localpt.y), IntPoint(pt.x, pt.y), keyStateToDragOperation(grfKeyState));
12892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_page->performDragControllerAction(DragControllerActionEntered, &data);
12902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    *pdwEffect = dragOperationToDragCursor(m_page->dragOperation());
12912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_lastDropEffect = *pdwEffect;
12932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_dragData = pDataObject;
12942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
12962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
12972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12982fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
12992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
13002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dropTargetHelper)
13012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dropTargetHelper->DragOver((POINT*)&pt, *pdwEffect);
13022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dragData) {
13042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        POINTL localpt = pt;
13052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::ScreenToClient(m_window, (LPPOINT)&localpt);
13062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        DragData data(m_dragData.get(), IntPoint(localpt.x, localpt.y), IntPoint(pt.x, pt.y), keyStateToDragOperation(grfKeyState));
13072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->performDragControllerAction(DragControllerActionUpdated, &data);
13082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *pdwEffect = dragOperationToDragCursor(m_page->dragOperation());
13092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else
13102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        *pdwEffect = DROPEFFECT_NONE;
13112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_lastDropEffect = *pdwEffect;
13132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
13142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
13152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13162fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::DragLeave()
13172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
13182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dropTargetHelper)
13192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dropTargetHelper->DragLeave();
13202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dragData) {
13222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        DragData data(m_dragData.get(), IntPoint(), IntPoint(), DragOperationNone);
13232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->performDragControllerAction(DragControllerActionExited, &data);
13242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dragData = 0;
13252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_page->resetDragOperation();
13262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
13272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
13282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
13292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13302fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockHRESULT STDMETHODCALLTYPE WebView::Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
13312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
13322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_dropTargetHelper)
13332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_dropTargetHelper->Drop(pDataObject, (POINT*)&pt, *pdwEffect);
13342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_dragData = 0;
13362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    *pdwEffect = m_lastDropEffect;
13372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    POINTL localpt = pt;
13382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::ScreenToClient(m_window, (LPPOINT)&localpt);
13392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DragData data(pDataObject, IntPoint(localpt.x, localpt.y), IntPoint(pt.x, pt.y), keyStateToDragOperation(grfKeyState));
13402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_page->performDragControllerAction(DragControllerActionPerformDrag, &data);
13412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return S_OK;
13422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
13432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
134465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
1345