WinLauncher fails to download files.
[WebKit-https.git] / Tools / WinLauncher / WinMain.cpp
1 /*
2  * Copyright (C) 2006, 2008, 2013, 2014 Apple Inc.  All rights reserved.
3  * Copyright (C) 2009, 2011 Brent Fulgham.  All rights reserved.
4  * Copyright (C) 2009, 2010, 2011 Appcelerator, Inc. All rights reserved.
5  * Copyright (C) 2013 Alex Christensen. All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
27  */
28
29 #include "stdafx.h"
30 #include "WinLauncherLibResource.h"
31 #include "WinLauncherWebHost.h"
32 #include "Common.cpp"
33
34 int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR, int nCmdShow)
35 {
36 #ifdef _CRTDBG_MAP_ALLOC
37     _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
38     _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
39 #endif
40
41     MSG msg = {0};
42     HACCEL hAccelTable;
43
44     INITCOMMONCONTROLSEX InitCtrlEx;
45
46     InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
47     InitCtrlEx.dwICC  = 0x00004000; // ICC_STANDARD_CLASSES;
48     InitCommonControlsEx(&InitCtrlEx);
49
50     bool usesLayeredWebView = false;
51     bool useFullDesktop = false;
52     bool pageLoadTesting = false;
53     _bstr_t requestedURL;
54
55     parseCommandLine(usesLayeredWebView, useFullDesktop, pageLoadTesting, requestedURL);
56
57     // Initialize global strings
58     LoadString(hInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
59     LoadString(hInst, IDC_WINLAUNCHER, szWindowClass, MAX_LOADSTRING);
60     MyRegisterClass(hInst);
61
62     if (useFullDesktop)
63         computeFullDesktopFrame();
64
65     // Init COM
66     OleInitialize(nullptr);
67
68     if (usesLayeredWebView) {
69         hURLBarWnd = CreateWindow(L"EDIT", L"Type URL Here",
70             WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, 
71             s_windowPosition.x, s_windowPosition.y + s_windowSize.cy, s_windowSize.cx, URLBAR_HEIGHT,
72             0, 0, hInst, 0);
73     } else {
74         hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
75             CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInst, 0);
76
77         if (!hMainWnd)
78             return FALSE;
79
80         hBackButtonWnd = CreateWindow(L"BUTTON", L"<", WS_CHILD | WS_VISIBLE  | BS_TEXT, 0, 0, 0, 0, hMainWnd, 0, hInst, 0);
81         hForwardButtonWnd = CreateWindow(L"BUTTON", L">", WS_CHILD | WS_VISIBLE  | BS_TEXT, CONTROLBUTTON_WIDTH, 0, 0, 0, hMainWnd, 0, hInst, 0);
82         hURLBarWnd = CreateWindow(L"EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, CONTROLBUTTON_WIDTH * 2, 0, 0, 0, hMainWnd, 0, hInst, 0);
83
84         ShowWindow(hMainWnd, nCmdShow);
85         UpdateWindow(hMainWnd);
86     }
87
88     DefEditProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hURLBarWnd, GWLP_WNDPROC));
89     DefButtonProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hBackButtonWnd, GWLP_WNDPROC));
90     SetWindowLongPtr(hURLBarWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(EditProc));
91     SetWindowLongPtr(hBackButtonWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(BackButtonProc));
92     SetWindowLongPtr(hForwardButtonWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(ForwardButtonProc));
93
94     SetFocus(hURLBarWnd);
95
96     RECT clientRect = { s_windowPosition.x, s_windowPosition.y, s_windowPosition.x + s_windowSize.cx, s_windowPosition.y + s_windowSize.cy };
97
98     WinLauncherWebHost* webHost = nullptr;
99
100     IWebDownloadDelegatePtr downloadDelegate;
101     downloadDelegate.Attach(new WebDownloadDelegate());
102
103     gWinLauncher = new WinLauncher(hMainWnd, hURLBarWnd, usesLayeredWebView, pageLoadTesting);
104     if (!gWinLauncher)
105         goto exit;
106
107     if (!gWinLauncher->seedInitialDefaultPreferences())
108         goto exit;
109
110     if (!gWinLauncher->setToDefaultPreferences())
111         goto exit;
112
113     HRESULT hr = gWinLauncher->init();
114     if (FAILED(hr))
115         goto exit;
116
117     if (!setCacheFolder())
118         goto exit;
119
120     webHost = new WinLauncherWebHost(gWinLauncher, hURLBarWnd);
121
122     hr = gWinLauncher->setFrameLoadDelegate(webHost);
123     if (FAILED(hr))
124         goto exit;
125
126     hr = gWinLauncher->setFrameLoadDelegatePrivate(webHost);
127     if (FAILED(hr))
128         goto exit;
129
130     hr = gWinLauncher->setUIDelegate(new PrintWebUIDelegate());
131     if (FAILED (hr))
132         goto exit;
133
134     hr = gWinLauncher->setAccessibilityDelegate(new AccessibilityDelegate());
135     if (FAILED (hr))
136         goto exit;
137
138     hr = gWinLauncher->setResourceLoadDelegate(new ResourceLoadDelegate(gWinLauncher));
139     if (FAILED(hr))
140         goto exit;
141
142     hr = gWinLauncher->setDownloadDelegate(downloadDelegate);
143     if (FAILED(hr))
144         goto exit;
145
146     hr = gWinLauncher->prepareViews(hMainWnd, clientRect, requestedURL.GetBSTR(), gViewWindow);
147     if (FAILED(hr) || !gViewWindow)
148         goto exit;
149
150     if (gWinLauncher->usesLayeredWebView())
151         subclassForLayeredWindow();
152
153     resizeSubViews();
154
155     ShowWindow(gViewWindow, nCmdShow);
156     UpdateWindow(gViewWindow);
157
158     hAccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDC_WINLAUNCHER));
159
160     if (requestedURL.length())
161         loadURL(requestedURL.GetBSTR());
162
163 #pragma warning(disable:4509)
164
165     // Main message loop:
166     __try {
167         _com_ptr_t<_com_IIID<IWebKitMessageLoop, &__uuidof(IWebKitMessageLoop)>> messageLoop;
168
169         hr = WebKitCreateInstance(CLSID_WebKitMessageLoop, 0, IID_IWebKitMessageLoop, reinterpret_cast<void**>(&messageLoop.GetInterfacePtr()));
170         if (FAILED(hr))
171             goto exit;
172
173         messageLoop->run(hAccelTable);
174
175     } __except(createCrashReport(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) { }
176
177 exit:
178     shutDownWebKit();
179 #ifdef _CRTDBG_MAP_ALLOC
180     _CrtDumpMemoryLeaks();
181 #endif
182
183     // Shut down COM.
184     OleUninitialize();
185
186     delete gWinLauncher;
187     
188     return static_cast<int>(msg.wParam);
189 }
190
191 ATOM MyRegisterClass(HINSTANCE hInstance)
192 {
193     WNDCLASSEX wcex;
194
195     wcex.cbSize = sizeof(WNDCLASSEX);
196
197     wcex.style          = CS_HREDRAW | CS_VREDRAW;
198     wcex.lpfnWndProc    = WndProc;
199     wcex.cbClsExtra     = 0;
200     wcex.cbWndExtra     = 0;
201     wcex.hInstance      = hInstance;
202     wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINLAUNCHER));
203     wcex.hCursor        = LoadCursor(0, IDC_ARROW);
204     wcex.hbrBackground  = 0;
205     wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WINLAUNCHER);
206     wcex.lpszClassName  = szWindowClass;
207     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
208
209     return RegisterClassEx(&wcex);
210 }