[Qt][WK2] Do not apply new viewport properties until after the first visually non...
[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::didFinishFirstNonEmptyLayout()
61 {
62     m_viewportView->d_func()->didFinishFirstNonEmptyLayout();
63 }
64
65 void QtViewInterface::didChangeContentsSize(const QSize& newSize)
66 {
67     m_viewportView->d_func()->didChangeContentsSize(newSize);
68 }
69
70 void QtViewInterface::didChangeViewportProperties(const WebCore::ViewportArguments& args)
71 {
72     m_viewportView->d_func()->didChangeViewportProperties(args);
73 }
74
75 void QtViewInterface::scrollPositionRequested(const QPoint& pos)
76 {
77     m_viewportView->d_func()->scrollPositionRequested(pos);
78 }
79
80 bool QtViewInterface::isActive()
81 {
82     // FIXME: The scene graph does not have the concept of being active or not when this was written.
83     return true;
84 }
85
86 bool QtViewInterface::hasFocus()
87 {
88     return m_pageView->hasFocus();
89 }
90
91 bool QtViewInterface::isVisible()
92 {
93     return m_viewportView->isVisible() && m_pageView->isVisible();
94 }
95
96 void QtViewInterface::startDrag(Qt::DropActions supportedDropActions, const QImage& dragImage, QMimeData* data, QPoint* clientPosition, QPoint* globalPosition, Qt::DropAction* dropAction)
97 {
98     QWindow* window = m_viewportView->canvas();
99     if (!window)
100         return;
101
102     QDrag* drag = new QDrag(window);
103     drag->setPixmap(QPixmap::fromImage(dragImage));
104     drag->setMimeData(data);
105     *dropAction = drag->exec(supportedDropActions);
106     *globalPosition = QCursor::pos();
107     *clientPosition = window->mapFromGlobal(*globalPosition);
108 }
109
110 void QtViewInterface::didChangeUrl(const QUrl& url)
111 {
112     emit m_viewportView->urlChanged(url);
113 }
114
115 void QtViewInterface::didChangeTitle(const QString& newTitle)
116 {
117     emit m_viewportView->titleChanged(newTitle);
118 }
119
120 void QtViewInterface::didChangeToolTip(const QString&)
121 {
122     // There is not yet any UI defined for the tooltips for mobile so we ignore the change.
123 }
124
125 void QtViewInterface::didChangeStatusText(const QString& newMessage)
126 {
127     emit m_viewportView->statusBarMessageChanged(newMessage);
128 }
129
130 void QtViewInterface::didChangeCursor(const QCursor& newCursor)
131 {
132     // FIXME: This is a temporary fix until we get cursor support in QML items.
133     QGuiApplication::setOverrideCursor(newCursor);
134 }
135
136 void QtViewInterface::loadDidBegin()
137 {
138     emit m_viewportView->loadStarted();
139 }
140
141 void QtViewInterface::loadDidCommit()
142 {
143     m_viewportView->d_func()->loadDidCommit();
144 }
145
146 void QtViewInterface::loadDidSucceed()
147 {
148     emit m_viewportView->loadSucceeded();
149 }
150
151 void QtViewInterface::loadDidFail(const QtWebError& error)
152 {
153     emit m_viewportView->loadFailed(static_cast<QQuickWebView::ErrorType>(error.type()), error.errorCode(), error.url());
154 }
155
156 void QtViewInterface::didChangeLoadProgress(int percentageLoaded)
157 {
158     emit m_viewportView->loadProgressChanged(percentageLoaded);
159 }
160
161 void QtViewInterface::didMouseMoveOverElement(const QUrl& linkURL, const QString& linkTitle)
162 {
163     if (linkURL == lastHoveredURL && linkTitle == lastHoveredTitle)
164         return;
165     lastHoveredURL = linkURL;
166     lastHoveredTitle = linkTitle;
167     emit m_viewportView->linkHovered(lastHoveredURL, lastHoveredTitle);
168 }
169
170 void QtViewInterface::showContextMenu(QSharedPointer<QMenu> menu)
171 {
172     // Remove the active menu in case this function is called twice.
173     if (activeMenu)
174         activeMenu->hide();
175
176     if (menu->isEmpty())
177         return;
178
179     QWindow* window = m_viewportView->canvas();
180     if (!window)
181         return;
182
183     activeMenu = menu;
184
185     activeMenu->window()->winId(); // Ensure that the menu has a window
186     Q_ASSERT(activeMenu->window()->windowHandle());
187     activeMenu->window()->windowHandle()->setTransientParent(window);
188
189     QPoint menuPositionInScene = m_viewportView->mapToScene(menu->pos()).toPoint();
190     menu->exec(window->mapToGlobal(menuPositionInScene));
191     // The last function to get out of exec() clear the local copy.
192     if (activeMenu == menu)
193         activeMenu.clear();
194 }
195
196 void QtViewInterface::hideContextMenu()
197 {
198     if (activeMenu)
199         activeMenu->hide();
200 }
201
202 void QtViewInterface::runJavaScriptAlert(const QString& alertText)
203 {
204     m_viewportView->d_func()->runJavaScriptAlert(alertText);
205 }
206
207 bool QtViewInterface::runJavaScriptConfirm(const QString& message)
208 {
209     return m_viewportView->d_func()->runJavaScriptConfirm(message);
210 }
211
212 QString QtViewInterface::runJavaScriptPrompt(const QString& message, const QString& defaultValue, bool& ok)
213 {
214     return m_viewportView->d_func()->runJavaScriptPrompt(message, defaultValue, ok);
215 }
216
217 void QtViewInterface::processDidCrash()
218 {
219     // FIXME
220 }
221
222 void QtViewInterface::didRelaunchProcess()
223 {
224     // FIXME
225 }
226
227 QJSEngine* QtViewInterface::engine()
228 {
229     QQuickView* view = qobject_cast<QQuickView*>(m_pageView->canvas());
230     if (view)
231         return view->engine();
232     return 0;
233 }
234
235
236 void QtViewInterface::downloadRequested(QWebDownloadItem* downloadItem)
237 {
238     if (!downloadItem)
239         return;
240
241     QDeclarativeEngine::setObjectOwnership(downloadItem, QDeclarativeEngine::JavaScriptOwnership);
242     emit m_viewportView->downloadRequested(downloadItem);
243 }
244
245 void QtViewInterface::chooseFiles(WKOpenPanelResultListenerRef listenerRef, const QStringList& selectedFileNames, QtViewInterface::FileChooserType type)
246 {
247     m_viewportView->d_func()->chooseFiles(listenerRef, selectedFileNames, type);
248 }
249
250 }
251