/*
Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
Copyright (C) 2007 Staikos Computing Services Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef QWEBPAGE_H
#define QWEBPAGE_H
#include "qwebsettings.h"
#include "qwebkitglobal.h"
#include <QtCore/qobject.h>
#include <QtCore/qurl.h>
#include <QtGui/qwidget.h>
QT_BEGIN_NAMESPACE
class QNetworkProxy;
class QUndoStack;
class QMenu;
class QNetworkRequest;
class QNetworkReply;
class QNetworkAccessManager;
QT_END_NAMESPACE
class QWebElement;
class QWebFrame;
class QWebNetworkRequest;
class QWebHistory;
class QWebFrameData;
class QWebHistoryItem;
class QWebHitTestResult;
class QWebNetworkInterface;
class QWebPagePrivate;
class QWebPluginFactory;
class QWebSecurityOrigin;
class QtViewportAttributesPrivate;
namespace WebCore {
class ChromeClientQt;
class EditorClientQt;
class FrameLoaderClientQt;
class InspectorClientQt;
class InspectorServerRequestHandlerQt;
class InspectorFrontendClientQt;
class NotificationPresenterClientQt;
class GeolocationPermissionClientQt;
class ResourceHandle;
class HitTestResult;
class QNetworkReplyHandler;
struct FrameLoadRequest;
}
class QWEBKIT_EXPORT QWebPage : public QObject {
Q_OBJECT
Q_PROPERTY(bool modified READ isModified)
Q_PROPERTY(QString selectedText READ selectedText)
Q_PROPERTY(QString selectedHtml READ selectedHtml)
Q_PROPERTY(bool hasSelection READ hasSelection)
Q_PROPERTY(QSize viewportSize READ viewportSize WRITE setViewportSize)
Q_PROPERTY(QSize preferredContentsSize READ preferredContentsSize WRITE setPreferredContentsSize)
Q_PROPERTY(bool forwardUnsupportedContent READ forwardUnsupportedContent WRITE setForwardUnsupportedContent)
Q_PROPERTY(LinkDelegationPolicy linkDelegationPolicy READ linkDelegationPolicy WRITE setLinkDelegationPolicy)
Q_PROPERTY(QPalette palette READ palette WRITE setPalette)
Q_PROPERTY(bool contentEditable READ isContentEditable WRITE setContentEditable)
Q_ENUMS(LinkDelegationPolicy NavigationType WebAction)
public:
enum NavigationType {
NavigationTypeLinkClicked,
NavigationTypeFormSubmitted,
NavigationTypeBackOrForward,
NavigationTypeReload,
NavigationTypeFormResubmitted,
NavigationTypeOther
};
enum WebAction {
NoWebAction = - 1,
OpenLink,
OpenLinkInNewWindow,
OpenFrameInNewWindow,
DownloadLinkToDisk,
CopyLinkToClipboard,
OpenImageInNewWindow,
DownloadImageToDisk,
CopyImageToClipboard,
CopyImageUrlToClipboard,
Back,
Forward,
Stop,
Reload,
Cut,
Copy,
Paste,
Undo,
Redo,
MoveToNextChar,
MoveToPreviousChar,
MoveToNextWord,
MoveToPreviousWord,
MoveToNextLine,
MoveToPreviousLine,
MoveToStartOfLine,
MoveToEndOfLine,
MoveToStartOfBlock,
MoveToEndOfBlock,
MoveToStartOfDocument,
MoveToEndOfDocument,
SelectNextChar,
SelectPreviousChar,
SelectNextWord,
SelectPreviousWord,
SelectNextLine,
SelectPreviousLine,
SelectStartOfLine,
SelectEndOfLine,
SelectStartOfBlock,
SelectEndOfBlock,
SelectStartOfDocument,
SelectEndOfDocument,
DeleteStartOfWord,
DeleteEndOfWord,
SetTextDirectionDefault,
SetTextDirectionLeftToRight,
SetTextDirectionRightToLeft,
ToggleBold,
ToggleItalic,
ToggleUnderline,
InspectElement,
InsertParagraphSeparator,
InsertLineSeparator,
SelectAll,
ReloadAndBypassCache,
PasteAndMatchStyle,
RemoveFormat,
ToggleStrikethrough,
ToggleSubscript,
ToggleSuperscript,
InsertUnorderedList,
InsertOrderedList,
Indent,
Outdent,
AlignCenter,
AlignJustified,
AlignLeft,
AlignRight,
StopScheduledPageRefresh,
WebActionCount
};
enum FindFlag {
FindBackward = 1,
FindCaseSensitively = 2,
FindWrapsAroundDocument = 4,
HighlightAllOccurrences = 8
};
Q_DECLARE_FLAGS(FindFlags, FindFlag)
enum LinkDelegationPolicy {
DontDelegateLinks,
DelegateExternalLinks,
DelegateAllLinks
};
enum WebWindowType {
WebBrowserWindow,
WebModalDialog
};
enum PermissionPolicy {
PermissionUnknown,
PermissionGrantedByUser,
PermissionDeniedByUser
};
enum Feature {
Notifications,
Geolocation
};
class QWEBKIT_EXPORT ViewportAttributes {
public:
ViewportAttributes();
ViewportAttributes(const QWebPage::ViewportAttributes& other);
~ViewportAttributes();
QWebPage::ViewportAttributes& operator=(const QWebPage::ViewportAttributes& other);
inline qreal initialScaleFactor() const { return m_initialScaleFactor; }
inline qreal minimumScaleFactor() const { return m_minimumScaleFactor; }
inline qreal maximumScaleFactor() const { return m_maximumScaleFactor; }
inline qreal devicePixelRatio() const { return m_devicePixelRatio; }
inline bool isUserScalable() const { return m_isUserScalable; }
inline bool isValid() const { return m_isValid; }
inline QSize size() const { return m_size; }
private:
QSharedDataPointer<QtViewportAttributesPrivate> d;
qreal m_initialScaleFactor;
qreal m_minimumScaleFactor;
qreal m_maximumScaleFactor;
qreal m_devicePixelRatio;
bool m_isUserScalable;
bool m_isValid;
QSize m_size;
friend class WebCore::ChromeClientQt;
friend class QWebPage;
};
explicit QWebPage(QObject *parent = 0);
~QWebPage();
QWebFrame *mainFrame() const;
QWebFrame *currentFrame() const;
QWebFrame* frameAt(const QPoint& pos) const;
QWebHistory *history() const;
QWebSettings *settings() const;
void setView(QWidget *view);
QWidget *view() const;
bool isModified() const;
#ifndef QT_NO_UNDOSTACK
QUndoStack *undoStack() const;
#endif
void setNetworkAccessManager(QNetworkAccessManager *manager);
QNetworkAccessManager *networkAccessManager() const;
void setPluginFactory(QWebPluginFactory *factory);
QWebPluginFactory *pluginFactory() const;
quint64 totalBytes() const;
quint64 bytesReceived() const;
bool hasSelection() const;
QString selectedText() const;
QString selectedHtml() const;
#ifndef QT_NO_ACTION
QAction *action(WebAction action) const;
#endif
virtual void triggerAction(WebAction action, bool checked = false);
QSize viewportSize() const;
void setViewportSize(const QSize &size) const;
ViewportAttributes viewportAttributesForSize(const QSize& availableSize) const;
QSize preferredContentsSize() const;
void setPreferredContentsSize(const QSize &size) const;
void setActualVisibleContentRect(const QRect& rect) const;
virtual bool event(QEvent*);
bool focusNextPrevChild(bool next);
QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
bool findText(const QString &subString, FindFlags options = 0);
void setForwardUnsupportedContent(bool forward);
bool forwardUnsupportedContent() const;
void setLinkDelegationPolicy(LinkDelegationPolicy policy);
LinkDelegationPolicy linkDelegationPolicy() const;
void setPalette(const QPalette &palette);
QPalette palette() const;
void setContentEditable(bool editable);
bool isContentEditable() const;
#ifndef QT_NO_CONTEXTMENU
bool swallowContextMenuEvent(QContextMenuEvent *event);
#endif
void updatePositionDependentActions(const QPoint &pos);
QMenu *createStandardContextMenu();
void setFeaturePermission(QWebFrame* frame, Feature feature, PermissionPolicy policy);
QStringList supportedContentTypes() const;
bool supportsContentType(const QString& mimeType) const;
enum Extension {
ChooseMultipleFilesExtension,
ErrorPageExtension
};
class ExtensionOption
{};
class ExtensionReturn
{};
class ChooseMultipleFilesExtensionOption : public ExtensionOption {
public:
QWebFrame *parentFrame;
QStringList suggestedFileNames;
};
class ChooseMultipleFilesExtensionReturn : public ExtensionReturn {
public:
QStringList fileNames;
};
enum ErrorDomain { QtNetwork, Http, WebKit };
class ErrorPageExtensionOption : public ExtensionOption {
public:
QUrl url;
QWebFrame* frame;
ErrorDomain domain;
int error;
QString errorString;
};
class ErrorPageExtensionReturn : public ExtensionReturn {
public:
ErrorPageExtensionReturn() : contentType(QLatin1String("text/html")), encoding(QLatin1String("utf-8")) {};
QString contentType;
QString encoding;
QUrl baseUrl;
QByteArray content;
};
virtual bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0);
virtual bool supportsExtension(Extension extension) const;
inline QWebPagePrivate* handle() const { return d; }
public Q_SLOTS:
bool shouldInterruptJavaScript();
Q_SIGNALS:
void loadStarted();
void loadProgress(int progress);
void loadFinished(bool ok);
void linkHovered(const QString &link, const QString &title, const QString &textContent);
void statusBarMessage(const QString& text);
void selectionChanged();
void frameCreated(QWebFrame *frame);
void geometryChangeRequested(const QRect& geom);
void repaintRequested(const QRect& dirtyRect);
void scrollRequested(int dx, int dy, const QRect& scrollViewRect);
void windowCloseRequested();
void printRequested(QWebFrame *frame);
void linkClicked(const QUrl &url);
void toolBarVisibilityChangeRequested(bool visible);
void statusBarVisibilityChangeRequested(bool visible);
void menuBarVisibilityChangeRequested(bool visible);
void unsupportedContent(QNetworkReply *reply);
void downloadRequested(const QNetworkRequest &request);
void microFocusChanged();
void contentsChanged();
void databaseQuotaExceeded(QWebFrame* frame, QString databaseName);
void applicationCacheQuotaExceeded(QWebSecurityOrigin* origin, quint64 defaultOriginQuota);
void saveFrameStateRequested(QWebFrame* frame, QWebHistoryItem* item);
void restoreFrameStateRequested(QWebFrame* frame);
void viewportChangeRequested();
void featurePermissionRequested(QWebFrame* frame, QWebPage::Feature feature);
void featurePermissionRequestCanceled(QWebFrame* frame, QWebPage::Feature feature);
protected:
virtual QWebPage *createWindow(WebWindowType type);
virtual QObject *createPlugin(const QString &classid, const QUrl &url, const QStringList ¶mNames, const QStringList ¶mValues);
virtual bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);
virtual QString chooseFile(QWebFrame *originatingFrame, const QString& oldFile);
virtual void javaScriptAlert(QWebFrame *originatingFrame, const QString& msg);
virtual bool javaScriptConfirm(QWebFrame *originatingFrame, const QString& msg);
virtual bool javaScriptPrompt(QWebFrame *originatingFrame, const QString& msg, const QString& defaultValue, QString* result);
virtual void javaScriptConsoleMessage(const QString& message, int lineNumber, const QString& sourceID);
virtual QString userAgentForUrl(const QUrl& url) const;
private:
Q_PRIVATE_SLOT(d, void _q_onLoadProgressChanged(int))
#ifndef QT_NO_ACTION
Q_PRIVATE_SLOT(d, void _q_webActionTriggered(bool checked))
#endif
Q_PRIVATE_SLOT(d, void _q_cleanupLeakMessages())
QWebPagePrivate *d;
friend class QWebFrame;
friend class QWebPagePrivate;
friend class QWebView;
friend class QWebViewPrivate;
friend class QGraphicsWebView;
friend class QGraphicsWebViewPrivate;
friend class QWebInspector;
friend class WebCore::ChromeClientQt;
friend class WebCore::EditorClientQt;
friend class WebCore::FrameLoaderClientQt;
friend class WebCore::InspectorClientQt;
friend class WebCore::InspectorServerRequestHandlerQt;
friend class WebCore::InspectorFrontendClientQt;
friend class WebCore::NotificationPresenterClientQt;
friend class WebCore::GeolocationPermissionClientQt;
friend class WebCore::ResourceHandle;
friend class WebCore::QNetworkReplyHandler;
friend class DumpRenderTreeSupportQt;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QWebPage::FindFlags)
#endif