[Qt] The WebView should be flickable only using touch events
[WebKit-https.git] / Source / WebKit2 / UIProcess / API / qt / qquickwebview_p_p.h
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 #ifndef qquickwebview_p_p_h
22 #define qquickwebview_p_p_h
23
24 #include "DefaultUndoController.h"
25 #include "PageViewportController.h"
26 #include "PageViewportControllerClient.h"
27 #include "QtPageClient.h"
28 #include "QtWebPageUIClient.h"
29
30 #include "qquickwebview_p.h"
31 #include "qquickwebpage_p.h"
32 #include <QtCore/QElapsedTimer>
33 #include <QtCore/QObject>
34 #include <QtCore/QScopedPointer>
35 #include <WebCore/ViewportArguments.h>
36 #include <wtf/OwnPtr.h>
37 #include <wtf/RefPtr.h>
38
39 namespace WebKit {
40 class DownloadProxy;
41 class DrawingAreaProxy;
42 class QtDialogRunner;
43 class PageViewportControllerClientQt;
44 class QtWebContext;
45 class QtWebError;
46 class QtWebPageLoadClient;
47 class QtWebPagePolicyClient;
48 class WebPageProxy;
49 }
50
51 class QWebNavigationHistory;
52 class QWebKitTest;
53
54 QT_BEGIN_NAMESPACE
55 class QQmlComponent;
56 QT_END_NAMESPACE
57
58 class QQuickWebViewPrivate {
59     Q_DECLARE_PUBLIC(QQuickWebView)
60     friend class WebKit::QtDialogRunner;
61     friend class QQuickWebViewExperimental;
62     friend class QQuickWebPage;
63     friend class QWebPreferencesPrivate;
64     friend class QWebKitTest;
65
66 public:
67     static QQuickWebViewPrivate* get(QQuickWebView* q) { return q->d_ptr.data(); }
68
69     virtual ~QQuickWebViewPrivate();
70
71     virtual void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
72
73     virtual void onComponentComplete() { }
74
75     virtual void provisionalLoadDidStart(const WTF::String& url);
76     virtual void didReceiveServerRedirectForProvisionalLoad(const WTF::String& url);
77     virtual void loadDidCommit();
78     virtual void didSameDocumentNavigation();
79     virtual void titleDidChange();
80     virtual void loadProgressDidChange(int loadProgress);
81     virtual void backForwardListDidChange();
82     virtual void loadDidSucceed();
83     virtual void loadDidStop();
84     virtual void loadDidFail(const WebKit::QtWebError& error);
85     virtual void handleMouseEvent(QMouseEvent*);
86
87     virtual void didChangeViewportProperties(const WebCore::ViewportAttributes& attr) { }
88
89     int loadProgress() const { return m_loadProgress; }
90     void setNeedsDisplay();
91     void didRenderFrame();
92
93     virtual WebKit::PageViewportController* viewportController() const { return 0; }
94     virtual void updateViewportSize() { }
95     void updateTouchViewportSize();
96
97     virtual qreal zoomFactor() const { return 1; }
98     virtual void setZoomFactor(qreal) { }
99
100     void _q_onVisibleChanged();
101     void _q_onUrlChanged();
102     void _q_onReceivedResponseFromDownload(QWebDownloadItem*);
103     void _q_onIconChangedForPageURL(const QString&);
104
105     void chooseFiles(WKOpenPanelResultListenerRef, const QStringList& selectedFileNames, WebKit::QtWebPageUIClient::FileChooserType);
106     quint64 exceededDatabaseQuota(const QString& databaseName, const QString& displayName, WKSecurityOriginRef securityOrigin, quint64 currentQuota, quint64 currentOriginUsage, quint64 currentDatabaseUsage, quint64 expectedUsage);
107     void runJavaScriptAlert(const QString&);
108     bool runJavaScriptConfirm(const QString&);
109     QString runJavaScriptPrompt(const QString&, const QString& defaultValue, bool& ok);
110
111     void handleAuthenticationRequiredRequest(const QString& hostname, const QString& realm, const QString& prefilledUsername, QString& username, QString& password);
112     bool handleCertificateVerificationRequest(const QString& hostname);
113     void handleProxyAuthenticationRequiredRequest(const QString& hostname, uint16_t port, const QString& prefilledUsername, QString& username, QString& password);
114
115     void setRenderToOffscreenBuffer(bool enable) { m_renderToOffscreenBuffer = enable; }
116     void setTransparentBackground(bool);
117     void addAttachedPropertyTo(QObject*);
118
119     bool navigatorQtObjectEnabled() const;
120     bool renderToOffscreenBuffer() const { return m_renderToOffscreenBuffer; }
121     bool transparentBackground() const;
122     void setNavigatorQtObjectEnabled(bool);
123     void updateUserScripts();
124
125     QPointF contentPos() const;
126     void setContentPos(const QPointF&);
127
128     void updateIcon();
129
130     // PageClient.
131     WebCore::IntSize viewSize() const;
132     void didReceiveMessageFromNavigatorQtObject(const String& message);
133     virtual void pageDidRequestScroll(const QPoint& pos) { }
134     void processDidCrash();
135     void didRelaunchProcess();
136     PassOwnPtr<WebKit::DrawingAreaProxy> createDrawingAreaProxy();
137     void handleDownloadRequest(WebKit::DownloadProxy*);
138
139 protected:
140     class FlickableAxisLocker {
141         QQuickFlickable::FlickableDirection m_allowedDirection;
142
143         ulong m_time;
144         QPointF m_initialPosition;
145         QPointF m_lockReferencePosition;
146         int m_sampleCount;
147
148         QVector2D touchVelocity(const QTouchEvent* event);
149
150     public:
151         FlickableAxisLocker();
152
153         void update(const QTouchEvent* event);
154         void setReferencePosition(const QPointF&);
155         void reset();
156         QPointF adjust(const QPointF&);
157     };
158
159     QQuickWebViewPrivate(QQuickWebView* viewport);
160     RefPtr<WebKit::QtWebContext> context;
161     RefPtr<WebKit::WebPageProxy> webPageProxy;
162
163     WebKit::QtPageClient pageClient;
164     WebKit::DefaultUndoController undoController;
165     OwnPtr<QWebNavigationHistory> navigationHistory;
166     OwnPtr<QWebPreferences> preferences;
167
168     QScopedPointer<WebKit::QtWebPageLoadClient> pageLoadClient;
169     QScopedPointer<WebKit::QtWebPagePolicyClient> pagePolicyClient;
170     QScopedPointer<WebKit::QtWebPageUIClient> pageUIClient;
171
172     QScopedPointer<QQuickWebPage> pageView;
173     QQuickWebView* q_ptr;
174     QQuickWebViewExperimental* experimental;
175
176     FlickableAxisLocker axisLocker;
177
178     QQmlComponent* alertDialog;
179     QQmlComponent* confirmDialog;
180     QQmlComponent* promptDialog;
181     QQmlComponent* authenticationDialog;
182     QQmlComponent* certificateVerificationDialog;
183     QQmlComponent* itemSelector;
184     QQmlComponent* proxyAuthenticationDialog;
185     QQmlComponent* filePicker;
186     QQmlComponent* databaseQuotaDialog;
187     QQmlComponent* colorChooser;
188
189     QList<QUrl> userScripts;
190
191     bool m_betweenLoadCommitAndFirstFrame;
192     bool m_useDefaultContentItemSize;
193     bool m_navigatorQtObjectEnabled;
194     bool m_renderToOffscreenBuffer;
195     bool m_allowAnyHTTPSCertificateForLocalHost;
196     WTF::String m_iconUrl;
197     int m_loadProgress;
198     WTF::String m_currentUrl;
199 };
200
201 class QQuickWebViewLegacyPrivate : public QQuickWebViewPrivate {
202     Q_DECLARE_PUBLIC(QQuickWebView)
203 public:
204     QQuickWebViewLegacyPrivate(QQuickWebView* viewport);
205     virtual void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
206
207     virtual void updateViewportSize();
208
209     qreal zoomFactor() const;
210     void setZoomFactor(qreal);
211 };
212
213 class QQuickWebViewFlickablePrivate : public QQuickWebViewPrivate {
214     Q_DECLARE_PUBLIC(QQuickWebView)
215 public:
216     QQuickWebViewFlickablePrivate(QQuickWebView* viewport);
217     virtual void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
218
219     virtual void onComponentComplete();
220
221     virtual void didChangeViewportProperties(const WebCore::ViewportAttributes&);
222     virtual WebKit::PageViewportController* viewportController() const { return m_pageViewportController.data(); }
223     virtual void updateViewportSize();
224
225     virtual void pageDidRequestScroll(const QPoint& pos);
226
227 private:
228     QScopedPointer<WebKit::PageViewportController> m_pageViewportController;
229     QScopedPointer<WebKit::PageViewportControllerClientQt> m_pageViewportControllerClient;
230 };
231
232 #endif // qquickwebview_p_p_h