1f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch/*
2f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple, Inc.  All rights reserved.
3f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
4f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *
5f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Redistribution and use in source and binary forms, with or without
6f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * modification, are permitted provided that the following conditions
7f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * are met:
8f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 1. Redistributions of source code must retain the above copyright
9f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *    notice, this list of conditions and the following disclaimer.
10f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright
11f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *    notice, this list of conditions and the following disclaimer in the
12f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *    documentation and/or other materials provided with the distribution.
13f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *
14f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch */
25f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
26f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "config.h"
27f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "WebView.h"
28f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
29f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ChromeClientWinCE.h"
30f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ContextMenuClientWinCE.h"
31f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "DragClientWinCE.h"
32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "EditorClientWinCE.h"
33f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "FocusController.h"
34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Frame.h"
35f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "FrameLoader.h"
36f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "FrameLoaderClientWinCE.h"
37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "FrameView.h"
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "GraphicsContext.h"
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "InitializeThreading.h"
40f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "InspectorClientWinCE.h"
41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "IntSize.h"
42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "MainThread.h"
43f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "NotImplemented.h"
44f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Page.h"
45f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "PlatformKeyboardEvent.h"
46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "PlatformMouseEvent.h"
47f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "PlatformStrategiesWinCE.h"
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "PlatformWheelEvent.h"
49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ResourceRequest.h"
50f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Settings.h"
51f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "SharedBuffer.h"
52f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "WebCoreInstanceHandle.h"
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochusing namespace WebCore;
55f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochconst LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass";
57f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
58f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
59f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochLRESULT CALLBACK WebView::webViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
60f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (WebView* webView = reinterpret_cast<WebView*>(GetWindowLong(hWnd, 0)))
62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return webView->wndProc(hWnd, message, wParam, lParam);
63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return DefWindowProc(hWnd, message, wParam, lParam);
65f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
67f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPassRefPtr<SharedBuffer> loadResourceIntoBuffer(const char* name)
68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    notImplemented();
70f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return 0;
71f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
72f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
73f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
74f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochWebView::WebView(HWND hwnd, unsigned features)
75f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    : m_frame(0)
76f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    , m_page(0)
77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    , m_parentWindowHandle(hwnd)
78f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    , m_enableDoubleBuffer(features & EnableDoubleBuffering)
79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RECT rcClient;
81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    GetClientRect(hwnd, &rcClient);
82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_windowHandle = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD,
84f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hwnd, 0, WebCore::instanceHandle(), 0);
85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SetWindowLong(m_windowHandle, 0, reinterpret_cast<LONG>(this));
87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    MoveWindow(m_windowHandle, 0, 0, rcClient.right, rcClient.bottom, TRUE);
89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    ShowWindow(m_windowHandle, SW_SHOW);
90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
91f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Page::PageClients pageClients;
92f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    pageClients.chromeClient = new WebKit::ChromeClientWinCE(this);
93f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    pageClients.contextMenuClient = new WebKit::ContextMenuClientWinCE(this);
94f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    pageClients.editorClient = new WebKit::EditorClientWinCE(this);
95f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    pageClients.dragClient = new WebKit::DragClientWinCE();
96f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    pageClients.inspectorClient = new WebKit::InspectorClientWinCE(this);
97f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_page = new Page(pageClients);
98f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
99f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Settings* settings = m_page->settings();
100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    settings->setDefaultFixedFontSize(14);
101f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    settings->setDefaultFontSize(14);
102f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    settings->setMinimumFontSize(8);
103f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    settings->setMinimumLogicalFontSize(8);
104f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    settings->setJavaScriptEnabled(true);
105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    settings->setLoadsImagesAutomatically(true);
106f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
107f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WebKit::FrameLoaderClientWinCE* loaderClient = new WebKit::FrameLoaderClientWinCE(this);
108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<Frame> frame = Frame::create(m_page, 0, loaderClient);
109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_frame = frame.get();
110f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    loaderClient->setFrame(m_frame);
111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_page->mainFrame()->init();
113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (view()) {
115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        RECT windowRect;
116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        frameRect(&windowRect);
117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        view()->resize(IntRect(windowRect).size());
118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
121f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochWebView::~WebView()
122f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
123f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    delete m_page;
124f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DestroyWindow(m_windowHandle);
125f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
126f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
127f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::initialize(HINSTANCE instanceHandle)
128f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
129f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    JSC::initializeThreading();
130f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WTF::initializeMainThread();
131f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PlatformStrategiesWinCE::initialize();
132f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
133f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WebCore::setInstanceHandle(instanceHandle);
134f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
135f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WNDCLASS wc;
136f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.style          = CS_DBLCLKS;
137f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.lpfnWndProc    = WebView::webViewWndProc;
138f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.cbClsExtra     = 0;
139f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.cbWndExtra     = sizeof(void *);
140f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.hInstance      = instanceHandle;
141f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.hIcon          = 0;
142f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.hCursor        = LoadCursor(0, IDC_ARROW);
143f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.hbrBackground  = 0;
144f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.lpszMenuName   = 0;
145f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    wc.lpszClassName  = kWebViewWindowClassName;
146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
147f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RegisterClass(&wc);
148f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::cleanup()
151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
152f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    UnregisterClass(kWebViewWindowClassName, WebCore::instanceHandle());
153f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
154f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
155f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPassRefPtr<Frame> WebView::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement, const String& referrer,
156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                       bool /*allowsScrolling*/, int /*marginWidth*/, int /*marginHeight*/)
157f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
158f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Frame* coreFrame = m_frame;
159f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
160f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WebKit::FrameLoaderClientWinCE *loaderClient = new WebKit::FrameLoaderClientWinCE(this);
161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<Frame> childFrame = Frame::create(m_page, ownerElement, loaderClient);
162f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    loaderClient->setFrame(childFrame.get());
163f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
164f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    coreFrame->tree()->appendChild(childFrame);
165f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    childFrame->tree()->setName(name);
166f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    childFrame->init();
167f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
168f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // The creation of the frame may have run arbitrary JavaScript that removed it from the page already.
169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!childFrame->page())
170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return 0;
171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    coreFrame->loader()->loadURLIntoChildFrame(url, referrer, childFrame.get());
173f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
174f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // The frame's onload handler may have removed it from the document.
175f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!childFrame->tree()->parent())
176f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return 0;
177f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return childFrame.release();
179f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
180f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
181f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::runJavaScriptAlert(const String& message)
182f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
183f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    notImplemented();
184f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
185f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
186f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::runJavaScriptConfirm(const String& message)
187f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
188f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    notImplemented();
189f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return false;
190f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
191f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
192f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::runJavaScriptPrompt(const String& message, const String& defaultValue, String& result)
193f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
194f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    notImplemented();
195f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return false;
196f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
197f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
198f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::frameRect(RECT* rect) const
199f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
200f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    GetWindowRect(m_windowHandle, rect);
201f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
202f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
203f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochFrameView* WebView::view() const
204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
205f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return m_frame ? m_frame->view() : 0;
206f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
207f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
208f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::load(LPCWSTR url)
209f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
210f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    load(String(url));
211f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
212f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
213f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::load(const String &url)
214f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
215f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    load(WebCore::ResourceRequest(url));
216f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
217f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
218f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::load(const WebCore::ResourceRequest &request)
219f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
220f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    frame()->loader()->load(request, false);
221f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
222f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
223f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::reload()
224f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
225f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    frame()->loader()->reload();
226f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
227f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
228f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::stop()
229f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
230f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    frame()->loader()->stopAllLoaders();
231f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
232f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
233f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid WebView::paint(HDC hDC, const IntRect& clipRect)
234f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
2352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    FrameView* frameView = view();
2362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!frameView)
2372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    OwnPtr<HRGN> clipRgn(CreateRectRgn(clipRect.x(), clipRect.y(), clipRect.maxX(), clipRect.maxY()));
240f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SelectClipRgn(hDC, clipRgn.get());
241f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    frameView->updateLayoutAndStyleIfNeededRecursive();
2432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
244f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    GraphicsContext gc(hDC);
2452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    frameView->paint(&gc, clipRect);
246f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
248f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handlePaint(HWND hWnd)
249f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
250f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RECT updateRect;
251f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!GetUpdateRect(hWnd, &updateRect, false))
252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return false;
253f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
254f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PAINTSTRUCT ps;
255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    HDC hDC = BeginPaint(m_windowHandle, &ps);
256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
257f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    IntRect clipRect(updateRect);
258f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
259f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (m_enableDoubleBuffer) {
260f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!m_doubleBufferDC) {
261f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            RECT rcClient;
262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            GetClientRect(m_windowHandle, &rcClient);
263f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
264f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            m_doubleBufferDC = adoptPtr(CreateCompatibleDC(hDC));
265f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            m_doubleBufferBitmap = adoptPtr(CreateCompatibleBitmap(hDC, rcClient.right, rcClient.bottom));
266f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            SelectObject(m_doubleBufferDC.get(), m_doubleBufferBitmap.get());
267f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
268f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
269f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        paint(m_doubleBufferDC.get(), clipRect);
270f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        BitBlt(hDC, clipRect.x(), clipRect.y(), clipRect.width(), clipRect.height(), m_doubleBufferDC.get(), clipRect.x(), clipRect.y(), SRCCOPY);
272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    } else
273f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        paint(hDC, clipRect);
274f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    EndPaint(m_windowHandle, &ps);
276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return true;
277f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
278f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
279f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleMouseEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
280f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
281f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static LONG globalClickCount;
282f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static IntPoint globalPrevPoint;
283f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static MouseButton globalPrevButton;
284f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static LONG globalPrevMouseDownTime;
285f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
286f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Create our event.
287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // On WM_MOUSELEAVE we need to create a mouseout event, so we force the position
288f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // of the event to be at (MINSHORT, MINSHORT).
289f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PlatformMouseEvent mouseEvent(hWnd, message, wParam, lParam);
290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool insideThreshold = abs(globalPrevPoint.x() - mouseEvent.pos().x()) < ::GetSystemMetrics(SM_CXDOUBLECLK)
292f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                           && abs(globalPrevPoint.y() - mouseEvent.pos().y()) < ::GetSystemMetrics(SM_CYDOUBLECLK);
293f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    LONG messageTime = 0;
294f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
295f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool handled = false;
296f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (message == WM_LBUTTONDOWN || message == WM_MBUTTONDOWN || message == WM_RBUTTONDOWN) {
297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        // FIXME: I'm not sure if this is the "right" way to do this
298f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        // but without this call, we never become focused since we don't allow
299f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        // the default handling of mouse events.
300f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        SetFocus(m_windowHandle);
301f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
302f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        PlatformMouseEvent moveEvent(hWnd, WM_MOUSEMOVE, 0, lParam, false);
303f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        moveEvent.setClickCount(0);
304f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_page->mainFrame()->eventHandler()->handleMouseMoveEvent(moveEvent);
305f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
306f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        // Always start capturing events when the mouse goes down in our HWND.
307f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        SetCapture(m_windowHandle);
308f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
309f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (insideThreshold && mouseEvent.button() == globalPrevButton)
310f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            globalClickCount++;
311f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        else
312f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            // Reset the click count.
313f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            globalClickCount = 1;
314f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        globalPrevMouseDownTime = messageTime;
315f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        globalPrevButton = mouseEvent.button();
316f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        globalPrevPoint = mouseEvent.pos();
317f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
318f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        mouseEvent.setClickCount(globalClickCount);
319f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        handled = m_page->mainFrame()->eventHandler()->handleMousePressEvent(mouseEvent);
320f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    } else if (message == WM_LBUTTONDBLCLK || message == WM_MBUTTONDBLCLK || message == WM_RBUTTONDBLCLK) {
321f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        globalClickCount++;
322f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        mouseEvent.setClickCount(globalClickCount);
323f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        handled = m_page->mainFrame()->eventHandler()->handleMousePressEvent(mouseEvent);
324f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    } else if (message == WM_LBUTTONUP || message == WM_MBUTTONUP || message == WM_RBUTTONUP) {
325f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        // Record the global position and the button of the up.
326f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        globalPrevButton = mouseEvent.button();
327f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        globalPrevPoint = mouseEvent.pos();
328f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        mouseEvent.setClickCount(globalClickCount);
329f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_page->mainFrame()->eventHandler()->handleMouseReleaseEvent(mouseEvent);
330f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        ReleaseCapture();
331f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    } else if (message == WM_MOUSEMOVE) {
332f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!insideThreshold)
333f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            globalClickCount = 0;
334f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        mouseEvent.setClickCount(globalClickCount);
335f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        handled = m_page->mainFrame()->eventHandler()->mouseMoved(mouseEvent);
336f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
337f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
338f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return handled;
339f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
340f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
341f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam, bool isHorizontal)
342f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
343f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PlatformWheelEvent wheelEvent(hWnd, wParam, lParam, isHorizontal);
344f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return frame()->eventHandler()->handleWheelEvent(wheelEvent);
345f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
346f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
347f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleKeyDown(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown)
348f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
349f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Frame* frame = m_page->focusController()->focusedOrMainFrame();
350f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
351f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PlatformKeyboardEvent keyEvent(m_windowHandle, virtualKeyCode, keyData, PlatformKeyboardEvent::RawKeyDown, systemKeyDown);
352f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool handled = frame->eventHandler()->keyEvent(keyEvent);
353f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
354f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // These events cannot be canceled, and we have no default handling for them.
355f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // FIXME: match IE list more closely, see <http://msdn2.microsoft.com/en-us/library/ms536938.aspx>.
356f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (systemKeyDown && virtualKeyCode != VK_RETURN)
357f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return false;
358f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
359f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (handled) {
360f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        MSG msg;
361f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!systemKeyDown)
362f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            ::PeekMessage(&msg, m_windowHandle, WM_CHAR, WM_CHAR, PM_REMOVE);
363f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return true;
364f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
365f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
366f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return handled;
367f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
368f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
369f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleKeyPress(WPARAM charCode, LPARAM keyData, bool systemKeyDown)
370f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
371f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Frame* frame = m_page->focusController()->focusedOrMainFrame();
372f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
373f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PlatformKeyboardEvent keyEvent(m_windowHandle, charCode, keyData, PlatformKeyboardEvent::Char, systemKeyDown);
374f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // IE does not dispatch keypress event for WM_SYSCHAR.
375f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (systemKeyDown)
376f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return frame->eventHandler()->handleAccessKey(keyEvent);
377f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (frame->eventHandler()->keyEvent(keyEvent))
378f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return true;
379f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
380f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return false;
381f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
382f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
383f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool WebView::handleKeyUp(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown)
384f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
385f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PlatformKeyboardEvent keyEvent(m_windowHandle, virtualKeyCode, keyData, PlatformKeyboardEvent::KeyUp, systemKeyDown);
386f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
387f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Frame* frame = m_page->focusController()->focusedOrMainFrame();
388f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return frame->eventHandler()->keyEvent(keyEvent);
389f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
390f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
391f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochLRESULT WebView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
392f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
393f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool handled = false;
394f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
395f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (view()) {
396f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        switch (message) {
397f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_PAINT:
398f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            handled = handlePaint(hWnd);
399f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
400f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
401f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_MOUSEMOVE:
402f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_LBUTTONDOWN:
403f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_MBUTTONDOWN:
404f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_RBUTTONDOWN:
405f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_LBUTTONDBLCLK:
406f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_MBUTTONDBLCLK:
407f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_RBUTTONDBLCLK:
408f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_LBUTTONUP:
409f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_MBUTTONUP:
410f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_RBUTTONUP:
411f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (frame()->eventHandler() && view()->didFirstLayout())
412f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                handled = handleMouseEvent(hWnd, message, wParam, lParam);
413f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
414f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
415f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_MOUSEWHEEL:
416f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (frame()->eventHandler() && view()->didFirstLayout())
417f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                handled = handleMouseWheel(hWnd, wParam, lParam, wParam & MK_SHIFT);
418f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
419f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
420f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_SYSKEYDOWN:
421f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            handled = handleKeyDown(wParam, lParam, true);
422f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
423f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
424f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_KEYDOWN:
425f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            handled = handleKeyDown(wParam, lParam, false);
426f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
427f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
428f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_SYSKEYUP:
429f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            handled = handleKeyUp(wParam, lParam, true);
430f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
432f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_KEYUP:
433f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            handled = handleKeyUp(wParam, lParam, false);
434f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
435f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_SYSCHAR:
437f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            handled = handleKeyPress(wParam, lParam, true);
438f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
439f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
440f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_CHAR:
441f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            handled = handleKeyPress(wParam, lParam, false);
442f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
443f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
444f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case WM_CLOSE:
445f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            PostMessage(m_parentWindowHandle, WM_CLOSE, wParam, lParam);
446f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            handled = true;
447f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
448f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
449f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        default:
450f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            break;
451f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
452f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
453f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
454f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (handled)
455f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return 0;
456f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
457f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return DefWindowProc(hWnd, message, wParam, lParam);
458f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
459