blob: 05f35f65794c6139c9a9187c45571db6ea294ebf [file] [log] [blame]
/*
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
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 qdeclarativewebview_p_h
#define qdeclarativewebview_p_h
#include <QtCore/QBasicTimer>
#include <QtCore/QUrl>
#include <QtDeclarative/QDeclarativeItem>
#include <QtGui/QAction>
#include <QtNetwork/QNetworkAccessManager>
#include "qgraphicswebview.h"
#include "qwebpage.h"
QT_BEGIN_HEADER
class QWebHistory;
class QWebSettings;
QT_BEGIN_NAMESPACE
QT_MODULE(Declarative)
class QDeclarativeWebSettings;
class QDeclarativeWebViewPrivate;
class QNetworkRequest;
class QDeclarativeWebView;
class QDeclarativeWebViewPrivate;
class QDeclarativeWebPage : public QWebPage {
Q_OBJECT
public:
explicit QDeclarativeWebPage(QDeclarativeWebView *parent);
~QDeclarativeWebPage();
protected:
QWebPage *createWindow(WebWindowType type);
QString chooseFile(QWebFrame *originatingFrame, const QString& oldFile);
void javaScriptAlert(QWebFrame *originatingFrame, const QString& msg);
bool javaScriptConfirm(QWebFrame *originatingFrame, const QString& msg);
bool javaScriptPrompt(QWebFrame *originatingFrame, const QString& msg, const QString& defaultValue, QString* result);
private:
QDeclarativeWebView *viewItem();
};
class GraphicsWebView : public QGraphicsWebView {
Q_OBJECT
public:
GraphicsWebView(QDeclarativeWebView* parent = 0);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent* event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
void timerEvent(QTimerEvent* event);
bool sceneEvent(QEvent *event);
Q_SIGNALS:
void doubleClick(int clickX, int clickY);
private:
QDeclarativeWebView *parent;
QPointF pressPoint;
QBasicTimer pressTimer;
int pressTime; // milliseconds before the touch event becomes a "tap and hold"
friend class QDeclarativeWebView;
};
class QDeclarativeWebViewAttached;
// TODO: browser plugins
class QDeclarativeWebView : public QDeclarativeItem {
Q_OBJECT
Q_ENUMS(Status SelectionMode)
Q_PROPERTY(QString title READ title NOTIFY titleChanged)
Q_PROPERTY(QPixmap icon READ icon NOTIFY iconChanged)
Q_PROPERTY(QString statusText READ statusText NOTIFY statusTextChanged)
Q_PROPERTY(QString html READ html WRITE setHtml NOTIFY htmlChanged)
Q_PROPERTY(int pressGrabTime READ pressGrabTime WRITE setPressGrabTime NOTIFY pressGrabTimeChanged)
Q_PROPERTY(int preferredWidth READ preferredWidth WRITE setPreferredWidth NOTIFY preferredWidthChanged)
Q_PROPERTY(int preferredHeight READ preferredHeight WRITE setPreferredHeight NOTIFY preferredHeightChanged)
Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged)
Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
Q_PROPERTY(Status status READ status NOTIFY statusChanged)
#ifndef QT_NO_ACTION
Q_PROPERTY(QAction* reload READ reloadAction CONSTANT)
Q_PROPERTY(QAction* back READ backAction CONSTANT)
Q_PROPERTY(QAction* forward READ forwardAction CONSTANT)
Q_PROPERTY(QAction* stop READ stopAction CONSTANT)
#endif
Q_PROPERTY(QDeclarativeWebSettings* settings READ settingsObject CONSTANT)
Q_PROPERTY(QDeclarativeListProperty<QObject> javaScriptWindowObjects READ javaScriptWindowObjects CONSTANT)
Q_PROPERTY(QDeclarativeComponent* newWindowComponent READ newWindowComponent WRITE setNewWindowComponent NOTIFY newWindowComponentChanged)
Q_PROPERTY(QDeclarativeItem* newWindowParent READ newWindowParent WRITE setNewWindowParent NOTIFY newWindowParentChanged)
Q_PROPERTY(bool renderingEnabled READ renderingEnabled WRITE setRenderingEnabled NOTIFY renderingEnabledChanged)
Q_PROPERTY(QSize contentsSize READ contentsSize NOTIFY contentsSizeChanged)
Q_PROPERTY(qreal contentsScale READ contentsScale WRITE setContentsScale NOTIFY contentsScaleChanged)
#if QT_VERSION >= 0x040703
Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged REVISION 1)
#endif
public:
QDeclarativeWebView(QDeclarativeItem *parent = 0);
~QDeclarativeWebView();
QUrl url() const;
void setUrl(const QUrl &);
QString title() const;
QPixmap icon() const;
Q_INVOKABLE bool heuristicZoom(int clickX, int clickY, qreal maxzoom);
QRect elementAreaAt(int x, int y, int minwidth, int minheight) const;
int pressGrabTime() const;
void setPressGrabTime(int);
int preferredWidth() const;
void setPreferredWidth(int);
int preferredHeight() const;
void setPreferredHeight(int);
enum Status { Null, Ready, Loading, Error };
Status status() const;
qreal progress() const;
QString statusText() const;
#ifndef QT_NO_ACTION
QAction *reloadAction() const;
QAction *backAction() const;
QAction *forwardAction() const;
QAction *stopAction() const;
#endif
QWebPage *page() const;
void setPage(QWebPage *page);
void load(const QNetworkRequest &request,
QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation,
const QByteArray &body = QByteArray());
QString html() const;
void setHtml(const QString &html, const QUrl &baseUrl = QUrl());
void setContent(const QByteArray &data, const QString &mimeType = QString(), const QUrl &baseUrl = QUrl());
QWebHistory* history() const;
QWebSettings* settings() const;
QDeclarativeWebSettings *settingsObject() const;
bool renderingEnabled() const;
void setRenderingEnabled(bool);
QDeclarativeListProperty<QObject> javaScriptWindowObjects();
static QDeclarativeWebViewAttached* qmlAttachedProperties(QObject*);
QDeclarativeComponent *newWindowComponent() const;
void setNewWindowComponent(QDeclarativeComponent *newWindow);
QDeclarativeItem* newWindowParent() const;
void setNewWindowParent(QDeclarativeItem* newWindow);
bool isComponentCompletePublic() const { return isComponentComplete(); }
QSize contentsSize() const;
void setContentsScale(qreal scale);
qreal contentsScale() const;
#if QT_VERSION >= 0x040703
Q_REVISION(1) QColor backgroundColor() const;
Q_REVISION(1) void setBackgroundColor(const QColor&);
#endif
Q_SIGNALS:
void preferredWidthChanged();
void preferredHeightChanged();
void urlChanged();
void progressChanged();
void statusChanged(Status);
void titleChanged(const QString&);
void iconChanged();
void statusTextChanged();
void htmlChanged();
void pressGrabTimeChanged();
void newWindowComponentChanged();
void newWindowParentChanged();
void renderingEnabledChanged();
void contentsSizeChanged(const QSize&);
void contentsScaleChanged();
#if QT_VERSION >= 0x040703
void backgroundColorChanged();
#endif
void loadStarted();
void loadFinished();
void loadFailed();
void doubleClick(int clickX, int clickY);
void zoomTo(qreal zoom, int centerX, int centerY);
void alert(const QString& message);
public Q_SLOTS:
QVariant evaluateJavaScript(const QString&);
private Q_SLOTS:
void doLoadStarted();
void doLoadProgress(int p);
void doLoadFinished(bool ok);
void setStatusText(const QString&);
void windowObjectCleared();
void pageUrlChanged();
void initialLayout();
void updateDeclarativeWebViewSize();
virtual void geometryChanged(const QRectF &newGeometry,
const QRectF &oldGeometry);
QDeclarativeWebView* createWindow(QWebPage::WebWindowType type);
private:
void updateContentsSize();
void init();
virtual void componentComplete();
Q_DISABLE_COPY(QDeclarativeWebView)
QDeclarativeWebViewPrivate* d;
QMouseEvent* sceneMouseEventToMouseEvent(QGraphicsSceneMouseEvent*);
QMouseEvent* sceneHoverMoveEventToMouseEvent(QGraphicsSceneHoverEvent*);
friend class QDeclarativeWebPage;
};
class QDeclarativeWebViewAttached : public QObject {
Q_OBJECT
Q_PROPERTY(QString windowObjectName READ windowObjectName WRITE setWindowObjectName)
public:
QDeclarativeWebViewAttached(QObject* parent)
: QObject(parent)
{
}
QString windowObjectName() const
{
return m_windowObjectName;
}
void setWindowObjectName(const QString &n)
{
m_windowObjectName = n;
}
private:
QString m_windowObjectName;
};
class QDeclarativeWebSettings : public QObject {
Q_OBJECT
Q_PROPERTY(QString standardFontFamily READ standardFontFamily WRITE setStandardFontFamily)
Q_PROPERTY(QString fixedFontFamily READ fixedFontFamily WRITE setFixedFontFamily)
Q_PROPERTY(QString serifFontFamily READ serifFontFamily WRITE setSerifFontFamily)
Q_PROPERTY(QString sansSerifFontFamily READ sansSerifFontFamily WRITE setSansSerifFontFamily)
Q_PROPERTY(QString cursiveFontFamily READ cursiveFontFamily WRITE setCursiveFontFamily)
Q_PROPERTY(QString fantasyFontFamily READ fantasyFontFamily WRITE setFantasyFontFamily)
Q_PROPERTY(int minimumFontSize READ minimumFontSize WRITE setMinimumFontSize)
Q_PROPERTY(int minimumLogicalFontSize READ minimumLogicalFontSize WRITE setMinimumLogicalFontSize)
Q_PROPERTY(int defaultFontSize READ defaultFontSize WRITE setDefaultFontSize)
Q_PROPERTY(int defaultFixedFontSize READ defaultFixedFontSize WRITE setDefaultFixedFontSize)
Q_PROPERTY(bool autoLoadImages READ autoLoadImages WRITE setAutoLoadImages)
Q_PROPERTY(bool javascriptEnabled READ javascriptEnabled WRITE setJavascriptEnabled)
Q_PROPERTY(bool javaEnabled READ javaEnabled WRITE setJavaEnabled)
Q_PROPERTY(bool pluginsEnabled READ pluginsEnabled WRITE setPluginsEnabled)
Q_PROPERTY(bool privateBrowsingEnabled READ privateBrowsingEnabled WRITE setPrivateBrowsingEnabled)
Q_PROPERTY(bool javascriptCanOpenWindows READ javascriptCanOpenWindows WRITE setJavascriptCanOpenWindows)
Q_PROPERTY(bool javascriptCanAccessClipboard READ javascriptCanAccessClipboard WRITE setJavascriptCanAccessClipboard)
Q_PROPERTY(bool developerExtrasEnabled READ developerExtrasEnabled WRITE setDeveloperExtrasEnabled)
Q_PROPERTY(bool linksIncludedInFocusChain READ linksIncludedInFocusChain WRITE setLinksIncludedInFocusChain)
Q_PROPERTY(bool zoomTextOnly READ zoomTextOnly WRITE setZoomTextOnly)
Q_PROPERTY(bool printElementBackgrounds READ printElementBackgrounds WRITE setPrintElementBackgrounds)
Q_PROPERTY(bool offlineStorageDatabaseEnabled READ offlineStorageDatabaseEnabled WRITE setOfflineStorageDatabaseEnabled)
Q_PROPERTY(bool offlineWebApplicationCacheEnabled READ offlineWebApplicationCacheEnabled WRITE setOfflineWebApplicationCacheEnabled)
Q_PROPERTY(bool localStorageDatabaseEnabled READ localStorageDatabaseEnabled WRITE setLocalStorageDatabaseEnabled)
Q_PROPERTY(bool localContentCanAccessRemoteUrls READ localContentCanAccessRemoteUrls WRITE setLocalContentCanAccessRemoteUrls)
public:
QDeclarativeWebSettings() {}
QString standardFontFamily() const { return s->fontFamily(QWebSettings::StandardFont); }
void setStandardFontFamily(const QString& f) { s->setFontFamily(QWebSettings::StandardFont, f); }
QString fixedFontFamily() const { return s->fontFamily(QWebSettings::FixedFont); }
void setFixedFontFamily(const QString& f) { s->setFontFamily(QWebSettings::FixedFont, f); }
QString serifFontFamily() const { return s->fontFamily(QWebSettings::SerifFont); }
void setSerifFontFamily(const QString& f) { s->setFontFamily(QWebSettings::SerifFont, f); }
QString sansSerifFontFamily() const { return s->fontFamily(QWebSettings::SansSerifFont); }
void setSansSerifFontFamily(const QString& f) { s->setFontFamily(QWebSettings::SansSerifFont, f); }
QString cursiveFontFamily() const { return s->fontFamily(QWebSettings::CursiveFont); }
void setCursiveFontFamily(const QString& f) { s->setFontFamily(QWebSettings::CursiveFont, f); }
QString fantasyFontFamily() const { return s->fontFamily(QWebSettings::FantasyFont); }
void setFantasyFontFamily(const QString& f) { s->setFontFamily(QWebSettings::FantasyFont, f); }
int minimumFontSize() const { return s->fontSize(QWebSettings::MinimumFontSize); }
void setMinimumFontSize(int size) { s->setFontSize(QWebSettings::MinimumFontSize, size); }
int minimumLogicalFontSize() const { return s->fontSize(QWebSettings::MinimumLogicalFontSize); }
void setMinimumLogicalFontSize(int size) { s->setFontSize(QWebSettings::MinimumLogicalFontSize, size); }
int defaultFontSize() const { return s->fontSize(QWebSettings::DefaultFontSize); }
void setDefaultFontSize(int size) { s->setFontSize(QWebSettings::DefaultFontSize, size); }
int defaultFixedFontSize() const { return s->fontSize(QWebSettings::DefaultFixedFontSize); }
void setDefaultFixedFontSize(int size) { s->setFontSize(QWebSettings::DefaultFixedFontSize, size); }
bool autoLoadImages() const { return s->testAttribute(QWebSettings::AutoLoadImages); }
void setAutoLoadImages(bool on) { s->setAttribute(QWebSettings::AutoLoadImages, on); }
bool javascriptEnabled() const { return s->testAttribute(QWebSettings::JavascriptEnabled); }
void setJavascriptEnabled(bool on) { s->setAttribute(QWebSettings::JavascriptEnabled, on); }
bool javaEnabled() const { return s->testAttribute(QWebSettings::JavaEnabled); }
void setJavaEnabled(bool on) { s->setAttribute(QWebSettings::JavaEnabled, on); }
bool pluginsEnabled() const { return s->testAttribute(QWebSettings::PluginsEnabled); }
void setPluginsEnabled(bool on) { s->setAttribute(QWebSettings::PluginsEnabled, on); }
bool privateBrowsingEnabled() const { return s->testAttribute(QWebSettings::PrivateBrowsingEnabled); }
void setPrivateBrowsingEnabled(bool on) { s->setAttribute(QWebSettings::PrivateBrowsingEnabled, on); }
bool javascriptCanOpenWindows() const { return s->testAttribute(QWebSettings::JavascriptCanOpenWindows); }
void setJavascriptCanOpenWindows(bool on) { s->setAttribute(QWebSettings::JavascriptCanOpenWindows, on); }
bool javascriptCanAccessClipboard() const { return s->testAttribute(QWebSettings::JavascriptCanAccessClipboard); }
void setJavascriptCanAccessClipboard(bool on) { s->setAttribute(QWebSettings::JavascriptCanAccessClipboard, on); }
bool developerExtrasEnabled() const { return s->testAttribute(QWebSettings::DeveloperExtrasEnabled); }
void setDeveloperExtrasEnabled(bool on) { s->setAttribute(QWebSettings::DeveloperExtrasEnabled, on); }
bool linksIncludedInFocusChain() const { return s->testAttribute(QWebSettings::LinksIncludedInFocusChain); }
void setLinksIncludedInFocusChain(bool on) { s->setAttribute(QWebSettings::LinksIncludedInFocusChain, on); }
bool zoomTextOnly() const { return s->testAttribute(QWebSettings::ZoomTextOnly); }
void setZoomTextOnly(bool on) { s->setAttribute(QWebSettings::ZoomTextOnly, on); }
bool printElementBackgrounds() const { return s->testAttribute(QWebSettings::PrintElementBackgrounds); }
void setPrintElementBackgrounds(bool on) { s->setAttribute(QWebSettings::PrintElementBackgrounds, on); }
bool offlineStorageDatabaseEnabled() const { return s->testAttribute(QWebSettings::OfflineStorageDatabaseEnabled); }
void setOfflineStorageDatabaseEnabled(bool on) { s->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, on); }
bool offlineWebApplicationCacheEnabled() const { return s->testAttribute(QWebSettings::OfflineWebApplicationCacheEnabled); }
void setOfflineWebApplicationCacheEnabled(bool on) { s->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, on); }
bool localStorageDatabaseEnabled() const { return s->testAttribute(QWebSettings::LocalStorageDatabaseEnabled); }
void setLocalStorageDatabaseEnabled(bool on) { s->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, on); }
bool localContentCanAccessRemoteUrls() const { return s->testAttribute(QWebSettings::LocalContentCanAccessRemoteUrls); }
void setLocalContentCanAccessRemoteUrls(bool on) { s->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, on); }
QWebSettings *s;
};
QT_END_NAMESPACE
QML_DECLARE_TYPE(QDeclarativeWebView)
QML_DECLARE_TYPE(QDeclarativeWebSettings)
QML_DECLARE_TYPEINFO(QDeclarativeWebView, QML_HAS_ATTACHED_PROPERTIES)
QT_END_HEADER
#endif