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 | |
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')
-rw-r--r-- | src/webchannel/qmetaobjectpublisher.cpp | 24 | ||||
-rw-r--r-- | src/webchannel/qmetaobjectpublisher_p.h | 7 | ||||
-rw-r--r-- | src/webchannel/qwebchannel.cpp | 5 |
3 files changed, 35 insertions, 1 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)) { diff --git a/src/webchannel/qmetaobjectpublisher_p.h b/src/webchannel/qmetaobjectpublisher_p.h index 29956e0..3ccd7d4 100644 --- a/src/webchannel/qmetaobjectpublisher_p.h +++ b/src/webchannel/qmetaobjectpublisher_p.h @@ -177,6 +177,11 @@ public: QVariant toVariant(const QJsonValue &value, int targetType) const; /** + * Remove wrapped objects which last transport relation is with the passed transport object. + */ + void transportRemoved(QWebChannelAbstractTransport *transport); + + /** * Given a QVariant containing a QObject*, wrap the object and register for property updates * return the objects class information. * @@ -257,6 +262,8 @@ private: // Map of objects wrapped from invocation returns QHash<QString, ObjectInfo> wrappedObjects; + // Map of transports to wrapped object ids + QMultiHash<QWebChannelAbstractTransport*, QString> transportedWrappedObjects; // 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. diff --git a/src/webchannel/qwebchannel.cpp b/src/webchannel/qwebchannel.cpp index c2e0d19..0e9a4c5 100644 --- a/src/webchannel/qwebchannel.cpp +++ b/src/webchannel/qwebchannel.cpp @@ -81,9 +81,11 @@ QT_BEGIN_NAMESPACE */ void QWebChannelPrivate::_q_transportDestroyed(QObject *object) { - const int idx = transports.indexOf(static_cast<QWebChannelAbstractTransport*>(object)); + QWebChannelAbstractTransport *transport = static_cast<QWebChannelAbstractTransport*>(object); + const int idx = transports.indexOf(transport); if (idx != -1) { transports.remove(idx); + publisher->transportRemoved(transport); } } @@ -252,6 +254,7 @@ void QWebChannel::disconnectFrom(QWebChannelAbstractTransport *transport) disconnect(transport, 0, this, 0); disconnect(transport, 0, d->publisher, 0); d->transports.remove(idx); + d->publisher->transportRemoved(transport); } } |