diff options
author | Kai Dohmen <psykai1993@googlemail.com> | 2016-04-28 22:08:55 +0200 |
---|---|---|
committer | Milian Wolff <milian.wolff@kdab.com> | 2016-07-21 09:04:31 +0000 |
commit | 43ff11f564d90f7818d741ae4304462938c38438 (patch) | |
tree | 2f495575f7b52c27dc3325fea9c60215f3582f82 /tests/auto/webchannel | |
parent | e35346cf70598c47a456946327927643910aa277 (diff) | |
download | qtwebchannel-43ff11f564d90f7818d741ae4304462938c38438.tar.gz |
Remove deleted transport objects
Added a QMultiHash which maps transport objects to wrapped object ids.
transportRemoved iterates over all matching wrapped objects and removes
the passed transport object from their transports-vector. If the
transports-vector is empty after removing the passed transport object
the objectDestroyed will be called on the wrapped object.
transportRemoved will be called either on the transports destoryed
signal or on disconnecting the webchannel from it.
Without this changes the QMetaObjectPublisher::wrappedObjects and
::registeredObjectIds would only be cleaned up if the website calls
deleteLater on QObjects but not on website reloads.
Task-number: QTBUG-50074
Change-Id: If294564fee2406edd7fb578852aeb269cac23a92
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
(cherry picked from commit fa2374d7c4dedea907e2df26fdad28bdee73b122)
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Diffstat (limited to 'tests/auto/webchannel')
-rw-r--r-- | tests/auto/webchannel/tst_webchannel.cpp | 53 | ||||
-rw-r--r-- | tests/auto/webchannel/tst_webchannel.h | 2 |
2 files changed, 55 insertions, 0 deletions
diff --git a/tests/auto/webchannel/tst_webchannel.cpp b/tests/auto/webchannel/tst_webchannel.cpp index 71779b9..5ee26ec 100644 --- a/tests/auto/webchannel/tst_webchannel.cpp +++ b/tests/auto/webchannel/tst_webchannel.cpp @@ -634,6 +634,28 @@ void TestWebChannel::testWrapRegisteredObject() QCOMPARE(obj.objectName(), returnedId); } +void TestWebChannel::testRemoveUnusedTransports() +{ + QWebChannel channel; + DummyTransport *dummyTransport = new DummyTransport(this); + TestObject obj; + + channel.connectTo(dummyTransport); + channel.d_func()->publisher->initializeClient(dummyTransport); + + QMetaObjectPublisher *pub = channel.d_func()->publisher; + pub->wrapResult(QVariant::fromValue(&obj), dummyTransport); + + QCOMPARE(pub->wrappedObjects.size(), 1); + QCOMPARE(pub->registeredObjectIds.size(), 1); + + channel.disconnectFrom(dummyTransport); + delete dummyTransport; + + QCOMPARE(pub->wrappedObjects.size(), 0); + QCOMPARE(pub->registeredObjectIds.size(), 0); +} + void TestWebChannel::testPassWrappedObjectBack() { QWebChannel channel; @@ -759,6 +781,37 @@ void TestWebChannel::benchRegisterObjects() channel.registerObjects(objects); } } + +void TestWebChannel::benchRemoveTransport() +{ + QWebChannel channel; + QList<DummyTransport*> dummyTransports; + for (int i = 500; i > 0; i--) + dummyTransports.append(new DummyTransport(this)); + + QList<QSharedPointer<TestObject>> objs; + QMetaObjectPublisher *pub = channel.d_func()->publisher; + + foreach (DummyTransport *transport, dummyTransports) { + channel.connectTo(transport); + channel.d_func()->publisher->initializeClient(transport); + + /* 30 objects per transport */ + for (int i = 30; i > 0; i--) { + QSharedPointer<TestObject> obj = QSharedPointer<TestObject>::create(); + objs.append(obj); + pub->wrapResult(QVariant::fromValue(obj.data()), transport); + } + } + + QBENCHMARK_ONCE { + foreach (DummyTransport *transport, dummyTransports) + pub->transportRemoved(transport); + } + + qDeleteAll(dummyTransports); +} + #ifdef WEBCHANNEL_TESTS_CAN_USE_JS_ENGINE class SubclassedTestObject : public TestObject diff --git a/tests/auto/webchannel/tst_webchannel.h b/tests/auto/webchannel/tst_webchannel.h index 3469d41..0f5cf1c 100644 --- a/tests/auto/webchannel/tst_webchannel.h +++ b/tests/auto/webchannel/tst_webchannel.h @@ -283,6 +283,7 @@ private slots: void testSetPropertyConversion(); void testDisconnect(); void testWrapRegisteredObject(); + void testRemoveUnusedTransports(); void testPassWrappedObjectBack(); void testInfiniteRecursion(); @@ -290,6 +291,7 @@ private slots: void benchInitializeClients(); void benchPropertyUpdates(); void benchRegisterObjects(); + void benchRemoveTransport(); void qtbug46548_overriddenProperties(); |