1f2ac36e802799338b1679f6b985e0911da008a5
[WebKit-https.git] / Tools / MiniBrowser / win / WebKitBrowserWindow.cpp
1 /*
2  * Copyright (C) 2018 Sony Interactive Entertainment Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 #include "stdafx.h"
26 #include "WebKitBrowserWindow.h"
27
28 #include "MiniBrowserLibResource.h"
29 #include <WebKit/WKInspector.h>
30 #include <vector>
31
32 std::wstring
33 createString(WKStringRef wkString)
34 {
35     size_t maxSize = WKStringGetLength(wkString);
36
37     std::vector<WKChar> wkCharBuffer(maxSize);
38     size_t actualLength = WKStringGetCharacters(wkString, wkCharBuffer.data(), maxSize);
39     return std::wstring(wkCharBuffer.data(), actualLength);
40 }
41
42 std::wstring createString(WKURLRef wkURL)
43 {
44     WKRetainPtr<WKStringRef> url = adoptWK(WKURLCopyString(wkURL));
45     return createString(url.get());
46 }
47
48 std::vector<char> toNullTerminatedUTF8(const wchar_t* src, size_t srcLength)
49 {
50     int utf8Length = WideCharToMultiByte(CP_UTF8, 0, src, srcLength, 0, 0, nullptr, nullptr);
51     std::vector<char> utf8Buffer(utf8Length + 1);
52     WideCharToMultiByte(CP_UTF8, 0, src, srcLength,
53         utf8Buffer.data(), utf8Length, nullptr, nullptr);
54     utf8Buffer[utf8Length] = '\0';
55     return utf8Buffer;
56 }
57
58 WKRetainPtr<WKStringRef>
59 createWKString(_bstr_t str)
60 {
61     auto utf8 = toNullTerminatedUTF8(str, str.length());
62     return adoptWK(WKStringCreateWithUTF8CString(utf8.data()));
63 }
64
65 WKRetainPtr<WKURLRef>
66 createWKURL(_bstr_t str)
67 {
68     auto utf8 = toNullTerminatedUTF8(str, str.length());
69     return adoptWK(WKURLCreateWithUTF8CString(utf8.data()));
70 }
71
72 Ref<BrowserWindow> WebKitBrowserWindow::create(HWND mainWnd, HWND urlBarWnd, bool, bool)
73 {
74     return adoptRef(*new WebKitBrowserWindow(mainWnd, urlBarWnd));
75 }
76
77 WebKitBrowserWindow::WebKitBrowserWindow(HWND mainWnd, HWND urlBarWnd)
78     : m_hMainWnd(mainWnd)
79     , m_urlBarWnd(urlBarWnd)
80 {
81     RECT rect = { };
82     auto conf = adoptWK(WKPageConfigurationCreate());
83     auto context = adoptWK(WKContextCreate());
84     WKPageConfigurationSetContext(conf.get(), context.get());
85
86     m_view = adoptWK(WKViewCreate(rect, conf.get(), mainWnd));
87     auto page = WKViewGetPage(m_view.get());
88
89     WKPageLoaderClientV0 loadClient = {{ 0, this }};
90     loadClient.didReceiveTitleForFrame = didReceiveTitleForFrame;
91     loadClient.didCommitLoadForFrame = didCommitLoadForFrame;
92     WKPageSetPageLoaderClient(page, &loadClient.base);
93 }
94
95 HRESULT WebKitBrowserWindow::init()
96 {
97     return S_OK;
98 }
99
100 HWND WebKitBrowserWindow::hwnd()
101 {
102     return WKViewGetWindow(m_view.get());
103 }
104
105 HRESULT WebKitBrowserWindow::loadURL(const BSTR& url)
106 {
107     auto page = WKViewGetPage(m_view.get());
108     WKPageLoadURL(page, createWKURL(url).get());
109     return true;
110 }
111
112 HRESULT WebKitBrowserWindow::loadHTMLString(const BSTR& str)
113 {
114     auto page = WKViewGetPage(m_view.get());
115     auto url = createWKURL(L"about:");
116     WKPageLoadHTMLString(page, createWKString(_bstr_t(str)).get(), url.get());
117     return true;
118 }
119
120 void WebKitBrowserWindow::navigateForwardOrBackward(UINT menuID)
121 {
122     auto page = WKViewGetPage(m_view.get());
123     if (menuID == IDM_HISTORY_FORWARD)
124         WKPageGoForward(page);
125     else
126         WKPageGoBack(page);
127 }
128
129 void WebKitBrowserWindow::navigateToHistory(UINT menuID)
130 {
131     // Not implemented
132 }
133
134 void WebKitBrowserWindow::setPreference(UINT menuID, bool enable)
135 {
136     auto page = WKViewGetPage(m_view.get());
137     auto pgroup = WKPageGetPageGroup(page);
138     auto pref = WKPageGroupGetPreferences(pgroup);
139     switch (menuID) {
140     case IDM_DISABLE_IMAGES:
141         WKPreferencesSetLoadsImagesAutomatically(pref, !enable);
142         break;
143     case IDM_DISABLE_JAVASCRIPT:
144         WKPreferencesSetJavaScriptEnabled(pref, !enable);
145         break;
146     }
147 }
148
149 void WebKitBrowserWindow::print()
150 {
151     // Not implemented
152 }
153
154 void WebKitBrowserWindow::launchInspector()
155 {
156     auto page = WKViewGetPage(m_view.get());
157     auto inspector = WKPageGetInspector(page);
158     WKInspectorShow(inspector);
159 }
160
161 void WebKitBrowserWindow::setUserAgent(UINT menuID)
162 {
163     // This method should be removed.
164 }
165
166 void WebKitBrowserWindow::setUserAgent(_bstr_t& customUAString)
167 {
168     auto page = WKViewGetPage(m_view.get());
169     auto ua = createWKString(customUAString);
170     WKPageSetCustomUserAgent(page, ua.get());
171 }
172
173 _bstr_t WebKitBrowserWindow::userAgent()
174 {
175     auto page = WKViewGetPage(m_view.get());
176     auto ua = adoptWK(WKPageCopyUserAgent(page));
177     return createString(ua.get()).c_str();
178 }
179
180 void WebKitBrowserWindow::showLayerTree()
181 {
182     // Not implemented
183 }
184
185 void WebKitBrowserWindow::updateStatistics(HWND hDlg)
186 {
187     // Not implemented
188 }
189
190
191 void WebKitBrowserWindow::resetZoom()
192 {
193     auto page = WKViewGetPage(m_view.get());
194     WKPageSetPageZoomFactor(page, 1);
195 }
196
197 void WebKitBrowserWindow::zoomIn()
198 {
199     auto page = WKViewGetPage(m_view.get());
200     double s = WKPageGetPageZoomFactor(page);
201     WKPageSetPageZoomFactor(page, s * 1.25);
202 }
203
204 void WebKitBrowserWindow::zoomOut()
205 {
206     auto page = WKViewGetPage(m_view.get());
207     double s = WKPageGetPageZoomFactor(page);
208     WKPageSetPageZoomFactor(page, s * 0.8);
209 }
210
211 static WebKitBrowserWindow& toWebKitBrowserWindow(const void *clientInfo)
212 {
213     return *const_cast<WebKitBrowserWindow*>(static_cast<const WebKitBrowserWindow*>(clientInfo));
214 }
215
216 void WebKitBrowserWindow::didReceiveTitleForFrame(WKPageRef page, WKStringRef title, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
217 {
218     if (!WKFrameIsMainFrame(frame))
219         return;
220     std::wstring titleString = createString(title) + L" [WebKit]";
221     auto& thisWindow = toWebKitBrowserWindow(clientInfo);
222     SetWindowText(thisWindow.m_hMainWnd, titleString.c_str());
223 }
224
225 void WebKitBrowserWindow::didCommitLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
226 {
227     if (!WKFrameIsMainFrame(frame))
228         return;
229     auto& thisWindow = toWebKitBrowserWindow(clientInfo);
230
231     WKRetainPtr<WKURLRef> wkurl = adoptWK(WKFrameCopyURL(frame));
232     std::wstring urlString = createString(wkurl.get());
233     SetWindowText(thisWindow.m_urlBarWnd, urlString.c_str());
234 }