diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2013-11-20 14:13:39 +0100 |
---|---|---|
committer | Milian Wolff <milian.wolff@kdab.com> | 2013-12-05 15:52:07 +0100 |
commit | 4a0d66958ab8c3785d82086d63c8eb441c95b7f1 (patch) | |
tree | d04144352c22a6a3f7741fb4540ce22bd89790de /tests | |
parent | df4e4df31e5f3b464c6d5777a2fb66237fb2525f (diff) | |
download | qtwebchannel-4a0d66958ab8c3785d82086d63c8eb441c95b7f1.tar.gz |
Make it possible to disconnect from signals on the client side.
To do so, we need to remember the connected functor and pass that to
disconnect, in both the client side as well as the QML server side.
Change-Id: Ic61fc5d2a203212278c23471c216683e309e2c9f
Reviewed-by: Pierre Rossi <pierre.rossi@gmail.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/qml/disconnect.html | 24 | ||||
-rw-r--r-- | tests/qml/tst_metaobjectpublisher.qml | 41 |
2 files changed, 64 insertions, 1 deletions
diff --git a/tests/qml/disconnect.html b/tests/qml/disconnect.html new file mode 100644 index 0000000..f4cbb0a --- /dev/null +++ b/tests/qml/disconnect.html @@ -0,0 +1,24 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/webchannel.js"></script> + <script type="text/javascript" src="qrc:///qwebchannel/qobject.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + var baseUrl = (/[?&]webChannelBaseUrl=([A-Za-z0-9\-:/\.]+)/.exec(location.search)[1]); + new QWebChannel(baseUrl, function(channel) { + setupQObjectWebChannel(channel, function() { + myObj.mySignal.connect(function(arg) { + channel.exec({label: "mySignalReceived", args: [arg]}); + myObj.mySignal.disconnect(this); + }); + channel.subscribe("report", function() { + channel.exec({label: "report"}); + }); + }); + }); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/qml/tst_metaobjectpublisher.qml b/tests/qml/tst_metaobjectpublisher.qml index afbf624..4754c3d 100644 --- a/tests/qml/tst_metaobjectpublisher.qml +++ b/tests/qml/tst_metaobjectpublisher.qml @@ -85,7 +85,10 @@ WebChannelTest { onRawMessageReceived: { var message = JSON.parse(rawMessage); verify(message); - publisher.handleRequest(message); + var handled = publisher.handleRequest(message); + if (message.data && message.data.type) { + verify(handled); + } } } } @@ -263,4 +266,40 @@ WebChannelTest { compare(msg.data.label, "report"); compare(msg.data.obj, {}); } + + function test_disconnect() + { + loadUrl("disconnect.html"); + awaitInit(); + + var msg = awaitMessage(); + compare(msg.data.type, "Qt.connectToSignal"); + compare(msg.data.signal, "mySignal"); + compare(msg.data.object, "myObj"); + verify(publisher.subscriberCountMap["myObj"].hasOwnProperty("mySignal")); + + awaitIdle(); + + myObj.mySignal(42); + + msg = awaitMessage(); + compare(msg.data.label, "mySignalReceived"); + compare(msg.data.args, [42]); + + msg = awaitMessage(); + compare(msg.data.type, "Qt.disconnectFromSignal"); + compare(msg.data.object, "myObj"); + compare(msg.data.signal, "mySignal"); + + verify(!publisher.subscriberCountMap["myObj"].hasOwnProperty("mySignal")); + + myObj.mySignal(0); + + // apparently one cannot expect failure in QML, so trigger another message + // and verify no mySignalReceived was triggered by the above emission + webChannel.sendMessage("report"); + + msg = awaitMessage(); + compare(msg.data.label, "report"); + } } |