6d8329bdd8e1f34c98ce4c09b427fb9ed8db5247
[WebKit.git] / Source / WebKit2 / UIProcess / qt / QtViewInterface.cpp
1 /*
2  * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
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 program 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 program; 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
21 #include "config.h"
22 #include "QtViewInterface.h"
23
24 #include "QtWebError.h"
25 #include "qquickwebpage.h"
26 #include "qquickwebpage_p.h"
27 #include "qquickwebview.h"
28 #include "qquickwebview_p.h"
29
30 #include <QtDeclarative/QDeclarativeEngine>
31 #include <QtDeclarative/QQuickView>
32 #include <QtGui/QDrag>
33 #include <QtGui/QGuiApplication>
34
35 namespace WebKit {
36
37 QtViewInterface::QtViewInterface(QQuickWebView* viewportView, QQuickWebPage* pageView)
38     : m_viewportView(viewportView)
39     , m_pageView(pageView)
40 {
41     Q_ASSERT(m_viewportView);
42     Q_ASSERT(m_pageView);
43 }
44
45 QtSGUpdateQueue* QtViewInterface::sceneGraphUpdateQueue() const
46 {
47     return &m_pageView->d->sgUpdateQueue;
48 }
49
50 void QtViewInterface::setViewNeedsDisplay(const QRect&)
51 {
52     m_pageView->update();
53 }
54
55 QSize QtViewInterface::drawingAreaSize()
56 {
57     return QSize(m_pageView->width(), m_pageView->height());
58 }
59
60 void QtViewInterface::contentSizeChanged(const QSize& newSize)
61 {
62     m_viewportView->d_func()->contentSizeChanged(newSize);
63 }
64
65 void QtViewInterface::scrollPositionRequested(const QPoint& pos)
66 {
67     m_viewportView->d_func()->scrollPositionRequested(pos);
68 }
69
70 bool QtViewInterface::isActive()
71 {
72     // FIXME: The scene graph does not have the concept of being active or not when this was written.
73     return true;
74 }
75
76 bool QtViewInterface::hasFocus()
77 {
78     return m_pageView->hasFocus();
79 }
80
81 bool QtViewInterface::isVisible()
82 {
83     return m_viewportView->isVisible() && m_pageView->isVisible();
84 }
85
86 void QtViewInterface::startDrag(Qt::DropActions supportedDropActions, const QImage& dragImage, QMimeData* data, QPoint* clientPosition, QPoint* globalPosition, Qt::DropAction* dropAction)
87 {
88     QWindow* window = m_viewportView->canvas();
89     if (!window)
90         return;
91
92     QDrag* drag = new QDrag(window);
93     drag->setPixmap(QPixmap::fromImage(dragImage));
94     drag->setMimeData(data);
95     *dropAction = drag->exec(supportedDropActions);
96     *globalPosition = QCursor::pos();
97     *clientPosition = window->mapFromGlobal(*globalPosition);
98 }
99
100
101 void QtViewInterface::didChangeViewportProperties(const WebCore::ViewportArguments& args)
102 {
103     m_viewportView->d_func()->didChangeViewportProperties(args);
104 }
105
106 void QtViewInterface::didChangeUrl(const QUrl& url)
107 {
108     emit m_viewportView->urlChanged(url);
109 }
110
111 void QtViewInterface::didChangeTitle(const QString& newTitle)
112 {
113     emit m_viewportView->titleChanged(newTitle);
114 }
115
116 void QtViewInterface::didChangeToolTip(const QString&)
117 {
118     // There is not yet any UI defined for the tooltips for mobile so we ignore the change.
119 }
120
121 void QtViewInterface::didChangeStatusText(const QString& newMessage)
122 {
123     emit m_viewportView->statusBarMessageChanged(newMessage);
124 }
125
126 void QtViewInterface::didChangeCursor(const QCursor& newCursor)
127 {
128     // FIXME: This is a temporary fix until we get cursor support in QML items.
129     QGuiApplication::setOverrideCursor(newCursor);
130 }
131
132 void QtViewInterface::loadDidBegin()
133 {
134     emit m_viewportView->loadStarted();
135 }
136
137 void QtViewInterface::loadDidCommit()
138 {
139     m_viewportView->d_func()->loadDidCommit();
140 }
141
142 void QtViewInterface::loadDidSucceed()
143 {
144     emit m_viewportView->loadSucceeded();
145 }
146
147 void QtViewInterface::loadDidFail(const QtWebError& error)
148 {
149     emit m_viewportView->loadFailed(static_cast<QQuickWebView::ErrorType>(error.type()), error.errorCode(), error.url());
150 }
151
152 void QtViewInterface::didChangeLoadProgress(int percentageLoaded)
153 {
154     emit m_viewportView->loadProgressChanged(percentageLoaded);
155 }
156
157 void QtViewInterface::didMouseMoveOverElement(const QUrl& linkURL, const QString& linkTitle)
158 {
159     if (linkURL == lastHoveredURL && linkTitle == lastHoveredTitle)
160         return;
161     lastHoveredURL = linkURL;
162     lastHoveredTitle = linkTitle;
163     emit m_viewportView->linkHovered(lastHoveredURL, lastHoveredTitle);
164 }
165
166 void QtViewInterface::showContextMenu(QSharedPointer<QMenu> menu)
167 {
168     // Remove the active menu in case this function is called twice.
169     if (activeMenu)
170         activeMenu->hide();
171
172     if (menu->isEmpty())
173         return;
174
175     QWindow* window = m_viewportView->canvas();
176     if (!window)
177         return;
178
179     activeMenu = menu;
180
181     activeMenu->window()->winId(); // Ensure that the menu has a window
182     Q_ASSERT(activeMenu->window()->windowHandle());
183     activeMenu->window()->windowHandle()->setTransientParent(window);
184
185     QPoint menuPositionInScene = m_viewportView->mapToScene(menu->pos()).toPoint();
186     menu->exec(window->mapToGlobal(menuPositionInScene));
187     // The last function to get out of exec() clear the local copy.
188     if (activeMenu == menu)
189         activeMenu.clear();
190 }
191
192 void QtViewInterface::hideContextMenu()
193 {
194     if (activeMenu)
195         activeMenu->hide();
196 }
197
198 void QtViewInterface::runJavaScriptAlert(const QString& alertText)
199 {
200     m_viewportView->d_func()->runJavaScriptAlert(alertText);
201 }
202
203 bool QtViewInterface::runJavaScriptConfirm(const QString& message)
204 {
205     return m_viewportView->d_func()->runJavaScriptConfirm(message);
206 }
207
208 QString QtViewInterface::runJavaScriptPrompt(const QString& message, const QString& defaultValue, bool& ok)
209 {
210     return m_viewportView->d_func()->runJavaScriptPrompt(message, defaultValue, ok);
211 }
212
213 void QtViewInterface::processDidCrash()
214 {
215     // FIXME
216 }
217
218 void QtViewInterface::didRelaunchProcess()
219 {
220     // FIXME
221 }
222
223 QJSEngine* QtViewInterface::engine()
224 {
225     QQuickView* view = qobject_cast<QQuickView*>(m_pageView->canvas());
226     if (view)
227         return view->engine();
228     return 0;
229 }
230
231
232 void QtViewInterface::downloadRequested(QWebDownloadItem* downloadItem)
233 {
234     if (!downloadItem)
235         return;
236
237     QDeclarativeEngine::setObjectOwnership(downloadItem, QDeclarativeEngine::JavaScriptOwnership);
238     emit m_viewportView->downloadRequested(downloadItem);
239 }
240
241 void QtViewInterface::chooseFiles(WKOpenPanelResultListenerRef listenerRef, const QStringList& selectedFileNames, QtViewInterface::FileChooserType type)
242 {
243     m_viewportView->d_func()->chooseFiles(listenerRef, selectedFileNames, type);
244 }
245
246 }
247