diff options
author | Liang Qi <liang.qi@qt.io> | 2016-08-01 11:04:14 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-08-01 11:04:21 +0200 |
commit | d342edcc22d3c9c0299e86805d93e7031507345b (patch) | |
tree | 29893a91dd70c3009e8f4343f9e4d447cf4dfb77 /src/webchannel/qmetaobjectpublisher.cpp | |
parent | 58c800edb56d976d95cb2097e27cd39cfc02bf50 (diff) | |
parent | 3b28a6956cb3cab087481312dc82a907b118e0de (diff) | |
download | qtwebchannel-d342edcc22d3c9c0299e86805d93e7031507345b.tar.gz |
Merge remote-tracking branch 'origin/5.6' into 5.7
Change-Id: If2a4f50d03fccc2654b8336d9e40daea85d6adca
Diffstat (limited to 'src/webchannel/qmetaobjectpublisher.cpp')
-rw-r--r-- | src/webchannel/qmetaobjectpublisher.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp index e9d93ea..d796d1e 100644 --- a/src/webchannel/qmetaobjectpublisher.cpp +++ b/src/webchannel/qmetaobjectpublisher.cpp @@ -455,6 +455,29 @@ void QMetaObjectPublisher::objectDestroyed(const QObject *object) pendingPropertyUpdates.remove(object); } +void QMetaObjectPublisher::transportRemoved(QWebChannelAbstractTransport *transport) +{ + QHash<QWebChannelAbstractTransport*, QString>::iterator it = transportedWrappedObjects.find(transport); + // It is not allowed to modify a container while iterating over it. So save + // objects which should be removed and call objectDestroyed() on them later. + QVector<QObject*> objectsForDeletion; + while (it != transportedWrappedObjects.end() && it.key() == transport) { + if (wrappedObjects.contains(it.value())) { + QVector<QWebChannelAbstractTransport*> &transports = wrappedObjects[it.value()].transports; + transports.removeOne(transport); + if (transports.isEmpty()) + objectsForDeletion.append(wrappedObjects[it.value()].object); + } + + it++; + } + + transportedWrappedObjects.remove(transport); + + foreach (QObject *obj, objectsForDeletion) + objectDestroyed(obj); +} + QObject *QMetaObjectPublisher::unwrapObject(const QString &objectId) const { if (!objectId.isEmpty()) { @@ -526,6 +549,7 @@ QJsonValue QMetaObjectPublisher::wrapResult(const QVariant &result, QWebChannelA oi.transports = webChannel->d_func()->transports; } wrappedObjects.insert(id, oi); + transportedWrappedObjects.insert(transport, id); initializePropertyUpdates(object, classInfo); } else if (wrappedObjects.contains(id)) { |