1/*
2    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
3    Copyright (C) 2007 Staikos Computing Services Inc.
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public
7    License as published by the Free Software Foundation; either
8    version 2 of the License, or (at your option) any later version.
9
10    This library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public License
16    along with this library; see the file COPYING.LIB.  If not, write to
17    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18    Boston, MA 02110-1301, USA.
19*/
20
21#ifndef QWEBPAGE_H
22#define QWEBPAGE_H
23
24#include "qwebsettings.h"
25#include "qwebkitglobal.h"
26
27#include <QtCore/qobject.h>
28#include <QtCore/qurl.h>
29#include <QtGui/qwidget.h>
30
31QT_BEGIN_NAMESPACE
32class QNetworkProxy;
33class QUndoStack;
34class QMenu;
35class QNetworkRequest;
36class QNetworkReply;
37class QNetworkAccessManager;
38QT_END_NAMESPACE
39
40class QWebElement;
41class QWebFrame;
42class QWebNetworkRequest;
43class QWebHistory;
44
45class QWebPagePrivate;
46class QWebFrameData;
47class QWebNetworkInterface;
48class QWebPluginFactory;
49class QWebHitTestResult;
50class QWebHistoryItem;
51
52namespace WebCore {
53    class ChromeClientQt;
54    class EditorClientQt;
55    class FrameLoaderClientQt;
56    class InspectorClientQt;
57    class ResourceHandle;
58    class HitTestResult;
59    class QNetworkReplyHandler;
60
61    struct FrameLoadRequest;
62}
63
64class QWEBKIT_EXPORT QWebPage : public QObject {
65    Q_OBJECT
66
67    Q_PROPERTY(bool modified READ isModified)
68    Q_PROPERTY(QString selectedText READ selectedText)
69    Q_PROPERTY(QSize viewportSize READ viewportSize WRITE setViewportSize)
70    Q_PROPERTY(QSize preferredContentsSize READ preferredContentsSize WRITE setPreferredContentsSize)
71    Q_PROPERTY(bool forwardUnsupportedContent READ forwardUnsupportedContent WRITE setForwardUnsupportedContent)
72    Q_PROPERTY(LinkDelegationPolicy linkDelegationPolicy READ linkDelegationPolicy WRITE setLinkDelegationPolicy)
73    Q_PROPERTY(QPalette palette READ palette WRITE setPalette)
74    Q_PROPERTY(bool contentEditable READ isContentEditable WRITE setContentEditable)
75    Q_ENUMS(LinkDelegationPolicy NavigationType WebAction)
76public:
77    enum NavigationType {
78        NavigationTypeLinkClicked,
79        NavigationTypeFormSubmitted,
80        NavigationTypeBackOrForward,
81        NavigationTypeReload,
82        NavigationTypeFormResubmitted,
83        NavigationTypeOther
84    };
85
86    enum WebAction {
87        NoWebAction = - 1,
88
89        OpenLink,
90
91        OpenLinkInNewWindow,
92        OpenFrameInNewWindow,
93
94        DownloadLinkToDisk,
95        CopyLinkToClipboard,
96
97        OpenImageInNewWindow,
98        DownloadImageToDisk,
99        CopyImageToClipboard,
100
101        Back,
102        Forward,
103        Stop,
104        Reload,
105
106        Cut,
107        Copy,
108        Paste,
109
110        Undo,
111        Redo,
112        MoveToNextChar,
113        MoveToPreviousChar,
114        MoveToNextWord,
115        MoveToPreviousWord,
116        MoveToNextLine,
117        MoveToPreviousLine,
118        MoveToStartOfLine,
119        MoveToEndOfLine,
120        MoveToStartOfBlock,
121        MoveToEndOfBlock,
122        MoveToStartOfDocument,
123        MoveToEndOfDocument,
124        SelectNextChar,
125        SelectPreviousChar,
126        SelectNextWord,
127        SelectPreviousWord,
128        SelectNextLine,
129        SelectPreviousLine,
130        SelectStartOfLine,
131        SelectEndOfLine,
132        SelectStartOfBlock,
133        SelectEndOfBlock,
134        SelectStartOfDocument,
135        SelectEndOfDocument,
136        DeleteStartOfWord,
137        DeleteEndOfWord,
138
139        SetTextDirectionDefault,
140        SetTextDirectionLeftToRight,
141        SetTextDirectionRightToLeft,
142
143        ToggleBold,
144        ToggleItalic,
145        ToggleUnderline,
146
147        InspectElement,
148
149        InsertParagraphSeparator,
150        InsertLineSeparator,
151
152        SelectAll,
153        ReloadAndBypassCache,
154
155        PasteAndMatchStyle,
156        RemoveFormat,
157
158        ToggleStrikethrough,
159        ToggleSubscript,
160        ToggleSuperscript,
161        InsertUnorderedList,
162        InsertOrderedList,
163        Indent,
164        Outdent,
165
166        AlignCenter,
167        AlignJustified,
168        AlignLeft,
169        AlignRight,
170
171        WebActionCount
172    };
173
174    enum FindFlag {
175        FindBackward = 1,
176        FindCaseSensitively = 2,
177        FindWrapsAroundDocument = 4,
178        HighlightAllOccurrences = 8
179    };
180    Q_DECLARE_FLAGS(FindFlags, FindFlag)
181
182    enum LinkDelegationPolicy {
183        DontDelegateLinks,
184        DelegateExternalLinks,
185        DelegateAllLinks
186    };
187
188    enum WebWindowType {
189        WebBrowserWindow,
190        WebModalDialog
191    };
192
193    explicit QWebPage(QObject *parent = 0);
194    ~QWebPage();
195
196    QWebFrame *mainFrame() const;
197    QWebFrame *currentFrame() const;
198    QWebFrame* frameAt(const QPoint& pos) const;
199
200    QWebHistory *history() const;
201    QWebSettings *settings() const;
202
203    void setView(QWidget *view);
204    QWidget *view() const;
205
206    bool isModified() const;
207#ifndef QT_NO_UNDOSTACK
208    QUndoStack *undoStack() const;
209#endif
210
211    void setNetworkAccessManager(QNetworkAccessManager *manager);
212    QNetworkAccessManager *networkAccessManager() const;
213
214    void setPluginFactory(QWebPluginFactory *factory);
215    QWebPluginFactory *pluginFactory() const;
216
217    quint64 totalBytes() const;
218    quint64 bytesReceived() const;
219
220    QString selectedText() const;
221
222    QAction *action(WebAction action) const;
223    virtual void triggerAction(WebAction action, bool checked = false);
224
225    QSize viewportSize() const;
226    void setViewportSize(const QSize &size) const;
227
228    QSize preferredContentsSize() const;
229    void setPreferredContentsSize(const QSize &size) const;
230
231    virtual bool event(QEvent*);
232    bool focusNextPrevChild(bool next);
233
234    QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
235
236    bool findText(const QString &subString, FindFlags options = 0);
237
238    void setForwardUnsupportedContent(bool forward);
239    bool forwardUnsupportedContent() const;
240
241    void setLinkDelegationPolicy(LinkDelegationPolicy policy);
242    LinkDelegationPolicy linkDelegationPolicy() const;
243
244    void setPalette(const QPalette &palette);
245    QPalette palette() const;
246
247    void setContentEditable(bool editable);
248    bool isContentEditable() const;
249
250#ifndef QT_NO_CONTEXTMENU
251    bool swallowContextMenuEvent(QContextMenuEvent *event);
252#endif
253    void updatePositionDependentActions(const QPoint &pos);
254
255    QMenu *createStandardContextMenu();
256
257    enum Extension {
258        ChooseMultipleFilesExtension,
259        ErrorPageExtension
260    };
261    class ExtensionOption
262    {};
263    class ExtensionReturn
264    {};
265
266    class ChooseMultipleFilesExtensionOption : public ExtensionOption {
267    public:
268        QWebFrame *parentFrame;
269        QStringList suggestedFileNames;
270    };
271
272    class ChooseMultipleFilesExtensionReturn : public ExtensionReturn {
273    public:
274        QStringList fileNames;
275    };
276
277    enum ErrorDomain { QtNetwork, Http, WebKit };
278    class ErrorPageExtensionOption : public ExtensionOption {
279    public:
280        QUrl url;
281        QWebFrame* frame;
282        ErrorDomain domain;
283        int error;
284        QString errorString;
285    };
286
287    class ErrorPageExtensionReturn : public ExtensionReturn {
288    public:
289        ErrorPageExtensionReturn() : contentType(QLatin1String("text/html")), encoding(QLatin1String("utf-8")) {};
290        QString contentType;
291        QString encoding;
292        QUrl baseUrl;
293        QByteArray content;
294    };
295
296
297    virtual bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0);
298    virtual bool supportsExtension(Extension extension) const;
299
300    inline QWebPagePrivate* handle() const { return d; }
301
302public Q_SLOTS:
303    bool shouldInterruptJavaScript();
304
305Q_SIGNALS:
306    void loadStarted();
307    void loadProgress(int progress);
308    void loadFinished(bool ok);
309
310    void linkHovered(const QString &link, const QString &title, const QString &textContent);
311    void statusBarMessage(const QString& text);
312    void selectionChanged();
313    void frameCreated(QWebFrame *frame);
314    void geometryChangeRequested(const QRect& geom);
315    void repaintRequested(const QRect& dirtyRect);
316    void scrollRequested(int dx, int dy, const QRect& scrollViewRect);
317    void windowCloseRequested();
318    void printRequested(QWebFrame *frame);
319    void linkClicked(const QUrl &url);
320
321    void toolBarVisibilityChangeRequested(bool visible);
322    void statusBarVisibilityChangeRequested(bool visible);
323    void menuBarVisibilityChangeRequested(bool visible);
324
325    void unsupportedContent(QNetworkReply *reply);
326    void downloadRequested(const QNetworkRequest &request);
327
328    void microFocusChanged();
329    void contentsChanged();
330    void databaseQuotaExceeded(QWebFrame* frame, QString databaseName);
331
332    void saveFrameStateRequested(QWebFrame* frame, QWebHistoryItem* item);
333    void restoreFrameStateRequested(QWebFrame* frame);
334
335protected:
336    virtual QWebPage *createWindow(WebWindowType type);
337    virtual QObject *createPlugin(const QString &classid, const QUrl &url, const QStringList &paramNames, const QStringList &paramValues);
338
339    virtual bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);
340    virtual QString chooseFile(QWebFrame *originatingFrame, const QString& oldFile);
341    virtual void javaScriptAlert(QWebFrame *originatingFrame, const QString& msg);
342    virtual bool javaScriptConfirm(QWebFrame *originatingFrame, const QString& msg);
343    virtual bool javaScriptPrompt(QWebFrame *originatingFrame, const QString& msg, const QString& defaultValue, QString* result);
344    virtual void javaScriptConsoleMessage(const QString& message, int lineNumber, const QString& sourceID);
345
346    virtual QString userAgentForUrl(const QUrl& url) const;
347
348private:
349    Q_PRIVATE_SLOT(d, void _q_onLoadProgressChanged(int))
350    Q_PRIVATE_SLOT(d, void _q_webActionTriggered(bool checked))
351    Q_PRIVATE_SLOT(d, void _q_cleanupLeakMessages())
352
353    QWebPagePrivate *d;
354
355    friend class QWebFrame;
356    friend class QWebPagePrivate;
357    friend class QWebView;
358    friend class QGraphicsWebView;
359    friend class QWebInspector;
360    friend class WebCore::ChromeClientQt;
361    friend class WebCore::EditorClientQt;
362    friend class WebCore::FrameLoaderClientQt;
363    friend class WebCore::InspectorClientQt;
364    friend class WebCore::ResourceHandle;
365    friend class WebCore::QNetworkReplyHandler;
366};
367
368Q_DECLARE_OPERATORS_FOR_FLAGS(QWebPage::FindFlags)
369
370#endif
371