summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSumedha Widyadharma <sumedha.widyadharma@basyskom.com>2014-08-07 16:05:05 +0200
committerMilian Wolff <milian.wolff@kdab.com>2014-12-15 15:15:38 +0100
commit9fdce8e443030ab99d31e42fffc977cf284c36c4 (patch)
tree692dae756b25c5ee433550a209e5f950d27b244e /src
parent0a43a43a166d2e2b551f543de61090637bd8b387 (diff)
downloadqtwebchannel-9fdce8e443030ab99d31e42fffc977cf284c36c4.tar.gz
Separate registered and autoregistered QObjects
Currently, a new client gets a list of _all_ registered QObjects, whether they were explicitly registered or not. This leaks internal information which the clients cannot use right away anyway. Change-Id: I4b25a731e9bc2d646f903057b409aecd34dc7f11 Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/webchannel/qmetaobjectpublisher.cpp53
-rw-r--r--src/webchannel/qmetaobjectpublisher_p.h10
2 files changed, 39 insertions, 24 deletions
diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp
index 527b3df..3e78ebc 100644
--- a/src/webchannel/qmetaobjectpublisher.cpp
+++ b/src/webchannel/qmetaobjectpublisher.cpp
@@ -398,38 +398,42 @@ void QMetaObjectPublisher::objectDestroyed(const QObject *object)
{
const QString &id = registeredObjectIds.take(object);
Q_ASSERT(!id.isEmpty());
- bool removed = registeredObjects.remove(id);
+ bool removed = registeredObjects.remove(id)
+ || wrappedObjects.remove(id);
Q_ASSERT(removed);
Q_UNUSED(removed);
signalToPropertyMap.remove(object);
pendingPropertyUpdates.remove(object);
- wrappedObjects.remove(object);
}
QJsonValue QMetaObjectPublisher::wrapResult(const QVariant &result)
{
if (QObject *object = result.value<QObject *>()) {
- QJsonObject &objectInfo = wrappedObjects[object];
- if (!objectInfo.isEmpty()) {
- // already registered, use cached information
- Q_ASSERT(registeredObjectIds.contains(object));
- return objectInfo;
- } // else the object is not yet wrapped, do it now
-
- const QString &id = QUuid::createUuid().toString();
- Q_ASSERT(!registeredObjectIds.contains(object));
-
- QJsonObject info = classInfoForObject(object);
- objectInfo[KEY_QOBJECT] = true;
- objectInfo[KEY_ID] = id;
- objectInfo[KEY_DATA] = info;
-
- registeredObjectIds[object] = id;
- registeredObjects[id] = object;
- wrappedObjects.insert(object, objectInfo);
-
- initializePropertyUpdates(object, info);
+ QString id = registeredObjectIds.value(object);
+
+ QJsonObject objectInfo;
+
+ if (!id.isEmpty() && wrappedObjects.contains(id)) {
+ Q_ASSERT(object == wrappedObjects.value(id).object);
+ return wrappedObjects.value(id).info;
+ } else {
+ id = QUuid::createUuid().toString();
+
+ QJsonObject info = classInfoForObject(object);
+ objectInfo[KEY_QOBJECT] = true;
+ objectInfo[KEY_ID] = id;
+ objectInfo[KEY_DATA] = info;
+
+ if (!registeredObjects.contains(id)) {
+ registeredObjectIds[object] = id;
+ ObjectInfo oi = { object, objectInfo };
+ wrappedObjects.insert(id, oi);
+
+ initializePropertyUpdates(object, info);
+ }
+ }
+
return objectInfo;
}
@@ -439,7 +443,7 @@ QJsonValue QMetaObjectPublisher::wrapResult(const QVariant &result)
void QMetaObjectPublisher::deleteWrappedObject(QObject *object) const
{
- if (!wrappedObjects.contains(object)) {
+ if (!wrappedObjects.contains(registeredObjectIds.value(object))) {
qWarning() << "Not deleting non-wrapped object" << object;
return;
}
@@ -486,6 +490,9 @@ void QMetaObjectPublisher::handleMessage(const QJsonObject &message, QWebChannel
} else if (message.contains(KEY_OBJECT)) {
const QString &objectName = message.value(KEY_OBJECT).toString();
QObject *object = registeredObjects.value(objectName);
+ if (!object)
+ object = wrappedObjects.value(objectName).object;
+
if (!object) {
qWarning() << "Unknown object encountered" << objectName;
return;
diff --git a/src/webchannel/qmetaobjectpublisher_p.h b/src/webchannel/qmetaobjectpublisher_p.h
index eda17d9..6ba5ee7 100644
--- a/src/webchannel/qmetaobjectpublisher_p.h
+++ b/src/webchannel/qmetaobjectpublisher_p.h
@@ -40,6 +40,8 @@
#include <QStringList>
#include <QMetaObject>
#include <QBasicTimer>
+#include <QPointer>
+#include <QJsonValue>
#include "qwebchannelglobal.h"
@@ -217,8 +219,14 @@ 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<const QObject *, QJsonObject> wrappedObjects;
+ 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