diff options
author | Sumedha Widyadharma <sumedha.widyadharma@basyskom.com> | 2014-08-07 16:05:05 +0200 |
---|---|---|
committer | Milian Wolff <milian.wolff@kdab.com> | 2014-12-15 15:15:38 +0100 |
commit | 9fdce8e443030ab99d31e42fffc977cf284c36c4 (patch) | |
tree | 692dae756b25c5ee433550a209e5f950d27b244e /tests/auto | |
parent | 0a43a43a166d2e2b551f543de61090637bd8b387 (diff) | |
download | qtwebchannel-9fdce8e443030ab99d31e42fffc977cf284c36c4.tar.gz |
Separate registered and autoregistered QObjects
Currently, a new client gets a list of _all_ registered QObjects,
whether they were explicitly registered or not.
This leaks internal information which the clients cannot use right away
anyway.
Change-Id: I4b25a731e9bc2d646f903057b409aecd34dc7f11
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/qml/Client.qml | 109 | ||||
-rw-r--r-- | tests/auto/qml/qml.pro | 4 | ||||
-rw-r--r-- | tests/auto/qml/tst_multiclient.qml | 143 |
3 files changed, 215 insertions, 41 deletions
diff --git a/tests/auto/qml/Client.qml b/tests/auto/qml/Client.qml index 20da8f6..6e12993 100644 --- a/tests/auto/qml/Client.qml +++ b/tests/auto/qml/Client.qml @@ -39,12 +39,15 @@ import QtWebChannel.Tests 1.0 import "qrc:///qtwebchannel/qwebchannel.js" as JSClient Item { + id: root + TestTransport { id: serverTransport } readonly property var serverTransport: serverTransport property var clientMessages: [] + property var serverMessages: [] property bool debug: false @@ -55,24 +58,21 @@ Item { function send(message) { - if (debug) { - console.log("client posts message: ", message, "is idle:", webChannel.clientIsIdle()); - } - clientMessages.push(message); + if (debug) + console.log("client", (root.objectName ? "(" + root.objectName + ")" : ""), "posts message: ", message, "is idle:", webChannel.clientIsIdle()); + clientMessages.push(JSON.parse(message)); serverTransport.receiveMessage(message); - if (message && message.type && message.type === JSClient.QWebChannelMessageTypes.idle) { + if (message && message.type && message.type === JSClient.QWebChannelMessageTypes.idle) verify(webChannel.clientIsIdle()); - } } Component.onCompleted: { - serverTransport.sendMessageRequested.connect(function(message) { - if (debug) { - console.log("client received message: ", JSON.stringify(message)); - } - if (onmessage) { + serverTransport.sendMessageRequested.connect(function receive(message) { + if (debug) + console.log("client", (root.objectName ? "(" + root.objectName + ")" : ""), "received message:", JSON.stringify(message)); + serverMessages.push(message); + if (onmessage) onmessage({data:message}); - } }); } } @@ -86,51 +86,82 @@ Item { function cleanup() { clientMessages = []; + serverMessages = []; } - function awaitRawMessage() + function awaitRawMessage(from) { - for (var i = 0; i < 10 && !clientMessages.length; ++i) { + if (!from || typeof from !== "string") + from = "clientMessages"; + else + from += "Messages"; + + for (var i = 0; i < 10 && !root[from].length; ++i) wait(10); - } - return clientMessages.shift(); + return root[from].shift(); } - function awaitMessage() + function awaitMessage(from) { - var msg = awaitRawMessage() - if (debug) { - console.log("handling message: ", msg); - } - if (!msg) { + var msg = awaitRawMessage(from) + if (debug) + console.log((root.objectName ? "(" + root.objectName + ")" : ""), "handling message: ", JSON.stringify(msg)); + if (!msg) return false; + return msg; + } + + function await(type, from, skip) { + var msg; + do { + msg = awaitMessage(); + verify(msg); + } while (skip && (msg.type === JSClient.QWebChannelMessageTypes.idle)); + if (type !== null) { + verify(msg); + verify(msg.type); + compare(msg.type, type); } - return JSON.parse(msg); + return msg; + } + + function awaitInit() { + return await(JSClient.QWebChannelMessageTypes.init); + } + + function awaitIdle() { + return await(JSClient.QWebChannelMessageTypes.idle); + } + + function awaitMessageSkipIdle() { + return awaitFunc(null, null, true); + } + + function awaitServerInit() { + return await(JSClient.QWebChannelMessageTypes.init, "server"); } - function awaitInit() + function awaitSignal() { - var msg = awaitMessage(); - verify(msg); - verify(msg.type); - compare(msg.type, JSClient.QWebChannelMessageTypes.init); + return await(JSClient.QWebChannelMessageTypes.signal, "server"); } - function awaitIdle() + function awaitPropertyUpdate() { - var msg = awaitMessage(); - verify(msg); - compare(msg.type, JSClient.QWebChannelMessageTypes.idle); + return await(JSClient.QWebChannelMessageTypes.propertyUpdate, "server"); } - function awaitMessageSkipIdle() + function awaitResponse() { - var msg; - do { - msg = awaitMessage(); - verify(msg); - } while (msg.type === JSClient.QWebChannelMessageTypes.idle); - return msg; + return await(JSClient.QWebChannelMessageTypes.response, "server"); } + function skipToMessage(type, from, max) { + do { + var msg = awaitMessage(from); + if (msg && msg.type === type) + return msg + } while (--max > 0); + return false; + } } diff --git a/tests/auto/qml/qml.pro b/tests/auto/qml/qml.pro index b0c52b5..89c5f56 100644 --- a/tests/auto/qml/qml.pro +++ b/tests/auto/qml/qml.pro @@ -17,9 +17,11 @@ HEADERS += \ testwebchannel.h OTHER_FILES += \ + Client.qml \ WebChannelTest.qml \ tst_webchannel.qml \ tst_metaobjectpublisher.qml \ - tst_bench.qml + tst_bench.qml \ + tst_multiclient.qml \ TESTDATA = data/* diff --git a/tests/auto/qml/tst_multiclient.qml b/tests/auto/qml/tst_multiclient.qml index b696391..115857d 100644 --- a/tests/auto/qml/tst_multiclient.qml +++ b/tests/auto/qml/tst_multiclient.qml @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Copyright (C) 2014 basysKom GmbH, info@basyskom.com, author Lutz Schönemann <lutz.schoenemann@basyskom.com> ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtWebChannel module of the Qt Toolkit. @@ -37,6 +38,8 @@ import QtTest 1.0 import QtWebChannel 1.0 import QtWebChannel.Tests 1.0 +import "qrc:///qtwebchannel/qwebchannel.js" as JSClient + TestCase { name: "MultiClient" @@ -62,18 +65,85 @@ TestCase { WebChannel.id: "foo" } + property var lastMethodArg + QtObject { + id: myObj + property int myProperty: 1 + + signal mySignal(var arg) + + function myMethod(arg) + { + lastMethodArg = arg; + } + + WebChannel.id: "myObj" + } + + QtObject { + id: myOtherObj + property var foo: 1 + property var bar: 1 + WebChannel.id: "myOtherObj" + } + + QtObject { + id: myFactory + property var lastObj + property var createdObjects: [] + + function cleanup() { + while (createdObjects.length) { + var obj = createdObjects.shift(); + if (obj) { + obj.destroy(); + } + } + } + + function create(id) + { + lastObj = component.createObject(myFactory, {objectName: id}); + createdObjects.push(lastObj); + return lastObj; + } + WebChannel.id: "myFactory" + } + + Component { + id: component + QtObject { + property var myProperty : 0 + function myMethod(arg) { + lastMethodArg = arg; + } + signal mySignal(var arg1, var arg2) + } + } + TestWebChannel { id: webChannel transports: [client1.serverTransport, client2.serverTransport] - registeredObjects: [foo] + registeredObjects: [foo, myObj, myOtherObj, myFactory] } function init() { + myObj.myProperty = 1 client1.cleanup(); client2.cleanup(); } + function cleanup() { + client1.debug = false; + client2.debug = false; + // delete all created objects + myFactory.cleanup(); + myFactory.lastObj = undefined; + // reschedule current task to end of event loop + wait(1); + } + function clientInitCallback(channel) { channel.objects.foo.ping.connect(function() { @@ -103,4 +173,75 @@ TestCase { compare(c1.pongAnswer, 1); compare(c2.pongAnswer, 2); } + + function test_autowrappedObjectsNotInInit() { + var testObj1; + var testObj1Id; + + var channel1 = client1.createChannel(function (channel1) { + channel1.objects.myFactory.create("testObj1", function (obj1) { + testObj1 = myFactory.lastObj; + testObj1Id = obj1.__id__; + + // create second channel after factory has created first + // object to make sure that a dynamically created object + // exists but does not get exposed to new channels + createSecondChannel(); + }); + }); + var channel2; + function createSecondChannel() { + // dismiss all messges received before channel creation + client2.cleanup(); + + channel2 = client2.createChannel(function (channel2) { + }); + } + + client1.awaitInit(); + var msg1 = client1.awaitMessage(); + compare(msg1.type, JSClient.QWebChannelMessageTypes.invokeMethod); // create + + client1.awaitIdle(); + + client2.awaitInit(); + client2.awaitIdle(); + + compare(typeof channel2.objects[testObj1Id], "undefined") + } + + function test_autowrappedObjectsNotBroadcasted() { + var testObj2; + var testObj2Id; + + var channel1 = client1.createChannel(function (channel1) { + // create second channel after first channel to make sure + // that a dynamically created object do not get exposed to + // existing channels + createSecondChannel(); + }); + var channel2; + function createSecondChannel() { + // dismiss all messges received before channel creation + client2.cleanup(); + + channel2 = client2.createChannel(function (channel2) { + channel2.objects.myFactory.create("testObj2", function (obj2) { + testObj2 = myFactory.lastObj; + testObj2Id = obj2.__id__; + }); + }); + } + + client1.awaitInit(); + client1.awaitIdle(); + + client2.awaitInit(); + var msg2 = client2.awaitMessage(); + compare(msg2.type, JSClient.QWebChannelMessageTypes.invokeMethod); // create + + client2.awaitIdle(); + + compare(typeof channel1.objects[testObj2Id], "undefined") + } } |