[EFL][WK2] Use C API inside ewk_window_features
[WebKit-https.git] / Source / WebKit2 / UIProcess / efl / PageUIClientEfl.cpp
1 /*
2  * Copyright (C) 2012 Samsung Electronics. All rights reserved.
3  * Copyright (C) 2012 Intel Corporation. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "PageUIClientEfl.h"
29
30 #include "EwkView.h"
31 #include "WKAPICast.h"
32 #include "WKEvent.h"
33 #include "WKString.h"
34 #include "ewk_file_chooser_request_private.h"
35 #include "ewk_window_features_private.h"
36 #include <Ecore_Evas.h>
37 #include <WebCore/Color.h>
38
39 using namespace EwkViewCallbacks;
40
41 namespace WebKit {
42
43 static inline PageUIClientEfl* toPageUIClientEfl(const void* clientInfo)
44 {
45     return static_cast<PageUIClientEfl*>(const_cast<void*>(clientInfo));
46 }
47
48 PageUIClientEfl::PageUIClientEfl(EwkView* view)
49     : m_view(view)
50 {
51     WKPageRef pageRef = m_view->wkPage();
52     ASSERT(pageRef);
53
54     WKPageUIClient uiClient;
55     memset(&uiClient, 0, sizeof(WKPageUIClient));
56     uiClient.version = kWKPageUIClientCurrentVersion;
57     uiClient.clientInfo = this;
58     uiClient.close = close;
59     uiClient.takeFocus = takeFocus;
60     uiClient.focus = focus;
61     uiClient.unfocus = unfocus;
62     uiClient.runJavaScriptAlert = runJavaScriptAlert;
63     uiClient.runJavaScriptConfirm = runJavaScriptConfirm;
64     uiClient.runJavaScriptPrompt = runJavaScriptPrompt;
65     uiClient.toolbarsAreVisible = toolbarsAreVisible;
66     uiClient.setToolbarsAreVisible = setToolbarsAreVisible;
67     uiClient.menuBarIsVisible = menuBarIsVisible;
68     uiClient.setMenuBarIsVisible = setMenuBarIsVisible;
69     uiClient.statusBarIsVisible = statusBarIsVisible;
70     uiClient.setStatusBarIsVisible = setStatusBarIsVisible;
71     uiClient.isResizable = isResizable;
72     uiClient.setIsResizable = setIsResizable;
73     uiClient.getWindowFrame = getWindowFrame;
74     uiClient.setWindowFrame = setWindowFrame;
75 #if ENABLE(SQL_DATABASE)
76     uiClient.exceededDatabaseQuota = exceededDatabaseQuota;
77 #endif
78     uiClient.runOpenPanel = runOpenPanel;
79     uiClient.createNewPage = createNewPage;
80 #if ENABLE(INPUT_TYPE_COLOR)
81     uiClient.showColorPicker = showColorPicker;
82     uiClient.hideColorPicker = hideColorPicker;
83 #endif
84
85     WKPageSetPageUIClient(pageRef, &uiClient);
86 }
87
88
89 void PageUIClientEfl::close(WKPageRef, const void* clientInfo)
90 {
91     toPageUIClientEfl(clientInfo)->m_view->close();
92 }
93
94 void PageUIClientEfl::takeFocus(WKPageRef, WKFocusDirection, const void* clientInfo)
95 {
96     // FIXME: this is only a partial implementation.
97     evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->view(), false);
98 }
99
100 void PageUIClientEfl::focus(WKPageRef, const void* clientInfo)
101 {
102     evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->view(), true);
103 }
104
105 void PageUIClientEfl::unfocus(WKPageRef, const void* clientInfo)
106 {
107     evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->view(), false);
108 }
109
110 void PageUIClientEfl::runJavaScriptAlert(WKPageRef, WKStringRef alertText, WKFrameRef, const void* clientInfo)
111 {
112     toPageUIClientEfl(clientInfo)->m_view->requestJSAlertPopup(WKEinaSharedString(alertText));
113 }
114
115 bool PageUIClientEfl::runJavaScriptConfirm(WKPageRef, WKStringRef message, WKFrameRef, const void* clientInfo)
116 {
117     return toPageUIClientEfl(clientInfo)->m_view->requestJSConfirmPopup(WKEinaSharedString(message));
118 }
119
120 WKStringRef PageUIClientEfl::runJavaScriptPrompt(WKPageRef, WKStringRef message, WKStringRef defaultValue, WKFrameRef, const void* clientInfo)
121 {
122     WKEinaSharedString value = toPageUIClientEfl(clientInfo)->m_view->requestJSPromptPopup(WKEinaSharedString(message), WKEinaSharedString(defaultValue));
123     return value ? WKStringCreateWithUTF8CString(value) : 0;
124 }
125
126 bool PageUIClientEfl::toolbarsAreVisible(WKPageRef, const void* clientInfo)
127 {
128     EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
129     ASSERT(features);
130     return features->toolbarVisible();
131 }
132
133 void PageUIClientEfl::setToolbarsAreVisible(WKPageRef, bool toolbarVisible, const void* clientInfo)
134 {
135     EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
136     ASSERT(features);
137     features->setToolbarVisible(toolbarVisible);
138 }
139
140 bool PageUIClientEfl::menuBarIsVisible(WKPageRef, const void* clientInfo)
141 {
142     EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
143     ASSERT(features);
144     return features->menuBarVisible();
145 }
146
147 void PageUIClientEfl::setMenuBarIsVisible(WKPageRef, bool menuBarVisible, const void* clientInfo)
148 {
149     EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
150     ASSERT(features);
151     features->setMenuBarVisible(menuBarVisible);
152 }
153
154 bool PageUIClientEfl::statusBarIsVisible(WKPageRef, const void* clientInfo)
155 {
156     EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
157     ASSERT(features);
158     return features->statusBarVisible();
159 }
160
161 void PageUIClientEfl::setStatusBarIsVisible(WKPageRef, bool statusBarVisible, const void* clientInfo)
162 {
163     EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
164     ASSERT(features);
165     features->setStatusBarVisible(statusBarVisible);
166 }
167
168 bool PageUIClientEfl::isResizable(WKPageRef, const void* clientInfo)
169 {
170     EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
171     ASSERT(features);
172     return features->resizable();
173 }
174
175 void PageUIClientEfl::setIsResizable(WKPageRef, bool resizable, const void* clientInfo)
176 {
177     EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
178     ASSERT(features);
179     features->setResizable(resizable);
180 }
181
182 WKRect PageUIClientEfl::getWindowFrame(WKPageRef, const void* clientInfo)
183 {
184     return toPageUIClientEfl(clientInfo)->m_view->windowGeometry();
185 }
186
187 void PageUIClientEfl::setWindowFrame(WKPageRef, WKRect frame, const void* clientInfo)
188 {
189     toPageUIClientEfl(clientInfo)->m_view->setWindowGeometry(frame);
190 }
191
192 #if ENABLE(SQL_DATABASE)
193 unsigned long long PageUIClientEfl::exceededDatabaseQuota(WKPageRef, WKFrameRef, WKSecurityOriginRef, WKStringRef databaseName, WKStringRef displayName, unsigned long long currentQuota, unsigned long long currentOriginUsage, unsigned long long currentDatabaseUsage, unsigned long long expectedUsage, const void* clientInfo)
194 {
195     EwkView* view = toPageUIClientEfl(clientInfo)->m_view;
196     return view->informDatabaseQuotaReached(toImpl(databaseName)->string(), toImpl(displayName)->string(), currentQuota, currentOriginUsage, currentDatabaseUsage, expectedUsage);
197 }
198 #endif
199
200 void PageUIClientEfl::runOpenPanel(WKPageRef, WKFrameRef, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo)
201 {
202     EwkView* view = toPageUIClientEfl(clientInfo)->m_view;
203     RefPtr<EwkFileChooserRequest> fileChooserRequest = EwkFileChooserRequest::create(toImpl(parameters), toImpl(listener));
204     view->smartCallback<FileChooserRequest>().call(fileChooserRequest.get());
205 }
206
207 WKPageRef PageUIClientEfl::createNewPage(WKPageRef, WKURLRequestRef wkRequest, WKDictionaryRef wkWindowFeatures, WKEventModifiers, WKEventMouseButton, const void* clientInfo)
208 {
209     RefPtr<EwkUrlRequest> request = EwkUrlRequest::create(wkRequest);
210     return toPageUIClientEfl(clientInfo)->m_view->createNewPage(request, wkWindowFeatures);
211 }
212
213 #if ENABLE(INPUT_TYPE_COLOR)
214 void PageUIClientEfl::showColorPicker(WKPageRef, WKStringRef initialColor, WKColorPickerResultListenerRef listener, const void* clientInfo)
215 {
216     PageUIClientEfl* pageUIClient = toPageUIClientEfl(clientInfo);
217     WebCore::Color color = WebCore::Color(WebKit::toWTFString(initialColor));
218     pageUIClient->m_view->requestColorPicker(listener, color);
219 }
220
221 void PageUIClientEfl::hideColorPicker(WKPageRef, const void* clientInfo)
222 {
223     PageUIClientEfl* pageUIClient = toPageUIClientEfl(clientInfo);
224     pageUIClient->m_view->dismissColorPicker();
225 }
226 #endif
227
228 } // namespace WebKit