diff options
author | Bernd Lamecker <bernd.lamecker@basyskom.com> | 2014-08-12 16:46:59 +0200 |
---|---|---|
committer | Milian Wolff <milian.wolff@kdab.com> | 2014-12-19 11:39:52 +0100 |
commit | 3ed29bca08dec484003cf573dd428b73627ffa81 (patch) | |
tree | 8e688a00c409cbd4a37412342faa2185b7b3869d /src/webchannel/qmetaobjectpublisher_p.h | |
parent | 9fdce8e443030ab99d31e42fffc977cf284c36c4 (diff) | |
download | qtwebchannel-3ed29bca08dec484003cf573dd428b73627ffa81.tar.gz |
Do not broadcast signals or property changes of wrapped qobjects
Signals and property changes caused by dynamically created
qobjects (qobjects returned from a method call at runtime)
should not be broadcasted to any client but only sent to clients
which know these qobjects.
Also added testcases for the changes.
Change-Id: I9aacfa9e7e9df9314b44c6ba8e7339a2069e3c37
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
Diffstat (limited to 'src/webchannel/qmetaobjectpublisher_p.h')
-rw-r--r-- | src/webchannel/qmetaobjectpublisher_p.h | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/webchannel/qmetaobjectpublisher_p.h b/src/webchannel/qmetaobjectpublisher_p.h index 6ba5ee7..1d269f1 100644 --- a/src/webchannel/qmetaobjectpublisher_p.h +++ b/src/webchannel/qmetaobjectpublisher_p.h @@ -41,7 +41,7 @@ #include <QMetaObject> #include <QBasicTimer> #include <QPointer> -#include <QJsonValue> +#include <QJsonObject> #include "qwebchannelglobal.h" @@ -72,7 +72,6 @@ class QWebChannelAbstractTransport; class Q_WEBCHANNEL_EXPORT QMetaObjectPublisher : public QObject { Q_OBJECT - public: explicit QMetaObjectPublisher(QWebChannel *webChannel); virtual ~QMetaObjectPublisher(); @@ -137,7 +136,7 @@ public: * The return value of the method invocation is then serialized and a response message * is returned. */ - QJsonValue invokeMethod(QObject *const object, const int methodIndex, const QJsonArray &args); + QVariant invokeMethod(QObject *const object, const int methodIndex, const QJsonArray &args); /** * Callback of the signalHandler which forwards the signal invocation to the webchannel clients. @@ -159,7 +158,7 @@ public: * * TODO: support wrapping of initially-registered objects */ - QJsonValue wrapResult(const QVariant &result); + QJsonValue wrapResult(const QVariant &result, QWebChannelAbstractTransport *transport); /** * Invoke delete later on @p object. @@ -208,6 +207,24 @@ private: // Map the registered objects to their id. QHash<const QObject *, QString> registeredObjectIds; + // Groups individually wrapped objects with their class information and the transports that have access to it. + struct ObjectInfo + { + ObjectInfo() + : object(Q_NULLPTR) + {} + ObjectInfo(QObject *o, const QJsonObject &i) + : object(o) + , classinfo(i) + {} + QObject *object; + QJsonObject classinfo; + QVector<QWebChannelAbstractTransport*> transports; + }; + + // Map of objects wrapped from invocation returns + QHash<QString, ObjectInfo> wrappedObjects; + // Map of objects to maps of signal indices to a set of all their property indices. // The last value is a set as a signal can be the notify signal of multiple properties. typedef QHash<int, QSet<int> > SignalToPropertyNameMap; @@ -219,15 +236,6 @@ private: typedef QHash<const QObject *, SignalToArgumentsMap> PendingPropertyUpdates; PendingPropertyUpdates pendingPropertyUpdates; - // Struct containing the object itself and its ObjectInfo - struct ObjectInfo { - QObject* object; - QJsonValue info; - }; - - // Maps wrapped object to class info - QHash<QString, ObjectInfo> wrappedObjects; - // Aggregate property updates since we get multiple Qt.idle message when we have multiple // clients. They all share the same QWebProcess though so we must take special care to // prevent message flooding. |