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_url_request_private.h"
37#include "ewk_window_features_private.h"
38#include <Ecore_Evas.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    WKPageUIClientV2 uiClient;
56    memset(&uiClient, 0, sizeof(WKPageUIClient));
57    uiClient.base.version = 2;
58    uiClient.base.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
83    WKPageSetPageUIClient(pageRef, &uiClient.base);
84
85    // Popup Menu UI client.
86    WKPageUIPopupMenuClientV0 uiPopupMenuClient;
87    memset(&uiPopupMenuClient, 0, sizeof(WKPageUIPopupMenuClientV0));
88    uiPopupMenuClient.base.version = 0;
89    uiPopupMenuClient.base.clientInfo = this;
90    uiPopupMenuClient.showPopupMenu = showPopupMenu;
91    uiPopupMenuClient.hidePopupMenu = hidePopupMenu;
92    WKPageSetUIPopupMenuClient(pageRef, &uiPopupMenuClient.base);
93}
94
95
96void PageUIClientEfl::close(WKPageRef, const void* clientInfo)
97{
98    toPageUIClientEfl(clientInfo)->m_view->close();
99}
100
101void PageUIClientEfl::takeFocus(WKPageRef, WKFocusDirection, const void* clientInfo)
102{
103    // FIXME: this is only a partial implementation.
104    evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), false);
105}
106
107void PageUIClientEfl::focus(WKPageRef, const void* clientInfo)
108{
109    evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), true);
110}
111
112void PageUIClientEfl::unfocus(WKPageRef, const void* clientInfo)
113{
114    evas_object_focus_set(toPageUIClientEfl(clientInfo)->m_view->evasObject(), false);
115}
116
117void PageUIClientEfl::runJavaScriptAlert(WKPageRef, WKStringRef alertText, WKFrameRef, const void* clientInfo)
118{
119    toPageUIClientEfl(clientInfo)->m_view->requestJSAlertPopup(WKEinaSharedString(alertText));
120}
121
122bool PageUIClientEfl::runJavaScriptConfirm(WKPageRef, WKStringRef message, WKFrameRef, const void* clientInfo)
123{
124    return toPageUIClientEfl(clientInfo)->m_view->requestJSConfirmPopup(WKEinaSharedString(message));
125}
126
127WKStringRef PageUIClientEfl::runJavaScriptPrompt(WKPageRef, WKStringRef message, WKStringRef defaultValue, WKFrameRef, const void* clientInfo)
128{
129    WKEinaSharedString value = toPageUIClientEfl(clientInfo)->m_view->requestJSPromptPopup(WKEinaSharedString(message), WKEinaSharedString(defaultValue));
130    return value ? WKStringCreateWithUTF8CString(value) : 0;
131}
132
133bool PageUIClientEfl::toolbarsAreVisible(WKPageRef, const void* clientInfo)
134{
135    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
136    ASSERT(features);
137    return features->toolbarVisible();
138}
139
140void PageUIClientEfl::setToolbarsAreVisible(WKPageRef, bool toolbarVisible, const void* clientInfo)
141{
142    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
143    ASSERT(features);
144    features->setToolbarVisible(toolbarVisible);
145}
146
147bool PageUIClientEfl::menuBarIsVisible(WKPageRef, const void* clientInfo)
148{
149    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
150    ASSERT(features);
151    return features->menuBarVisible();
152}
153
154void PageUIClientEfl::setMenuBarIsVisible(WKPageRef, bool menuBarVisible, const void* clientInfo)
155{
156    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
157    ASSERT(features);
158    features->setMenuBarVisible(menuBarVisible);
159}
160
161bool PageUIClientEfl::statusBarIsVisible(WKPageRef, const void* clientInfo)
162{
163    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
164    ASSERT(features);
165    return features->statusBarVisible();
166}
167
168void PageUIClientEfl::setStatusBarIsVisible(WKPageRef, bool statusBarVisible, const void* clientInfo)
169{
170    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
171    ASSERT(features);
172    features->setStatusBarVisible(statusBarVisible);
173}
174
175bool PageUIClientEfl::isResizable(WKPageRef, const void* clientInfo)
176{
177    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
178    ASSERT(features);
179    return features->resizable();
180}
181
182void PageUIClientEfl::setIsResizable(WKPageRef, bool resizable, const void* clientInfo)
183{
184    EwkWindowFeatures* features = toPageUIClientEfl(clientInfo)->m_view->windowFeatures();
185    ASSERT(features);
186    features->setResizable(resizable);
187}
188
189WKRect PageUIClientEfl::getWindowFrame(WKPageRef, const void* clientInfo)
190{
191    return toPageUIClientEfl(clientInfo)->m_view->windowGeometry();
192}
193
194void PageUIClientEfl::setWindowFrame(WKPageRef, WKRect frame, const void* clientInfo)
195{
196    toPageUIClientEfl(clientInfo)->m_view->setWindowGeometry(frame);
197}
198
199bool PageUIClientEfl::runBeforeUnloadConfirmPanel(WKPageRef, WKStringRef message, WKFrameRef, const void* clientInfo)
200{
201    return toPageUIClientEfl(clientInfo)->m_view->requestJSConfirmPopup(WKEinaSharedString(message));
202}
203
204#if ENABLE(SQL_DATABASE)
205unsigned 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)
206{
207    EwkView* view = toPageUIClientEfl(clientInfo)->m_view;
208    return view->informDatabaseQuotaReached(toImpl(databaseName)->string(), toImpl(displayName)->string(), currentQuota, currentOriginUsage, currentDatabaseUsage, expectedUsage);
209}
210#endif
211
212void PageUIClientEfl::runOpenPanel(WKPageRef, WKFrameRef, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo)
213{
214    EwkView* view = toPageUIClientEfl(clientInfo)->m_view;
215    RefPtr<EwkFileChooserRequest> fileChooserRequest = EwkFileChooserRequest::create(parameters, listener);
216    view->smartCallback<FileChooserRequest>().call(fileChooserRequest.get());
217}
218
219WKPageRef PageUIClientEfl::createNewPage(WKPageRef, WKURLRequestRef wkRequest, WKDictionaryRef wkWindowFeatures, WKEventModifiers, WKEventMouseButton, const void* clientInfo)
220{
221    RefPtr<EwkUrlRequest> request = EwkUrlRequest::create(wkRequest);
222    return toPageUIClientEfl(clientInfo)->m_view->createNewPage(request, wkWindowFeatures);
223}
224
225void PageUIClientEfl::showPopupMenu(WKPageRef, WKPopupMenuListenerRef menuListenerRef, WKRect rect, WKPopupItemTextDirection textDirection, double pageScaleFactor, WKArrayRef itemsRef, int32_t selectedIndex, const void* clientInfo)
226{
227    return toPageUIClientEfl(clientInfo)->m_view->requestPopupMenu(menuListenerRef, rect, textDirection, pageScaleFactor, itemsRef, selectedIndex);
228}
229
230void PageUIClientEfl::hidePopupMenu(WKPageRef, const void* clientInfo)
231{
232    return toPageUIClientEfl(clientInfo)->m_view->closePopupMenu();
233}
234
235} // namespace WebKit
236