qwebpage.h revision cac0f67c402d107cdb10971b95719e2ff9c7c76b
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#if QT_VERSION < 0x040400 && !defined(qdoc)
212    void setNetworkInterface(QWebNetworkInterface *interface);
213    QWebNetworkInterface *networkInterface() const;
214
215    // #### why is this in the page itself?
216#ifndef QT_NO_NETWORKPROXY
217    void setNetworkProxy(const QNetworkProxy& proxy);
218    QNetworkProxy networkProxy() const;
219#endif
220
221#else
222    void setNetworkAccessManager(QNetworkAccessManager *manager);
223    QNetworkAccessManager *networkAccessManager() const;
224#endif
225
226    void setPluginFactory(QWebPluginFactory *factory);
227    QWebPluginFactory *pluginFactory() const;
228
229    quint64 totalBytes() const;
230    quint64 bytesReceived() const;
231
232    QString selectedText() const;
233
234    QAction *action(WebAction action) const;
235    virtual void triggerAction(WebAction action, bool checked = false);
236
237    QSize viewportSize() const;
238    void setViewportSize(const QSize &size) const;
239
240    QSize preferredContentsSize() const;
241    void setPreferredContentsSize(const QSize &size) const;
242
243    virtual bool event(QEvent*);
244    bool focusNextPrevChild(bool next);
245
246    QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
247
248    bool findText(const QString &subString, FindFlags options = 0);
249
250    void setForwardUnsupportedContent(bool forward);
251    bool forwardUnsupportedContent() const;
252
253    void setLinkDelegationPolicy(LinkDelegationPolicy policy);
254    LinkDelegationPolicy linkDelegationPolicy() const;
255
256    void setPalette(const QPalette &palette);
257    QPalette palette() const;
258
259    void setContentEditable(bool editable);
260    bool isContentEditable() const;
261
262#ifndef QT_NO_CONTEXTMENU
263    bool swallowContextMenuEvent(QContextMenuEvent *event);
264#endif
265    void updatePositionDependentActions(const QPoint &pos);
266
267    QMenu *createStandardContextMenu();
268
269    enum Extension {
270        ChooseMultipleFilesExtension,
271        ErrorPageExtension
272    };
273    class ExtensionOption
274    {};
275    class ExtensionReturn
276    {};
277
278    class ChooseMultipleFilesExtensionOption : public ExtensionOption {
279    public:
280        QWebFrame *parentFrame;
281        QStringList suggestedFileNames;
282    };
283
284    class ChooseMultipleFilesExtensionReturn : public ExtensionReturn {
285    public:
286        QStringList fileNames;
287    };
288
289    enum ErrorDomain { QtNetwork, Http, WebKit };
290    class ErrorPageExtensionOption : public ExtensionOption {
291    public:
292        QUrl url;
293        QWebFrame* frame;
294        ErrorDomain domain;
295        int error;
296        QString errorString;
297    };
298
299    class ErrorPageExtensionReturn : public ExtensionReturn {
300    public:
301        ErrorPageExtensionReturn() : contentType(QLatin1String("text/html")), encoding(QLatin1String("utf-8")) {};
302        QString contentType;
303        QString encoding;
304        QUrl baseUrl;
305        QByteArray content;
306    };
307
308
309    virtual bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0);
310    virtual bool supportsExtension(Extension extension) const;
311
312    inline QWebPagePrivate* handle() const { return d; }
313
314public Q_SLOTS:
315    bool shouldInterruptJavaScript();
316
317Q_SIGNALS:
318    void loadStarted();
319    void loadProgress(int progress);
320    void loadFinished(bool ok);
321
322    void linkHovered(const QString &link, const QString &title, const QString &textContent);
323    void statusBarMessage(const QString& text);
324    void selectionChanged();
325    void frameCreated(QWebFrame *frame);
326    void geometryChangeRequested(const QRect& geom);
327    void repaintRequested(const QRect& dirtyRect);
328    void scrollRequested(int dx, int dy, const QRect& scrollViewRect);
329    void windowCloseRequested();
330    void printRequested(QWebFrame *frame);
331    void linkClicked(const QUrl &url);
332    void webInspectorTriggered(const QWebElement& inspectedElement);
333
334    void toolBarVisibilityChangeRequested(bool visible);
335    void statusBarVisibilityChangeRequested(bool visible);
336    void menuBarVisibilityChangeRequested(bool visible);
337
338#if QT_VERSION >= 0x040400
339    void unsupportedContent(QNetworkReply *reply);
340    void downloadRequested(const QNetworkRequest &request);
341#endif
342
343    void microFocusChanged();
344    void contentsChanged();
345    void databaseQuotaExceeded(QWebFrame* frame, QString databaseName);
346
347    void saveFrameStateRequested(QWebFrame* frame, QWebHistoryItem* item);
348    void restoreFrameStateRequested(QWebFrame* frame);
349
350    void networkRequestStarted(QWebFrame* frame, QNetworkRequest* request);
351
352protected:
353    virtual QWebPage *createWindow(WebWindowType type);
354    virtual QObject *createPlugin(const QString &classid, const QUrl &url, const QStringList &paramNames, const QStringList &paramValues);
355
356#if QT_VERSION >= 0x040400
357    virtual bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);
358#else
359    virtual bool acceptNavigationRequest(QWebFrame *frame, const QWebNetworkRequest &request, NavigationType type);
360#endif
361    virtual QString chooseFile(QWebFrame *originatingFrame, const QString& oldFile);
362    virtual void javaScriptAlert(QWebFrame *originatingFrame, const QString& msg);
363    virtual bool javaScriptConfirm(QWebFrame *originatingFrame, const QString& msg);
364    virtual bool javaScriptPrompt(QWebFrame *originatingFrame, const QString& msg, const QString& defaultValue, QString* result);
365    virtual void javaScriptConsoleMessage(const QString& message, int lineNumber, const QString& sourceID);
366
367    virtual QString userAgentForUrl(const QUrl& url) const;
368
369private:
370    Q_PRIVATE_SLOT(d, void _q_onLoadProgressChanged(int))
371    Q_PRIVATE_SLOT(d, void _q_webActionTriggered(bool checked))
372    Q_PRIVATE_SLOT(d, void _q_cleanupLeakMessages())
373
374    QWebPagePrivate *d;
375
376    friend class QWebFrame;
377    friend class QWebPagePrivate;
378    friend class QWebView;
379    friend class QGraphicsWebView;
380    friend class QWebInspector;
381    friend class WebCore::ChromeClientQt;
382    friend class WebCore::EditorClientQt;
383    friend class WebCore::FrameLoaderClientQt;
384    friend class WebCore::InspectorClientQt;
385    friend class WebCore::ResourceHandle;
386    friend class WebCore::QNetworkReplyHandler;
387};
388
389Q_DECLARE_OPERATORS_FOR_FLAGS(QWebPage::FindFlags)
390
391#endif
392