Add WKUIDelegatePrivate equivalent of WKPageUIClient's toolbarsAreVisible
[WebKit-https.git] / Source / WebKit / UIProcess / API / glib / WebKitUIClient.cpp
1 /*
2  * Copyright (C) 2011, 2012 Igalia S.L.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "WebKitUIClient.h"
22
23 #include "APIUIClient.h"
24 #include "WebKitFileChooserRequestPrivate.h"
25 #include "WebKitGeolocationPermissionRequestPrivate.h"
26 #include "WebKitNavigationActionPrivate.h"
27 #include "WebKitNotificationPermissionRequestPrivate.h"
28 #include "WebKitURIRequestPrivate.h"
29 #include "WebKitUserMediaPermissionRequestPrivate.h"
30 #include "WebKitWebViewPrivate.h"
31 #include "WebKitWindowPropertiesPrivate.h"
32 #include "WebPageProxy.h"
33 #include <wtf/glib/GRefPtr.h>
34
35 #if PLATFORM(GTK)
36 #include <WebCore/GtkUtilities.h>
37 #endif
38
39 using namespace WebKit;
40
41 class UIClient : public API::UIClient {
42 public:
43     explicit UIClient(WebKitWebView* webView)
44         : m_webView(webView)
45     {
46     }
47
48 private:
49     RefPtr<WebPageProxy> createNewPage(WebPageProxy*, API::FrameInfo&, WebCore::ResourceRequest&& resourceRequest, const WebCore::WindowFeatures& windowFeatures, NavigationActionData&& navigationActionData) override
50     {
51         GRefPtr<WebKitURIRequest> request = adoptGRef(webkitURIRequestCreateForResourceRequest(resourceRequest));
52         WebKitNavigationAction navigationAction(request.get(), navigationActionData);
53         return webkitWebViewCreateNewPage(m_webView, windowFeatures, &navigationAction);
54     }
55
56     void showPage(WebPageProxy*) override
57     {
58         webkitWebViewReadyToShowPage(m_webView);
59     }
60
61     void close(WebPageProxy*) override
62     {
63         webkitWebViewClosePage(m_webView);
64     }
65
66     void runJavaScriptAlert(WebPageProxy*, const String& message, WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void ()>&& completionHandler) override
67     {
68         webkitWebViewRunJavaScriptAlert(m_webView, message.utf8());
69         completionHandler();
70     }
71
72     void runJavaScriptConfirm(WebPageProxy*, const String& message, WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void (bool)>&& completionHandler) override
73     {
74         completionHandler(webkitWebViewRunJavaScriptConfirm(m_webView, message.utf8()));
75     }
76
77     void runJavaScriptPrompt(WebPageProxy*, const String& message, const String& defaultValue, WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void (const String&)>&& completionHandler) override
78     {
79         CString result = webkitWebViewRunJavaScriptPrompt(m_webView, message.utf8(), defaultValue.utf8());
80         if (result.isNull()) {
81             completionHandler(String());
82             return;
83         }
84
85         completionHandler(String::fromUTF8(result.data()));
86     }
87
88     bool canRunBeforeUnloadConfirmPanel() const override { return true; }
89
90     void runBeforeUnloadConfirmPanel(WebPageProxy*, const String& message, WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void (bool)>&& completionHandler) override
91     {
92         completionHandler(webkitWebViewRunJavaScriptBeforeUnloadConfirm(m_webView, message.utf8()));
93     }
94
95     void mouseDidMoveOverElement(WebPageProxy*, const WebHitTestResultData& data, WebEvent::Modifiers modifiers, API::Object*) override
96     {
97         webkitWebViewMouseTargetChanged(m_webView, data, modifiers);
98     }
99
100     void toolbarsAreVisible(WebPageProxy&, Function<void(bool)>&& completionHandler) override
101     {
102         completionHandler(webkit_window_properties_get_toolbar_visible(webkit_web_view_get_window_properties(m_webView)));
103     }
104
105     void setToolbarsAreVisible(WebPageProxy*, bool visible) override
106     {
107         webkitWindowPropertiesSetToolbarVisible(webkit_web_view_get_window_properties(m_webView), visible);
108     }
109
110     bool menuBarIsVisible(WebPageProxy*) override
111     {
112         return webkit_window_properties_get_menubar_visible(webkit_web_view_get_window_properties(m_webView));
113     }
114
115     void setMenuBarIsVisible(WebPageProxy*, bool visible) override
116     {
117         webkitWindowPropertiesSetToolbarVisible(webkit_web_view_get_window_properties(m_webView), visible);
118     }
119
120     bool statusBarIsVisible(WebPageProxy*) override
121     {
122         return webkit_window_properties_get_statusbar_visible(webkit_web_view_get_window_properties(m_webView));
123     }
124
125     void setStatusBarIsVisible(WebPageProxy*, bool visible) override
126     {
127         webkitWindowPropertiesSetStatusbarVisible(webkit_web_view_get_window_properties(m_webView), visible);
128     }
129
130     bool isResizable(WebPageProxy*) override
131     {
132         return webkit_window_properties_get_resizable(webkit_web_view_get_window_properties(m_webView));
133     }
134
135     void setIsResizable(WebPageProxy*, bool resizable) override
136     {
137         webkitWindowPropertiesSetResizable(webkit_web_view_get_window_properties(m_webView), resizable);
138     }
139
140     void setWindowFrame(WebPageProxy*, const WebCore::FloatRect& frame) override
141     {
142 #if PLATFORM(GTK)
143         GdkRectangle geometry = WebCore::IntRect(frame);
144         GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
145         if (webkit_web_view_is_controlled_by_automation(m_webView) && WebCore::widgetIsOnscreenToplevelWindow(window) && gtk_widget_get_visible(window)) {
146             if (geometry.x >= 0 && geometry.y >= 0)
147                 gtk_window_move(GTK_WINDOW(window), geometry.x, geometry.y);
148             if (geometry.width > 0 && geometry.height > 0)
149                 gtk_window_resize(GTK_WINDOW(window), geometry.width, geometry.height);
150         } else
151             webkitWindowPropertiesSetGeometry(webkit_web_view_get_window_properties(m_webView), &geometry);
152 #endif
153     }
154
155     WebCore::FloatRect windowFrame(WebPageProxy*) override
156     {
157 #if PLATFORM(GTK)
158         GdkRectangle geometry = { 0, 0, 0, 0 };
159         GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
160         if (WebCore::widgetIsOnscreenToplevelWindow(window) && gtk_widget_get_visible(window)) {
161             gtk_window_get_position(GTK_WINDOW(window), &geometry.x, &geometry.y);
162             gtk_window_get_size(GTK_WINDOW(window), &geometry.width, &geometry.height);
163         }
164         return WebCore::FloatRect(geometry);
165 #elif PLATFORM(WPE)
166         // FIXME: I guess this is actually the view size in WPE. We need more refactoring here.
167         return { };
168 #endif
169     }
170
171     void exceededDatabaseQuota(WebPageProxy*, WebFrameProxy*, API::SecurityOrigin*, const String&, const String&, unsigned long long /*currentQuota*/, unsigned long long /*currentOriginUsage*/, unsigned long long /*currentDatabaseUsage*/, unsigned long long /*expectedUsage*/, Function<void (unsigned long long)>&& completionHandler) override
172     {
173         static const unsigned long long defaultQuota = 5 * 1024 * 1204; // 5 MB
174         // FIXME: Provide API for this.
175         completionHandler(defaultQuota);
176     }
177
178     bool runOpenPanel(WebPageProxy*, WebFrameProxy*, const WebCore::SecurityOriginData&, API::OpenPanelParameters* parameters, WebOpenPanelResultListenerProxy* listener) override
179     {
180         GRefPtr<WebKitFileChooserRequest> request = adoptGRef(webkitFileChooserRequestCreate(parameters, listener));
181         webkitWebViewRunFileChooserRequest(m_webView, request.get());
182         return true;
183     }
184
185     bool decidePolicyForGeolocationPermissionRequest(WebPageProxy*, WebFrameProxy*, API::SecurityOrigin*, GeolocationPermissionRequestProxy* permissionRequest) override
186     {
187         GRefPtr<WebKitGeolocationPermissionRequest> geolocationPermissionRequest = adoptGRef(webkitGeolocationPermissionRequestCreate(permissionRequest));
188         webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(geolocationPermissionRequest.get()));
189         return true;
190     }
191
192     bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionRequestProxy& permissionRequest) override
193     {
194         GRefPtr<WebKitUserMediaPermissionRequest> userMediaPermissionRequest = adoptGRef(webkitUserMediaPermissionRequestCreate(permissionRequest, userMediaDocumentOrigin, topLevelDocumentOrigin));
195         webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(userMediaPermissionRequest.get()));
196         return true;
197     }
198
199     bool decidePolicyForNotificationPermissionRequest(WebPageProxy*, API::SecurityOrigin*, NotificationPermissionRequest* permissionRequest) override
200     {
201         GRefPtr<WebKitNotificationPermissionRequest> notificationPermissionRequest = adoptGRef(webkitNotificationPermissionRequestCreate(permissionRequest));
202         webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(notificationPermissionRequest.get()));
203         return true;
204     }
205
206 #if PLATFORM(GTK)
207     void printFrame(WebPageProxy*, WebFrameProxy* frame) override
208     {
209         webkitWebViewPrintFrame(m_webView, frame);
210     }
211 #endif
212
213     bool canRunModal() const override { return true; }
214
215     void runModal(WebPageProxy*) override
216     {
217         webkitWebViewRunAsModal(m_webView);
218     }
219
220     void isPlayingMediaDidChange(WebPageProxy&) final
221     {
222         webkitWebViewIsPlayingAudioChanged(m_webView);
223     }
224
225     WebKitWebView* m_webView;
226 };
227
228 void attachUIClientToView(WebKitWebView* webView)
229 {
230     webkitWebViewGetPage(webView).setUIClient(std::make_unique<UIClient>(webView));
231 }
232