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 "WKPageEfl.h"
34#include "WKString.h"
35#include "ewk_file_chooser_request_private.h"
36#include "ewk_window_features_private.h"
37#include <Ecore_Evas.h>
38#include <WebCore/Color.h>
39
40using namespace EwkViewCallbacks;
41
42namespace WebKit {
43
44static inline PageUIClientEfl* toPageUIClientEfl(const void* clientInfo)
45{
46    return static_cast<PageUIClientEfl*>(const_cast<void*>(clientInfo));
47}
48
49PageUIClientEfl::PageUIClientEfl(EwkView* view)
50    : m_view(view)
51{
52    WKPageRef pageRef = m_view->wkPage();
53    ASSERT(pageRef);
54
55    WKPageUIClient uiClient;
56    memset(&uiClient, 0, sizeof(WKPageUIClient));
57    uiClient.version = kWKPageUIClientCurrentVersion;
58    uiClient.clientInfo = this;
59    uiClient.close = close;
60    uiClient.takeFocus = takeFocus;
61    uiClient.focus = focus;
62    uiClient.unfocus = unfocus;
63    uiClient.runJavaScriptAlert = runJavaScriptAlert;
64    uiClient.runJavaScriptConfirm = runJavaScriptConfirm;
65    uiClient.runJavaScriptPrompt = runJavaScriptPrompt;
66    uiClient.toolbarsAreVisible = toolbarsAreVisible;
67    uiClient.setToolbarsAreVisible = setToolbarsAreVisible;
68    uiClient.menuBarIsVisible = menuBarIsVisible;
69    uiClient.setMenuBarIsVisible = setMenuBarIsVisible;
70    uiClient.statusBarIsVisible = statusBarIsVisible;
71    uiClient.setStatusBarIsVisible = setStatusBarIsVisible;
72    uiClient.isResizable = isResizable;
73    uiClient.setIsResizable = setIsResizable;
74    uiClient.getWindowFrame = getWindowFrame;
75    uiClient.setWindowFrame = setWindowFrame;
76    uiClient.runBeforeUnloadConfirmPanel = runBeforeUnloadConfirmPanel;
77#if ENABLE(SQL_DATABASE)
78    uiClient.exceededDatabaseQuota = exceededDatabaseQuota;
79#endif
80    uiClient.runOpenPanel = runOpenPanel;
81    uiClient.createNewPage = createNewPage;
82#if ENABLE(INPUT_TYPE_COLOR)
83    uiClient.showColorPicker = showColorPicker;
84    uiClient.hideColorPicker = hideColorPicker;
85#endif
86
87    WKPageSetPageUIClient(pageRef, &uiClient);
88
89    // Popup Menu UI client.
90    WKPageUIPopupMenuClient uiPopupMenuClient;
91    memset(&uiPopupMenuClient, 0, sizeof(WKPageUIPopupMenuClient));
92    uiPopupMenuClient.version = kWKPageUIPopupMenuClientCurrentVersion;
93    uiPopupMenuClient.clientInfo = this;
94    uiPopupMenuClient.showPopupMenu = showPopupMenu;
95    uiPopupMenuClient.hidePopupMenu = hidePopupMenu;
96    WKPageSetUIPopupMenuClient(pageRef, &uiPopupMenuClient);
97}
98
99
100void PageUIClientEfl::close(WKPageRef, const void* clientInfo)
101{
102    toPageUIClientEfl(clientInfo)->m_view->close();
103}
104
105void PageUIClientEfl::takeFocus(WKPageRef, WKFocusDirection, const void* clientInfo)
106{
107    // FIXME: this is only a partial implementation.
108    evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), false);
109}
110
111void PageUIClientEfl::focus(WKPageRef, const void* clientInfo)
112{
113    evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), true);
114}
115
116void PageUIClientEfl::unfocus(WKPageRef, const void* clientInfo)
117{
118    evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), false);
119}
120
121void PageUIClientEfl::runJavaScriptAlert(WKPageRef, WKStringRef alertText, WKFrameRef, const void* clientInfo)
122{
123    toPageUIClientEfl(clientInfo)->m_view->requestJSAlertPopup(WKEinaSharedString(alertText));
124}
125
126bool PageUIClientEfl::runJavaScriptConfirm(WKPageRef, WKStringRef message, WKFrameRef, const void* clientInfo)
127{
128    return toPageUIClientEfl(clientInfo)->m_view->requestJSConfirmPopup(WKEinaSharedString(message));
129}
130
131WKStringRef PageUIClientEfl::runJavaScriptPrompt(WKPageRef, WKStringRef message, WKStringRef defaultValue, WKFrameRef, const void* clientInfo)
132{
133    WKEinaSharedString value = toPageUIClientEfl(clientInfo)->m_view->requestJSPromptPopup(WKEinaSharedString(message), WKEinaSharedString(defaultValue));
134    return value ? WKStringCreateWithUTF8CString(value) : 0;
135}
136
137bool PageUIClientEfl::toolbarsAreVisible(WKPageRef, const void* clientInfo)
138{
139    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
140    ASSERT(features);
141    return features->toolbarVisible();
142}
143
144void PageUIClientEfl::setToolbarsAreVisible(WKPageRef, bool toolbarVisible, const void* clientInfo)
145{
146    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
147    ASSERT(features);
148    features->setToolbarVisible(toolbarVisible);
149}
150
151bool PageUIClientEfl::menuBarIsVisible(WKPageRef, const void* clientInfo)
152{
153    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
154    ASSERT(features);
155    return features->menuBarVisible();
156}
157
158void PageUIClientEfl::setMenuBarIsVisible(WKPageRef, bool menuBarVisible, const void* clientInfo)
159{
160    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
161    ASSERT(features);
162    features->setMenuBarVisible(menuBarVisible);
163}
164
165bool PageUIClientEfl::statusBarIsVisible(WKPageRef, const void* clientInfo)
166{
167    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
168    ASSERT(features);
169    return features->statusBarVisible();
170}
171
172void PageUIClientEfl::setStatusBarIsVisible(WKPageRef, bool statusBarVisible, const void* clientInfo)
173{
174    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
175    ASSERT(features);
176    features->setStatusBarVisible(statusBarVisible);
177}
178
179bool PageUIClientEfl::isResizable(WKPageRef, const void* clientInfo)
180{
181    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
182    ASSERT(features);
183    return features->resizable();
184}
185
186void PageUIClientEfl::setIsResizable(WKPageRef, bool resizable, const void* clientInfo)
187{
188    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
189    ASSERT(features);
190    features->setResizable(resizable);
191}
192
193WKRect PageUIClientEfl::getWindowFrame(WKPageRef, const void* clientInfo)
194{
195    return toPageUIClientEfl(clientInfo)->m_view->windowGeometry();
196}
197
198void PageUIClientEfl::setWindowFrame(WKPageRef, WKRect frame, const void* clientInfo)
199{
200    toPageUIClientEfl(clientInfo)->m_view->setWindowGeometry(frame);
201}
202
203bool PageUIClientEfl::runBeforeUnloadConfirmPanel(WKPageRef, WKStringRef message, WKFrameRef, const void* clientInfo)
204{
205    return toPageUIClientEfl(clientInfo)->m_view->requestJSConfirmPopup(WKEinaSharedString(message));
206}
207
208#if ENABLE(SQL_DATABASE)
209unsigned 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)
210{
211    EwkView* view = toPageUIClientEfl(clientInfo)->m_view;
212    return view->informDatabaseQuotaReached(toImpl(databaseName)->string(), toImpl(displayName)->string(), currentQuota, currentOriginUsage, currentDatabaseUsage, expectedUsage);
213}
214#endif
215
216void PageUIClientEfl::runOpenPanel(WKPageRef, WKFrameRef, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo)
217{
218    EwkView* view = toPageUIClientEfl(clientInfo)->m_view;
219    RefPtr<EwkFileChooserRequest> fileChooserRequest = EwkFileChooserRequest::create(parameters, listener);
220    view->smartCallback<FileChooserRequest>().call(fileChooserRequest.get());
221}
222
223WKPageRef PageUIClientEfl::createNewPage(WKPageRef, WKURLRequestRef wkRequest, WKDictionaryRef wkWindowFeatures, WKEventModifiers, WKEventMouseButton, const void* clientInfo)
224{
225    RefPtr<EwkUrlRequest> request = EwkUrlRequest::create(wkRequest);
226    return toPageUIClientEfl(clientInfo)->m_view->createNewPage(request, wkWindowFeatures);
227}
228
229#if ENABLE(INPUT_TYPE_COLOR)
230void PageUIClientEfl::showColorPicker(WKPageRef, WKStringRef initialColor, WKColorPickerResultListenerRef listener, const void* clientInfo)
231{
232    PageUIClientEfl* pageUIClient = toPageUIClientEfl(clientInfo);
233    WebCore::Color color = WebCore::Color(WebKit::toWTFString(initialColor));
234    pageUIClient->m_view->requestColorPicker(listener, color);
235}
236
237void PageUIClientEfl::hideColorPicker(WKPageRef, const void* clientInfo)
238{
239    PageUIClientEfl* pageUIClient = toPageUIClientEfl(clientInfo);
240    pageUIClient->m_view->dismissColorPicker();
241}
242#endif
243
244void PageUIClientEfl::showPopupMenu(WKPageRef, WKPopupMenuListenerRef menuListenerRef, WKRect rect, WKPopupItemTextDirection textDirection, double pageScaleFactor, WKArrayRef itemsRef, int32_t selectedIndex, const void* clientInfo)
245{
246    return toPageUIClientEfl(clientInfo)->m_view->requestPopupMenu(menuListenerRef, rect, textDirection, pageScaleFactor, itemsRef, selectedIndex);
247}
248
249void PageUIClientEfl::hidePopupMenu(WKPageRef, const void* clientInfo)
250{
251    return toPageUIClientEfl(clientInfo)->m_view->closePopupMenu();
252}
253
254} // namespace WebKit
255