diff options
author | Lutz Schönemann <lutz.schoenemann@basyskom.com> | 2014-12-17 16:27:35 +0100 |
---|---|---|
committer | Tony Sarajärvi <tony.sarajarvi@digia.com> | 2015-05-15 17:58:17 +0000 |
commit | 368adbf8e75c00712c7a30eb6b8d7a7e175e89d7 (patch) | |
tree | dab3625745d0add6087c5fc69f27dbbb87d87d06 /tests/auto/webchannel/tst_webchannel.cpp | |
parent | c3bcbd1dcd8df8c93924853308d7f2ec95aba825 (diff) | |
download | qtwebchannel-368adbf8e75c00712c7a30eb6b8d7a7e175e89d7.tar.gz |
Fix wrap registered object issue
When wrapping a registered object the code generated a new
ID for an already known object. That new ID wasn't stored
but returned to the client including the objects information.
That resulted in a new created object on client side but
the remote object (on the server) was not accessible.
This patch fixes the issue by just returning the known ID
of a known object. Because the client already has a local
representation of that object it does not have to unwrap
the object description.
Change-Id: I31964823c84c84fd7ebce4386865c18fb5518be7
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
Diffstat (limited to 'tests/auto/webchannel/tst_webchannel.cpp')
-rw-r--r-- | tests/auto/webchannel/tst_webchannel.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/auto/webchannel/tst_webchannel.cpp b/tests/auto/webchannel/tst_webchannel.cpp index 55fd2d9..e36a1b3 100644 --- a/tests/auto/webchannel/tst_webchannel.cpp +++ b/tests/auto/webchannel/tst_webchannel.cpp @@ -148,6 +148,12 @@ void TestWebChannel::testInfoForObject() } { QJsonArray method; + method.append(QStringLiteral("setObjectProperty")); + method.append(obj.metaObject()->indexOfMethod("setObjectProperty(QObject*)")); + expected.append(method); + } + { + QJsonArray method; method.append(QStringLiteral("method1")); method.append(obj.metaObject()->indexOfMethod("method1()")); expected.append(method); @@ -230,6 +236,19 @@ void TestWebChannel::testInfoForObject() property.append(obj.bar()); expected.append(property); } + { + QJsonArray property; + property.append(obj.metaObject()->indexOfProperty("objectProperty")); + property.append(QStringLiteral("objectProperty")); + { + QJsonArray signal; + signal.append(1); + signal.append(obj.metaObject()->indexOfMethod("objectPropertyChanged()")); + property.append(signal); + } + property.append(QJsonValue::fromVariant(QVariant::fromValue(obj.objectProperty()))); + expected.append(property); + } QCOMPARE(info["properties"].toArray(), expected); } } @@ -270,6 +289,43 @@ void TestWebChannel::testDisconnect() m_dummyTransport->emitMessageReceived(QJsonObject()); } +void TestWebChannel::testWrapRegisteredObject() +{ + QWebChannel channel; + TestObject obj; + obj.setObjectName("myTestObject"); + + channel.registerObject(obj.objectName(), &obj); + channel.connectTo(m_dummyTransport); + channel.d_func()->publisher->initializeClient(m_dummyTransport); + + QJsonObject objectInfo = channel.d_func()->publisher->wrapResult(QVariant::fromValue(&obj), m_dummyTransport).toObject(); + + QCOMPARE(2, objectInfo.length()); + QVERIFY(objectInfo.contains("id")); + QVERIFY(objectInfo.contains("__QObject*__")); + QVERIFY(objectInfo.value("__QObject*__").isBool() && objectInfo.value("__QObject*__").toBool()); + + QString returnedId = objectInfo.value("id").toString(); + + QCOMPARE(&obj, channel.d_func()->publisher->registeredObjects.value(obj.objectName())); + QCOMPARE(obj.objectName(), channel.d_func()->publisher->registeredObjectIds.value(&obj)); + QCOMPARE(obj.objectName(), returnedId); +} + +void TestWebChannel::testInfiniteRecursion() +{ + QWebChannel channel; + TestObject obj; + obj.setObjectProperty(&obj); + obj.setObjectName("myTestObject"); + + channel.connectTo(m_dummyTransport); + channel.d_func()->publisher->initializeClient(m_dummyTransport); + + QJsonObject objectInfo = channel.d_func()->publisher->wrapResult(QVariant::fromValue(&obj), m_dummyTransport).toObject(); +} + static QHash<QString, QObject*> createObjects(QObject *parent) { const int num = 100; |