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