blob: 405d1b209d944e229887faaf2043ee1878f3c820 [file] [log] [blame]
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +00001/*
2 * Copyright (C) 2006, 2008 Apple Computer, Inc. All rights reserved.
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +00003 * Copyright (C) 2009, 2011 Brent Fulgham. All rights reserved.
4 * Copyright (C) 2009, 2010, 2011 Appcelerator, Inc. All rights reserved.
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +00005 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "stdafx.h"
29#include "WinLauncher.h"
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000030
bfulgham@webkit.org5e0d6222011-06-17 18:00:59 +000031#include "DOMDefaultImpl.h"
32#include "PrintWebUIDelegate.h"
33#include <WebKit/WebKitCOMAPI.h>
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +000034
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000035#include <commctrl.h>
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +000036#include <commdlg.h>
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000037#include <objbase.h>
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +000038#include <shellapi.h>
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000039#include <shlwapi.h>
bfulgham@webkit.org5e0d6222011-06-17 18:00:59 +000040#include <string>
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000041#include <wininet.h>
42
43#define MAX_LOADSTRING 100
44#define URLBAR_HEIGHT 24
45
46// Global Variables:
47HINSTANCE hInst; // current instance
48HWND hMainWnd;
49HWND hURLBarWnd;
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +000050WNDPROC DefEditProc = 0;
51WNDPROC DefWebKitProc = 0;
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000052IWebView* gWebView = 0;
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +000053IWebViewPrivate* gWebViewPrivate = 0;
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000054HWND gViewWindow = 0;
55WinLauncherWebHost* gWebHost = 0;
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +000056PrintWebUIDelegate* gPrintDelegate = 0;
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000057TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
58TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
59
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +000060// Support moving the transparent window
61POINT s_windowPosition = { 100, 100 };
62SIZE s_windowSize = { 800, 400 };
63bool s_usesLayeredWebView = false;
64bool s_fullDesktop = false;
65
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000066// Forward declarations of functions included in this code module:
67ATOM MyRegisterClass(HINSTANCE hInstance);
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +000068LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
69INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
70LRESULT CALLBACK MyEditProc(HWND, UINT, WPARAM, LPARAM);
71
72static void loadURL(BSTR urlBStr);
73
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +000074static bool usesLayeredWebView()
75{
76 return s_usesLayeredWebView;
77}
78
79static bool shouldUseFullDesktop()
80{
81 return s_fullDesktop;
82}
83
bfulgham@webkit.org5e0d6222011-06-17 18:00:59 +000084class SimpleEventListener : public DOMEventListener {
85public:
86 SimpleEventListener(LPWSTR type)
87 {
88 wcsncpy_s(m_eventType, 100, type, 100);
89 m_eventType[99] = 0;
90 }
91
92 virtual HRESULT STDMETHODCALLTYPE handleEvent(IDOMEvent* evt)
93 {
94 wchar_t message[255];
95 wcscpy_s(message, 255, m_eventType);
96 wcscat_s(message, 255, L" event fired!");
97 ::MessageBox(0, message, L"Event Handler", MB_OK);
98 return S_OK;
99 }
100
101private:
102 wchar_t m_eventType[100];
103};
104
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000105HRESULT WinLauncherWebHost::updateAddressBar(IWebView* webView)
106{
107 IWebFrame* mainFrame = 0;
108 IWebDataSource* dataSource = 0;
109 IWebMutableURLRequest* request = 0;
110 BSTR frameURL = 0;
111
112 HRESULT hr = S_OK;
113
114 hr = webView->mainFrame(&mainFrame);
115 if (FAILED(hr))
116 goto exit;
117
118 hr = mainFrame->dataSource(&dataSource);
119 if (FAILED(hr) || !dataSource)
120 hr = mainFrame->provisionalDataSource(&dataSource);
121 if (FAILED(hr) || !dataSource)
122 goto exit;
123
124 hr = dataSource->request(&request);
125 if (FAILED(hr) || !request)
126 goto exit;
127
128 hr = request->mainDocumentURL(&frameURL);
129 if (FAILED(hr))
130 goto exit;
131
132 SendMessage(hURLBarWnd, (UINT)WM_SETTEXT, 0, (LPARAM)frameURL);
133
134exit:
135 if (mainFrame)
136 mainFrame->Release();
137 if (dataSource)
138 dataSource->Release();
139 if (request)
140 request->Release();
141 SysFreeString(frameURL);
142 return 0;
143}
144
commit-queue@webkit.orgc7551612012-06-12 22:47:56 +0000145HRESULT STDMETHODCALLTYPE WinLauncherWebHost::didFailProvisionalLoadWithError(IWebView*, IWebError *error, IWebFrame*)
146{
147 BSTR errorDescription = 0;
148 HRESULT hr = error->localizedDescription(&errorDescription);
149 if (FAILED(hr))
150 errorDescription = L"Failed to load page and to localize error description.";
151
152 ::MessageBoxW(0, static_cast<LPCWSTR>(errorDescription), L"Error", MB_APPLMODAL | MB_OK);
153 if (SUCCEEDED(hr))
154 SysFreeString(errorDescription);
155
156 return S_OK;
157}
158
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000159HRESULT STDMETHODCALLTYPE WinLauncherWebHost::QueryInterface(REFIID riid, void** ppvObject)
160{
161 *ppvObject = 0;
162 if (IsEqualGUID(riid, IID_IUnknown))
163 *ppvObject = static_cast<IWebFrameLoadDelegate*>(this);
164 else if (IsEqualGUID(riid, IID_IWebFrameLoadDelegate))
165 *ppvObject = static_cast<IWebFrameLoadDelegate*>(this);
166 else
167 return E_NOINTERFACE;
168
169 AddRef();
170 return S_OK;
171}
172
173ULONG STDMETHODCALLTYPE WinLauncherWebHost::AddRef(void)
174{
175 return ++m_refCount;
176}
177
178ULONG STDMETHODCALLTYPE WinLauncherWebHost::Release(void)
179{
180 ULONG newRef = --m_refCount;
181 if (!newRef)
182 delete(this);
183
184 return newRef;
185}
186
bfulgham@webkit.org5e0d6222011-06-17 18:00:59 +0000187HRESULT WinLauncherWebHost::didFinishLoadForFrame(IWebView* webView, IWebFrame* frame)
188{
189 IDOMDocument* doc = 0;
190 frame->DOMDocument(&doc);
191
192 IDOMElement* element = 0;
193 IDOMEventTarget* target = 0;
194 HRESULT hr = doc->getElementById(L"webkit logo", &element);
195 if (!SUCCEEDED(hr))
196 goto exit;
197
198 hr = element->QueryInterface(IID_IDOMEventTarget, reinterpret_cast<void**>(&target));
199 if (!SUCCEEDED(hr))
200 goto exit;
201
202 hr = target->addEventListener(L"click", new SimpleEventListener (L"webkit logo click"), FALSE);
203 if (!SUCCEEDED(hr))
204 goto exit;
205
206exit:
207 if (target)
208 target->Release();
209 if (element)
210 element->Release();
211 if (doc)
212 doc->Release();
213
214 return hr;
215}
216
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000217static void resizeSubViews()
218{
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000219 if (usesLayeredWebView() || !gViewWindow)
220 return;
221
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000222 RECT rcClient;
223 GetClientRect(hMainWnd, &rcClient);
224 MoveWindow(hURLBarWnd, 0, 0, rcClient.right, URLBAR_HEIGHT, TRUE);
225 MoveWindow(gViewWindow, 0, URLBAR_HEIGHT, rcClient.right, rcClient.bottom - URLBAR_HEIGHT, TRUE);
226}
227
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000228static void subclassForLayeredWindow()
229{
230 hMainWnd = gViewWindow;
commit-queue@webkit.org0919baa2012-08-14 03:20:33 +0000231#if defined _M_AMD64 || defined _WIN64
232 DefWebKitProc = reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hMainWnd, GWLP_WNDPROC));
233 ::SetWindowLongPtr(hMainWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(WndProc));
234#else
235 DefWebKitProc = reinterpret_cast<WNDPROC>(::GetWindowLong(hMainWnd, GWL_WNDPROC));
236 ::SetWindowLong(hMainWnd, GWL_WNDPROC, reinterpret_cast<LONG_PTR>(WndProc));
237#endif
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000238}
239
240static void computeFullDesktopFrame()
241{
242 RECT desktop;
243 if (!::SystemParametersInfo(SPI_GETWORKAREA, 0, static_cast<void*>(&desktop), 0))
244 return;
245
246 s_windowPosition.x = 0;
247 s_windowPosition.y = 0;
248 s_windowSize.cx = desktop.right - desktop.left;
249 s_windowSize.cy = desktop.bottom - desktop.top;
250}
251
aroben@apple.com1c6ff802012-01-05 14:52:23 +0000252BOOL WINAPI DllMain(HINSTANCE dllInstance, DWORD reason, LPVOID)
253{
254 if (reason == DLL_PROCESS_ATTACH)
255 hInst = dllInstance;
256
257 return TRUE;
258}
259
260extern "C" __declspec(dllexport) int WINAPI dllLauncherEntryPoint(HINSTANCE, HINSTANCE, LPTSTR, int nCmdShow)
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000261{
262#ifdef _CRTDBG_MAP_ALLOC
263 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
264 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
265#endif
266
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000267 // TODO: Place code here.
sfalken@apple.coma099ce72010-11-18 00:08:24 +0000268 MSG msg = {0};
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000269 HACCEL hAccelTable;
270
271 INITCOMMONCONTROLSEX InitCtrlEx;
272
273 InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
274 InitCtrlEx.dwICC = 0x00004000; //ICC_STANDARD_CLASSES;
275 InitCommonControlsEx(&InitCtrlEx);
276
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000277 int argc = 0;
278 WCHAR** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
279 for (int i = 1; i < argc; ++i) {
280 if (!wcsicmp(argv[i], L"--transparent"))
281 s_usesLayeredWebView = true;
282 else if (!wcsicmp(argv[i], L"--desktop"))
283 s_fullDesktop = true;
284 }
285
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000286 // Initialize global strings
aroben@apple.com1c6ff802012-01-05 14:52:23 +0000287 LoadString(hInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
288 LoadString(hInst, IDC_WINLAUNCHER, szWindowClass, MAX_LOADSTRING);
289 MyRegisterClass(hInst);
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000290
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000291 if (shouldUseFullDesktop())
292 computeFullDesktopFrame();
293
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000294 // Init COM
295 OleInitialize(NULL);
296
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000297 if (usesLayeredWebView()) {
298 hURLBarWnd = CreateWindow(L"EDIT", L"Type URL Here",
299 WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL,
300 s_windowPosition.x, s_windowPosition.y + s_windowSize.cy, s_windowSize.cx, URLBAR_HEIGHT,
301 0,
302 0,
aroben@apple.com1c6ff802012-01-05 14:52:23 +0000303 hInst, 0);
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000304 } else {
aroben@apple.com1c6ff802012-01-05 14:52:23 +0000305 hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
306 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInst, 0);
307
308 if (!hMainWnd)
309 return FALSE;
310
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000311 hURLBarWnd = CreateWindow(L"EDIT", 0,
312 WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL,
313 0, 0, 0, 0,
314 hMainWnd,
315 0,
aroben@apple.com1c6ff802012-01-05 14:52:23 +0000316 hInst, 0);
317
318 ShowWindow(hMainWnd, nCmdShow);
319 UpdateWindow(hMainWnd);
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000320 }
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000321
commit-queue@webkit.org0919baa2012-08-14 03:20:33 +0000322#if defined _M_AMD64 || defined _WIN64
323 DefEditProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hURLBarWnd, GWLP_WNDPROC));
324 SetWindowLongPtr(hURLBarWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(MyEditProc));
325#else
326 DefEditProc = reinterpret_cast<WNDPROC>(GetWindowLong(hURLBarWnd, GWL_WNDPROC));
327 SetWindowLong(hURLBarWnd, GWL_WNDPROC, reinterpret_cast<LONG_PTR>(MyEditProc));
328#endif
329
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000330 SetFocus(hURLBarWnd);
331
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000332 RECT clientRect = { s_windowPosition.x, s_windowPosition.y, s_windowPosition.x + s_windowSize.cx, s_windowPosition.y + s_windowSize.cy };
333
334 IWebPreferences* tmpPreferences = 0;
335 IWebPreferences* standardPreferences = 0;
336 if (FAILED(WebKitCreateInstance(CLSID_WebPreferences, 0, IID_IWebPreferences, reinterpret_cast<void**>(&tmpPreferences))))
337 goto exit;
338
339 if (FAILED(tmpPreferences->standardPreferences(&standardPreferences)))
340 goto exit;
341
342 standardPreferences->setAcceleratedCompositingEnabled(TRUE);
343
344 HRESULT hr = WebKitCreateInstance(CLSID_WebView, 0, IID_IWebView, reinterpret_cast<void**>(&gWebView));
345 if (FAILED(hr))
346 goto exit;
347
348 hr = gWebView->QueryInterface(IID_IWebViewPrivate, reinterpret_cast<void**>(&gWebViewPrivate));
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000349 if (FAILED(hr))
350 goto exit;
351
352 gWebHost = new WinLauncherWebHost();
353 gWebHost->AddRef();
354 hr = gWebView->setFrameLoadDelegate(gWebHost);
355 if (FAILED(hr))
356 goto exit;
357
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000358 gPrintDelegate = new PrintWebUIDelegate;
359 gPrintDelegate->AddRef();
360 hr = gWebView->setUIDelegate(gPrintDelegate);
361 if (FAILED (hr))
362 goto exit;
363
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000364 hr = gWebView->setHostWindow(reinterpret_cast<OLE_HANDLE>(hMainWnd));
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000365 if (FAILED(hr))
366 goto exit;
367
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000368 hr = gWebView->initWithFrame(clientRect, 0, 0);
369 if (FAILED(hr))
370 goto exit;
371
372 IWebFrame* frame;
373 hr = gWebView->mainFrame(&frame);
374 if (FAILED(hr))
375 goto exit;
bfulgham@webkit.orgf7fae962009-06-02 19:01:34 +0000376
bfulgham@webkit.org5e0d6222011-06-17 18:00:59 +0000377 static BSTR defaultHTML = SysAllocString(TEXT("<p style=\"background-color: #00FF00\">Testing</p><img id=\"webkit logo\" src=\"http://webkit.org/images/icon-gold.png\" alt=\"Face\"><div style=\"border: solid blue; background: white;\" contenteditable=\"true\">div with blue border</div><ul><li>foo<li>bar<li>baz</ul>"));
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000378 frame->loadHTMLString(defaultHTML, 0);
379 frame->Release();
380
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000381 hr = gWebViewPrivate->setTransparent(usesLayeredWebView());
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000382 if (FAILED(hr))
383 goto exit;
bfulgham@webkit.orgf7fae962009-06-02 19:01:34 +0000384
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000385 hr = gWebViewPrivate->setUsesLayeredWindow(usesLayeredWebView());
386 if (FAILED(hr))
387 goto exit;
388
389 hr = gWebViewPrivate->viewWindow(reinterpret_cast<OLE_HANDLE*>(&gViewWindow));
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000390 if (FAILED(hr) || !gViewWindow)
391 goto exit;
392
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000393 if (usesLayeredWebView())
394 subclassForLayeredWindow();
395
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000396 resizeSubViews();
397
398 ShowWindow(gViewWindow, nCmdShow);
399 UpdateWindow(gViewWindow);
400
aroben@apple.com1c6ff802012-01-05 14:52:23 +0000401 hAccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDC_WINLAUNCHER));
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000402
403 // Main message loop:
404 while (GetMessage(&msg, NULL, 0, 0)) {
405 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
406 TranslateMessage(&msg);
407 DispatchMessage(&msg);
408 }
409 }
410
411exit:
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000412 gPrintDelegate->Release();
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000413 if (gWebViewPrivate)
414 gWebViewPrivate->Release();
aroben@apple.comc709bdc2008-12-03 19:51:56 +0000415 gWebView->Release();
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000416 if (standardPreferences)
417 standardPreferences->Release();
418 tmpPreferences->Release();
419
aroben@apple.com6144f1a2008-12-03 19:51:45 +0000420 shutDownWebKit();
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000421#ifdef _CRTDBG_MAP_ALLOC
422 _CrtDumpMemoryLeaks();
423#endif
424
425 // Shut down COM.
426 OleUninitialize();
427
bfulgham@webkit.orgf7fae962009-06-02 19:01:34 +0000428 return static_cast<int>(msg.wParam);
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000429}
430
431ATOM MyRegisterClass(HINSTANCE hInstance)
432{
433 WNDCLASSEX wcex;
434
435 wcex.cbSize = sizeof(WNDCLASSEX);
436
437 wcex.style = CS_HREDRAW | CS_VREDRAW;
438 wcex.lpfnWndProc = WndProc;
439 wcex.cbClsExtra = 0;
440 wcex.cbWndExtra = 0;
441 wcex.hInstance = hInstance;
442 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINLAUNCHER));
443 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
444 wcex.hbrBackground = 0;
445 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WINLAUNCHER);
446 wcex.lpszClassName = szWindowClass;
447 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
448
449 return RegisterClassEx(&wcex);
450}
451
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000452static BOOL CALLBACK AbortProc(HDC hDC, int Error)
453{
454 MSG msg;
455 while (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
456 ::TranslateMessage(&msg);
457 ::DispatchMessage(&msg);
458 }
459
460 return TRUE;
461}
462
463static HDC getPrinterDC()
464{
465 PRINTDLG pdlg;
466 memset(&pdlg, 0, sizeof(PRINTDLG));
467 pdlg.lStructSize = sizeof(PRINTDLG);
468 pdlg.Flags = PD_PRINTSETUP | PD_RETURNDC;
469
470 ::PrintDlg(&pdlg);
471
472 return pdlg.hDC;
473}
474
475static void initDocStruct(DOCINFO* di, TCHAR* docname)
476{
477 memset(di, 0, sizeof(DOCINFO));
478 di->cbSize = sizeof(DOCINFO);
479 di->lpszDocName = docname;
480}
481
482void PrintView(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
483{
484 HDC printDC = getPrinterDC();
485 if (!printDC) {
paroga@webkit.orgfe3033d2011-04-18 17:08:45 +0000486 ::MessageBoxW(0, L"Error creating printing DC", L"Error", MB_APPLMODAL | MB_OK);
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000487 return;
488 }
489
490 if (::SetAbortProc(printDC, AbortProc) == SP_ERROR) {
paroga@webkit.orgfe3033d2011-04-18 17:08:45 +0000491 ::MessageBoxW(0, L"Error setting up AbortProc", L"Error", MB_APPLMODAL | MB_OK);
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000492 return;
493 }
494
495 IWebFrame* frame = 0;
sfalken@apple.coma099ce72010-11-18 00:08:24 +0000496 IWebFramePrivate* framePrivate = 0;
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000497 if (FAILED(gWebView->mainFrame(&frame)))
498 goto exit;
499
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000500 if (FAILED(frame->QueryInterface(&framePrivate)))
501 goto exit;
502
503 framePrivate->setInPrintingMode(TRUE, printDC);
504
505 UINT pageCount = 0;
506 framePrivate->getPrintedPageCount(printDC, &pageCount);
507
508 DOCINFO di;
paroga@webkit.orgfe3033d2011-04-18 17:08:45 +0000509 initDocStruct(&di, L"WebKit Doc");
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000510 ::StartDoc(printDC, &di);
511
512 // FIXME: Need CoreGraphics implementation
513 void* graphicsContext = 0;
bfulgham@webkit.orgbdad3182010-01-12 20:32:11 +0000514 for (size_t page = 1; page <= pageCount; ++page) {
bfulgham@webkit.orge8f9a2a2009-12-20 06:55:57 +0000515 ::StartPage(printDC);
516 framePrivate->spoolPages(printDC, page, page, graphicsContext);
517 ::EndPage(printDC);
518 }
519
520 framePrivate->setInPrintingMode(FALSE, printDC);
521
522 ::EndDoc(printDC);
523 ::DeleteDC(printDC);
524
525exit:
526 if (frame)
527 frame->Release();
528 if (framePrivate)
529 framePrivate->Release();
530}
531
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000532static const int dragBarHeight = 30;
533
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000534LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
535{
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000536 WNDPROC parentProc = usesLayeredWebView() ? DefWebKitProc : DefWindowProc;
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000537
538 switch (message) {
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000539 case WM_NCHITTEST:
540 if (usesLayeredWebView()) {
541 RECT window;
542 ::GetWindowRect(hWnd, &window);
543 // For testing our transparent window, we need a region to use as a handle for
544 // dragging. The right way to do this would be to query the web view to see what's
545 // under the mouse. However, for testing purposes we just use an arbitrary
546 // 30 pixel band at the top of the view as an arbitrary gripping location.
547 //
548 // When we are within this bad, return HT_CAPTION to tell Windows we want to
549 // treat this region as if it were the title bar on a normal window.
550 int y = HIWORD(lParam);
551
552 if ((y > window.top) && (y < window.top + dragBarHeight))
553 return HTCAPTION;
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000554 }
aroben@apple.com8fec4ff2012-01-05 14:56:15 +0000555 return CallWindowProc(parentProc, hWnd, message, wParam, lParam);
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000556 case WM_COMMAND: {
557 int wmId = LOWORD(wParam);
558 int wmEvent = HIWORD(wParam);
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000559 // Parse the menu selections:
560 switch (wmId) {
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000561 case IDM_ABOUT:
562 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
563 break;
564 case IDM_EXIT:
565 DestroyWindow(hWnd);
566 break;
567 case IDM_PRINT:
568 PrintView(hWnd, message, wParam, lParam);
569 break;
570 default:
571 return CallWindowProc(parentProc, hWnd, message, wParam, lParam);
572 }
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000573 }
574 break;
575 case WM_DESTROY:
576 PostQuitMessage(0);
577 break;
578 case WM_SIZE:
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000579 if (!gWebView || usesLayeredWebView())
580 return CallWindowProc(parentProc, hWnd, message, wParam, lParam);
581
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000582 resizeSubViews();
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000583 break;
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000584 default:
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000585 return CallWindowProc(parentProc, hWnd, message, wParam, lParam);
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000586 }
bfulgham@webkit.orgfa80f222011-04-27 00:29:28 +0000587
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000588 return 0;
589}
590
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000591#define MAX_URL_LENGTH 1024
592
593LRESULT CALLBACK MyEditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
594{
595 switch (message) {
596 case WM_CHAR:
bfulgham@webkit.orgf7fae962009-06-02 19:01:34 +0000597 if (wParam == 13) { // Enter Key
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000598 wchar_t strPtr[MAX_URL_LENGTH];
599 *((LPWORD)strPtr) = MAX_URL_LENGTH;
600 int strLen = SendMessage(hDlg, EM_GETLINE, 0, (LPARAM)strPtr);
601
602 BSTR bstr = SysAllocStringLen(strPtr, strLen);
603 loadURL(bstr);
604 SysFreeString(bstr);
605
606 return 0;
607 } else
608 return (LRESULT)CallWindowProc((WNDPROC)DefEditProc,hDlg,message,wParam,lParam);
609 break;
610 default:
611 return (LRESULT)CallWindowProc((WNDPROC)DefEditProc,hDlg,message,wParam,lParam);
612 break;
613 }
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000614}
615
616
617// Message handler for about box.
618INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
619{
620 UNREFERENCED_PARAMETER(lParam);
621 switch (message) {
622 case WM_INITDIALOG:
623 return (INT_PTR)TRUE;
624
625 case WM_COMMAND:
626 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
627 EndDialog(hDlg, LOWORD(wParam));
628 return (INT_PTR)TRUE;
629 }
630 break;
631 }
632 return (INT_PTR)FALSE;
633}
634
635static void loadURL(BSTR urlBStr)
636{
637 IWebFrame* frame = 0;
638 IWebMutableURLRequest* request = 0;
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000639
bfulgham@webkit.orgf7fae962009-06-02 19:01:34 +0000640 static BSTR methodBStr = SysAllocString(TEXT("GET"));
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000641
642 if (urlBStr && urlBStr[0] && (PathFileExists(urlBStr) || PathIsUNC(urlBStr))) {
643 TCHAR fileURL[INTERNET_MAX_URL_LENGTH];
644 DWORD fileURLLength = sizeof(fileURL)/sizeof(fileURL[0]);
bfulgham@webkit.orgaedd6fd2009-07-17 19:37:21 +0000645
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000646 if (SUCCEEDED(UrlCreateFromPath(urlBStr, fileURL, &fileURLLength, 0)))
bfulgham@webkit.orgaedd6fd2009-07-17 19:37:21 +0000647 SysReAllocString(&urlBStr, fileURL);
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000648 }
649
650 HRESULT hr = gWebView->mainFrame(&frame);
651 if (FAILED(hr))
652 goto exit;
653
bfulgham@webkit.orgf7fae962009-06-02 19:01:34 +0000654 hr = WebKitCreateInstance(CLSID_WebMutableURLRequest, 0, IID_IWebMutableURLRequest, (void**)&request);
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000655 if (FAILED(hr))
656 goto exit;
657
zecke@webkit.org739e91a2008-12-12 17:42:21 +0000658 hr = request->initWithURL(urlBStr, WebURLRequestUseProtocolCachePolicy, 60);
pewtermoose@webkit.org5e41fa92008-02-21 02:26:00 +0000659 if (FAILED(hr))
660 goto exit;
661
662 hr = request->setHTTPMethod(methodBStr);
663 if (FAILED(hr))
664 goto exit;
665
666 hr = frame->loadRequest(request);
667 if (FAILED(hr))
668 goto exit;
669
670 SetFocus(gViewWindow);
671
672exit:
673 if (frame)
674 frame->Release();
675 if (request)
676 request->Release();
677}