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