summaryrefslogtreecommitdiff
path: root/src/webchannel/qmetaobjectpublisher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/webchannel/qmetaobjectpublisher.cpp')
-rw-r--r--src/webchannel/qmetaobjectpublisher.cpp53
1 files changed, 30 insertions, 23 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;