summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2013-11-20 14:13:39 +0100
committerMilian Wolff <milian.wolff@kdab.com>2013-12-05 15:52:07 +0100
commit4a0d66958ab8c3785d82086d63c8eb441c95b7f1 (patch)
treed04144352c22a6a3f7741fb4540ce22bd89790de /tests
parentdf4e4df31e5f3b464c6d5777a2fb66237fb2525f (diff)
downloadqtwebchannel-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.html24
-rw-r--r--tests/qml/tst_metaobjectpublisher.qml41
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");
+ }
}