From 64d78252c65edc6dbb2294cac9e4f6281fbdc39f Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Mon, 10 Aug 2009 11:44:44 +1000 Subject: Support adding "window objects" to webview This functionality is equivalent to the C++ QWebFrame::addToJavaScriptWindowObject() API. --- src/declarative/fx/qfxwebview.cpp | 76 +++++++++++++++++++++++++++++++++++++-- src/declarative/fx/qfxwebview.h | 8 +++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/declarative/fx/qfxwebview.cpp b/src/declarative/fx/qfxwebview.cpp index d9108f3..37e5d59 100644 --- a/src/declarative/fx/qfxwebview.cpp +++ b/src/declarative/fx/qfxwebview.cpp @@ -139,7 +139,7 @@ class QFxWebViewPrivate : public QFxPaintedItemPrivate public: QFxWebViewPrivate() : QFxPaintedItemPrivate(), page(0), idealwidth(0), idealheight(0), interactive(true), lastPress(0), lastRelease(0), mouseX(0), mouseY(0), - progress(1.0), pending(PendingNone) + progress(1.0), pending(PendingNone), windowObjects(this) { } @@ -158,8 +158,21 @@ public: QString pending_string; QByteArray pending_data; mutable QFxWebSettings settings; -}; + void updateWindowObjects(); + class WindowObjectList : public QmlConcreteList + { + public: + WindowObjectList(QFxWebViewPrivate *p) + : priv(p) {} + virtual void append(QObject *v) { + QmlConcreteList::append(v); + priv->updateWindowObjects(); + } + private: + QFxWebViewPrivate *priv; + } windowObjects; +}; /*! \qmlclass WebView @@ -258,6 +271,7 @@ void QFxWebView::componentComplete() break; } d->pending = QFxWebViewPrivate::PendingNone; + d->updateWindowObjects(); } /*! @@ -509,6 +523,56 @@ void QFxWebView::setCacheSize(int pixels) d->max_imagecache_size = pixels; } +QmlList *QFxWebView::javaScriptWindowObjects() +{ + Q_D(QFxWebView); + return &d->windowObjects; +} + +class QFxWebViewAttached : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString windowObjectName READ windowObjectName WRITE setWindowObjectName) +public: + QFxWebViewAttached(QObject *parent) + : QObject(parent) + { + } + + QString windowObjectName() const + { + return m_windowObjectName; + } + + void setWindowObjectName(const QString &n) + { + m_windowObjectName = n; + } + +private: + QString m_windowObjectName; +}; + +QFxWebViewAttached *QFxWebView::qmlAttachedProperties(QObject *o) +{ + return new QFxWebViewAttached(o); +} + +void QFxWebViewPrivate::updateWindowObjects() +{ + Q_Q(QFxWebView); + if (!q->isComponentComplete() || !page) + return; + + for (int ii = 0; ii < windowObjects.count(); ++ii) { + QObject *object = windowObjects.at(ii); + QFxWebViewAttached *attached = static_cast(qmlAttachedPropertiesObject(object)); + if (attached && !attached->windowObjectName().isEmpty()) { + page->mainFrame()->addToJavaScriptWindowObject(attached->windowObjectName(), object); + } + } +} + void QFxWebView::drawContents(QPainter *p, const QRect &r) { page()->mainFrame()->render(p,r); @@ -787,6 +851,12 @@ void QFxWebView::setStatusBarMessage(const QString& s) emit statusChanged(); } +void QFxWebView::windowObjectCleared() +{ + Q_D(QFxWebView); + d->updateWindowObjects(); +} + QString QFxWebView::status() const { Q_D(const QFxWebView); @@ -880,6 +950,8 @@ void QFxWebView::setPage(QWebPage *page) connect(d->page,SIGNAL(loadProgress(int)),this,SLOT(doLoadProgress(int))); connect(d->page,SIGNAL(loadFinished(bool)),this,SLOT(doLoadFinished(bool))); connect(d->page,SIGNAL(statusBarMessage(QString)),this,SLOT(setStatusBarMessage(QString))); + + connect(d->page->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),this,SLOT(windowObjectCleared())); } void QFxWebView::load(const QNetworkRequest &request, diff --git a/src/declarative/fx/qfxwebview.h b/src/declarative/fx/qfxwebview.h index 64b9176..8df3d18 100644 --- a/src/declarative/fx/qfxwebview.h +++ b/src/declarative/fx/qfxwebview.h @@ -74,6 +74,7 @@ private: }; +class QFxWebViewAttached; class Q_DECLARATIVE_EXPORT QFxWebView : public QFxPaintedItem { Q_OBJECT @@ -103,6 +104,8 @@ class Q_DECLARATIVE_EXPORT QFxWebView : public QFxPaintedItem Q_PROPERTY(QObject* settings READ settingsObject CONSTANT) + Q_PROPERTY(QmlList* javaScriptWindowObjects READ javaScriptWindowObjects CONSTANT) + public: QFxWebView(QFxItem *parent=0); ~QFxWebView(); @@ -160,6 +163,10 @@ public: int cacheSize() const; void setCacheSize(int pixels); + QmlList *javaScriptWindowObjects(); + + static QFxWebViewAttached *qmlAttachedProperties(QObject *); + Q_SIGNALS: void idealWidthChanged(); void idealHeightChanged(); @@ -187,6 +194,7 @@ private Q_SLOTS: void doLoadProgress(int p); void doLoadFinished(bool ok); void setStatusBarMessage(const QString&); + void windowObjectCleared(); protected: QFxWebView(QFxWebViewPrivate &dd, QFxItem *parent); -- cgit v0.12