From 9fdce8e443030ab99d31e42fffc977cf284c36c4 Mon Sep 17 00:00:00 2001 From: Sumedha Widyadharma Date: Thu, 7 Aug 2014 16:05:05 +0200 Subject: 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 --- src/webchannel/qmetaobjectpublisher.cpp | 53 +++++++++++++++++++-------------- src/webchannel/qmetaobjectpublisher_p.h | 10 ++++++- 2 files changed, 39 insertions(+), 24 deletions(-) (limited to 'src') 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()) { - 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 #include #include +#include +#include #include "qwebchannelglobal.h" @@ -217,8 +219,14 @@ private: typedef QHash PendingPropertyUpdates; PendingPropertyUpdates pendingPropertyUpdates; + // Struct containing the object itself and its ObjectInfo + struct ObjectInfo { + QObject* object; + QJsonValue info; + }; + // Maps wrapped object to class info - QHash wrappedObjects; + QHash 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 -- cgit v1.2.1