[Qt][WK2] Do not apply new viewport properties until after the first visually non...
[WebKit.git] / Source / WebKit2 / UIProcess / qt / QtWebPageProxy.h
1 /*
2  * Copyright (C) 2010, 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 QtWebPageProxy_h
22 #define QtWebPageProxy_h
23
24 #include "DrawingAreaProxy.h"
25 #include "LayerTreeContext.h"
26 #include "PageClient.h"
27 #include "QtDownloadManager.h"
28 #include "QtPanGestureRecognizer.h"
29 #include "QtPinchGestureRecognizer.h"
30 #include "QtPolicyInterface.h"
31 #include "QtTapGestureRecognizer.h"
32 #include "QtViewInterface.h"
33 #include "ShareableBitmap.h"
34 #include "ViewportArguments.h"
35 #include "WebContext.h"
36 #include "WebPageProxy.h"
37 #include <wtf/RefPtr.h>
38 #include <QBasicTimer>
39 #include <QGraphicsView>
40 #include <QKeyEvent>
41 #include <QTouchEvent>
42 #include <QMenu>
43 #include <QSharedPointer>
44
45 QT_BEGIN_NAMESPACE
46 class QUndoStack;
47 QT_END_NAMESPACE
48
49 class QtWebError;
50 class QWebPreferences;
51 class QWKHistory;
52
53 using namespace WebKit;
54
55 WebCore::DragOperation dropActionToDragOperation(Qt::DropActions actions);
56
57 // FIXME: needs focus in/out, window activation, support through viewStateDidChange().
58 class QtWebPageProxy : public QObject, WebKit::PageClient {
59     Q_OBJECT
60
61 public:
62     enum WebAction {
63         NoWebAction = - 1,
64
65         Back,
66         Forward,
67         Stop,
68         Reload,
69
70         Undo,
71         Redo,
72
73         WebActionCount
74     };
75
76     QtWebPageProxy(WebKit::QtViewInterface*, WebKit::QtViewportInteractionEngine* = 0, WebKit::QtPolicyInterface* = 0, WKContextRef = 0, WKPageGroupRef = 0);
77     ~QtWebPageProxy();
78
79     virtual PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
80
81     virtual bool handleEvent(QEvent*);
82
83     // PageClient
84     virtual void setViewNeedsDisplay(const WebCore::IntRect&);
85     virtual void displayView();
86     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);
87
88     virtual WebCore::IntSize viewSize();
89     virtual bool isViewWindowActive();
90     virtual bool isViewFocused();
91     virtual bool isViewVisible();
92     virtual bool isViewInWindow();
93
94 #if USE(ACCELERATED_COMPOSITING)
95     virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
96     virtual void exitAcceleratedCompositingMode();
97 #endif // USE(ACCELERATED_COMPOSITING)
98     virtual void pageDidRequestScroll(const WebCore::IntPoint&);
99     virtual void processDidCrash();
100     virtual void pageClosed() { }
101     virtual void didRelaunchProcess();
102
103     virtual void didFinishFirstNonEmptyLayout();
104     virtual void didChangeContentsSize(const WebCore::IntSize&);
105     virtual void didChangeViewportProperties(const WebCore::ViewportArguments&);
106
107     virtual void startDrag(const WebCore::DragData&, PassRefPtr<ShareableBitmap> dragImage);
108     virtual void setCursor(const WebCore::Cursor&);
109     virtual void setCursorHiddenUntilMouseMoves(bool hiddenUntilMouseMoves);
110     virtual void toolTipChanged(const WTF::String&, const WTF::String&);
111     virtual void registerEditCommand(PassRefPtr<WebKit::WebEditCommandProxy>, WebKit::WebPageProxy::UndoOrRedo);
112     virtual void clearAllEditCommands();
113     virtual bool canUndoRedo(WebPageProxy::UndoOrRedo);
114     virtual void executeUndoRedo(WebPageProxy::UndoOrRedo);
115     virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&);
116     virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
117     virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&);
118     virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&);
119
120     virtual void doneWithKeyEvent(const WebKit::NativeWebKeyboardEvent&, bool wasEventHandled);
121     virtual void selectionChanged(bool, bool, bool, bool);
122     virtual PassRefPtr<WebKit::WebPopupMenuProxy> createPopupMenuProxy(WebKit::WebPageProxy*);
123     virtual PassRefPtr<WebKit::WebContextMenuProxy> createContextMenuProxy(WebKit::WebPageProxy*);
124
125     virtual void setFindIndicator(PassRefPtr<WebKit::FindIndicator>, bool fadeOut, bool animate);
126
127     virtual void didCommitLoadForMainFrame(bool useCustomRepresentation);
128     virtual void didFinishLoadingDataForCustomRepresentation(const String& suggestedFilename, const CoreIPC::DataReference&);
129     virtual double customRepresentationZoomFactor() { return 1; }
130     virtual void setCustomRepresentationZoomFactor(double) { }
131     virtual void didChangeScrollbarsForMainFrame() const { }
132
133     virtual void flashBackingStoreUpdates(const Vector<WebCore::IntRect>& updateRects);
134     virtual void findStringInCustomRepresentation(const String&, FindOptions, unsigned maxMatchCount) { }
135     virtual void countStringMatchesInCustomRepresentation(const String&, FindOptions, unsigned maxMatchCount) { }
136
137     virtual void didFindZoomableArea(const WebCore::IntPoint&, const WebCore::IntRect&);
138     virtual void didReceiveMessageFromNavigatorQtObject(const String&);
139
140     void didChangeUrl(const QUrl&);
141     void didChangeTitle(const QString&);
142
143     void loadDidBegin();
144     void loadDidCommit();
145     void loadDidSucceed();
146     void loadDidFail(const QtWebError&);
147     void didChangeLoadProgress(int);
148     int loadProgress() const { return m_loadProgress; }
149
150     void paint(QPainter*, const QRect&);
151
152     bool canGoBack() const;
153     void goBack();
154     bool canGoForward() const;
155     void goForward();
156     bool canStop() const;
157     void stop();
158     bool canReload() const;
159     void reload();
160
161     void updateEditorActions();
162
163     WKPageRef pageRef() const;
164
165     void load(const QUrl& url);
166     QUrl url() const;
167
168     void setDrawingAreaSize(const QSize&);
169
170     QWebPreferences* preferences() const;
171
172     QString title() const;
173
174     void setCustomUserAgent(const QString&);
175     QString customUserAgent() const;
176
177     void setNavigatorQtObjectEnabled(bool);
178     bool navigatorQtObjectEnabled() const { return m_navigatorQtObjectEnabled; }
179
180     void setViewportInteractionEngine(QtViewportInteractionEngine* engine) { m_interactionEngine = engine; m_panGestureRecognizer.setViewportInteractionEngine(engine); m_pinchGestureRecognizer.setViewportInteractionEngine(engine);}
181
182     void postMessageToNavigatorQtObject(const QString&);
183
184     qreal textZoomFactor() const;
185     qreal pageZoomFactor() const;
186     void setTextZoomFactor(qreal zoomFactor);
187     void setPageZoomFactor(qreal zoomFactor);
188     void setPageAndTextZoomFactors(qreal pageZoomFactor, qreal textZoomFactor);
189
190     void setVisibleContentRectAndScale(const QRectF&, float);
191     void setVisibleContentRectTrajectoryVector(const QPointF&);
192     void findZoomableAreaForPoint(const QPoint&);
193     void renderToCurrentGLContext(const WebCore::TransformationMatrix&, float);
194
195     QWKHistory* history() const;
196     QtViewInterface* viewInterface() const { return m_viewInterface; }
197
198     void handleDownloadRequest(DownloadProxy*);
199     void init();
200
201     void handleSingleTapEvent(const QTouchEvent::TouchPoint&);
202     void handleDoubleTapEvent(const QTouchEvent::TouchPoint&);
203
204 public Q_SLOTS:
205     void navigationStateChanged();
206     void didReceiveDownloadResponse(QWebDownloadItem*);
207
208 public:
209     Q_SIGNAL void zoomableAreaFound(const QRect&);
210     Q_SIGNAL void updateNavigationState();
211     Q_SIGNAL void receivedMessageFromNavigatorQtObject(const QVariantMap&);
212
213 protected:
214     virtual void paintContent(QPainter* painter, const QRect& area);
215     RefPtr<WebKit::WebPageProxy> m_webPageProxy;
216     WebKit::QtViewInterface* const m_viewInterface;
217     QtViewportInteractionEngine* m_interactionEngine;
218     QtPanGestureRecognizer m_panGestureRecognizer;
219     QtPinchGestureRecognizer m_pinchGestureRecognizer;
220     QtTapGestureRecognizer m_tapGestureRecognizer;
221     WebKit::QtPolicyInterface* const m_policyInterface;
222
223 private:
224     bool handleKeyPressEvent(QKeyEvent*);
225     bool handleKeyReleaseEvent(QKeyEvent*);
226     bool handleFocusInEvent(QFocusEvent*);
227     bool handleFocusOutEvent(QFocusEvent*);
228     bool handleMouseMoveEvent(QMouseEvent*);
229     bool handleMousePressEvent(QMouseEvent*);
230     bool handleMouseReleaseEvent(QMouseEvent*);
231     bool handleMouseDoubleClickEvent(QMouseEvent*);
232     bool handleWheelEvent(QWheelEvent*);
233     bool handleHoverLeaveEvent(QHoverEvent*);
234     bool handleHoverMoveEvent(QHoverEvent*);
235     bool handleDragEnterEvent(QDragEnterEvent*);
236     bool handleDragLeaveEvent(QDragLeaveEvent*);
237     bool handleDragMoveEvent(QDragMoveEvent*);
238     bool handleDropEvent(QDropEvent*);
239
240     virtual void timerEvent(QTimerEvent*);
241
242 #if ENABLE(TOUCH_EVENTS)
243     virtual void doneWithTouchEvent(const NativeWebTouchEvent&, bool wasEventHandled);
244 #endif
245
246     void touchEvent(QTouchEvent*);
247
248     static PassRefPtr<WebContext> defaultWKContext();
249     static RefPtr<WebContext> s_defaultContext;
250     static RefPtr<QtDownloadManager> s_downloadManager;
251     static unsigned s_defaultPageProxyCount;
252
253     RefPtr<WebContext> m_context;
254     QWKHistory* m_history;
255
256     mutable OwnPtr<QWebPreferences> m_preferences;
257
258     OwnPtr<QUndoStack> m_undoStack;
259     int m_loadProgress;
260
261     bool m_navigatorQtObjectEnabled;
262     QPoint m_tripleClick;
263     QBasicTimer m_tripleClickTimer;
264 };
265
266 #endif /* QtWebPageProxy_h */