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