diff options
Diffstat (limited to 'tests/auto/qml')
-rw-r--r-- | tests/auto/qml/TestWebView.qml | 81 | ||||
-rw-r--r-- | tests/auto/qml/WebChannelTest.qml | 157 | ||||
-rw-r--r-- | tests/auto/qml/data/bench_init.html | 13 | ||||
-rw-r--r-- | tests/auto/qml/data/disconnect.html | 21 | ||||
-rw-r--r-- | tests/auto/qml/data/grouping.html | 17 | ||||
-rw-r--r-- | tests/auto/qml/data/method.html | 17 | ||||
-rw-r--r-- | tests/auto/qml/data/multiclient.html | 19 | ||||
-rw-r--r-- | tests/auto/qml/data/property.html | 21 | ||||
-rw-r--r-- | tests/auto/qml/data/receiveRaw.html | 15 | ||||
-rw-r--r-- | tests/auto/qml/data/send.html | 17 | ||||
-rw-r--r-- | tests/auto/qml/data/signal.html | 17 | ||||
-rw-r--r-- | tests/auto/qml/data/testsetup.js | 47 | ||||
-rw-r--r-- | tests/auto/qml/data/wrapper.html | 28 | ||||
-rw-r--r-- | tests/auto/qml/qml.cpp | 44 | ||||
-rw-r--r-- | tests/auto/qml/qml.pro | 19 | ||||
-rw-r--r-- | tests/auto/qml/tst_bench.qml | 123 | ||||
-rw-r--r-- | tests/auto/qml/tst_metaobjectpublisher.qml | 272 | ||||
-rw-r--r-- | tests/auto/qml/tst_multiclient.qml | 99 | ||||
-rw-r--r-- | tests/auto/qml/tst_webchannel.qml | 59 |
19 files changed, 1086 insertions, 0 deletions
diff --git a/tests/auto/qml/TestWebView.qml b/tests/auto/qml/TestWebView.qml new file mode 100644 index 0000000..3b12f38 --- /dev/null +++ b/tests/auto/qml/TestWebView.qml @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtTest 1.0 + +import QtWebKit 3.0 +import QtWebKit.experimental 1.0 + +WebView { + id: view + property var lastLoadStatus + + experimental.preferences.developerExtrasEnabled: true + experimental.preferences.navigatorQtObjectEnabled: true + + onLoadingChanged: { + // NOTE: we cannot use spy.signalArguments nor save the loadRequest anywhere, as it gets + // deleted after the slots connected to the signal have finished... i.e. it's a weak pointer, + // not a shared pointer. As such, we have to copy out the interesting data we need later on here... + lastLoadStatus = loadRequest.status + } + + SignalSpy { + id: loadingSpy + target: view + signalName: "onLoadingChanged" + } + + function waitForLoaded() + { + do { + loadingSpy.wait(500); + } while (loading); + return lastLoadStatus == WebView.LoadSucceededStatus; + } + + function clear() + { + url = ""; + loadingSpy.clear() + } +} diff --git a/tests/auto/qml/WebChannelTest.qml b/tests/auto/qml/WebChannelTest.qml new file mode 100644 index 0000000..9a0baa9 --- /dev/null +++ b/tests/auto/qml/WebChannelTest.qml @@ -0,0 +1,157 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtTest 1.0 + +import QtWebChannel 1.0 + +TestCase { + property var lastLoadStatus + property bool useWebViewTransport: false + + // only run after the webchannel has finished initialization + when: webSocketTransport.baseUrl != "" + + WebViewTransport { + id: webViewTransport + webViewExperimental: defaultView.experimental + } + WebSocketTransport { + id: webSocketTransport + } + + TestWebView { + id: defaultView + } + + WebChannel { + id: webChannel + } + property var webChannel: webChannel + + SignalSpy { + id: rawMessageSpy + target: useWebViewTransport ? webViewTransport : webSocketTransport; + signalName: "onMessageReceived" + } + property var rawMessageSpy: rawMessageSpy + property var rawMessageIdx: 0; + + function urlForFile(file) + { + verify(useWebViewTransport || webSocketTransport.baseUrl != "", "webSocketTransport.baseUrl is empty"); + return "data/" + file + (!useWebViewTransport ? "?webChannelBaseUrl=" + webSocketTransport.baseUrl : ""); + } + + // load file in the given view or use the global one by default + function loadUrl(file, view) + { + if (useWebViewTransport) { + webChannel.disconnectFrom(webSocketTransport); + webChannel.connectTo(webViewTransport); + } else { + webChannel.disconnectFrom(webViewTransport); + webChannel.connectTo(webSocketTransport); + } + if (!view) { + view = defaultView; + } + view.url = urlForFile(file); + view.waitForLoaded(); + } + + function cleanup() + { + defaultView.clear(); + rawMessageSpy.clear(); + rawMessageIdx = 0; + } + + function awaitRawMessage() + { + rawMessageSpy.wait(500); + if (rawMessageSpy.signalArguments.length <= rawMessageIdx) { + // still no message received, fail + return null; + } + return rawMessageSpy.signalArguments[rawMessageIdx++][0]; + } + + function awaitMessage() + { + var msg = awaitRawMessage() + if (!msg) { + return msg; + } + return JSON.parse(msg); + } + + function awaitInit() + { + var msg = awaitMessage(); + verify(msg); + verify(msg.data); + verify(msg.data.type); + compare(msg.data.type, qWebChannelMessageTypes.init); + } + + function awaitIdle() + { + var msg = awaitMessage(); + verify(msg); + verify(msg.data); + compare(msg.data.type, qWebChannelMessageTypes.idle); + verify(webChannel.test_clientIsIdle()) + } + + property var qWebChannelMessageTypes: ({ + signal: 1, + propertyUpdate: 2, + init: 3, + idle: 4, + debug: 5, + invokeMethod: 6, + connectToSignal: 7, + disconnectFromSignal: 8, + setProperty: 9, + }); +} diff --git a/tests/auto/qml/data/bench_init.html b/tests/auto/qml/data/bench_init.html new file mode 100644 index 0000000..7d3af5b --- /dev/null +++ b/tests/auto/qml/data/bench_init.html @@ -0,0 +1,13 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) {}); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/data/disconnect.html b/tests/auto/qml/data/disconnect.html new file mode 100644 index 0000000..a9a479c --- /dev/null +++ b/tests/auto/qml/data/disconnect.html @@ -0,0 +1,21 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) { + 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/auto/qml/data/grouping.html b/tests/auto/qml/data/grouping.html new file mode 100644 index 0000000..f2d7aec --- /dev/null +++ b/tests/auto/qml/data/grouping.html @@ -0,0 +1,17 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + window.channel = createWebChannel(function(channel) { + channel.subscribe(QWebChannelMessageTypes.propertyUpdate, function() { + channel.exec({label: "gotPropertyUpdate", values: [myObj.myProperty(), myOtherObj.foo(), myOtherObj.bar()]}); + }); + }); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/data/method.html b/tests/auto/qml/data/method.html new file mode 100644 index 0000000..6dbaa90 --- /dev/null +++ b/tests/auto/qml/data/method.html @@ -0,0 +1,17 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) { + channel.subscribe("invokeMethod", function(arg) { + myObj.myMethod(arg); + }); + }); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/data/multiclient.html b/tests/auto/qml/data/multiclient.html new file mode 100644 index 0000000..1573a1a --- /dev/null +++ b/tests/auto/qml/data/multiclient.html @@ -0,0 +1,19 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) { + foo.ping.connect(function() { + foo.pong(function(value) { + channel.exec({pongAnswer: value}); + }); + }); + }); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/data/property.html b/tests/auto/qml/data/property.html new file mode 100644 index 0000000..9565aaa --- /dev/null +++ b/tests/auto/qml/data/property.html @@ -0,0 +1,21 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) { + channel.exec({label: "init", value: myObj.myProperty()}); + myObj.myPropertyChanged.connect(function() { + channel.exec({label: "changed", value: myObj.myProperty()}); + }); + channel.subscribe("setProperty", function(newValue) { + myObj.myProperty = newValue; + }); + }); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/data/receiveRaw.html b/tests/auto/qml/data/receiveRaw.html new file mode 100644 index 0000000..139b2b1 --- /dev/null +++ b/tests/auto/qml/data/receiveRaw.html @@ -0,0 +1,15 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) { + channel.send("foobar"); + }, true /* raw */); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/data/send.html b/tests/auto/qml/data/send.html new file mode 100644 index 0000000..c60fbf4 --- /dev/null +++ b/tests/auto/qml/data/send.html @@ -0,0 +1,17 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) { + channel.subscribe("myMessage", function(payload) { + channel.send("myMessagePong:" + payload); + }); + }, true /* raw */); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/data/signal.html b/tests/auto/qml/data/signal.html new file mode 100644 index 0000000..bdce0c7 --- /dev/null +++ b/tests/auto/qml/data/signal.html @@ -0,0 +1,17 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) { + myObj.mySignal.connect(function(arg) { + channel.exec({label: "signalReceived", value: arg}); + }); + }); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/data/testsetup.js b/tests/auto/qml/data/testsetup.js new file mode 100644 index 0000000..c0db83a --- /dev/null +++ b/tests/auto/qml/data/testsetup.js @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +window.createWebChannel = function(callback, raw) +{ + var baseUrlMatch = /[?&]webChannelBaseUrl=([A-Za-z0-9\-:/\.]+)/.exec(location.search); + var transport = baseUrlMatch ? baseUrlMatch[1] : navigator.qt; + return new QWebChannel(transport, callback, raw); +} diff --git a/tests/auto/qml/data/wrapper.html b/tests/auto/qml/data/wrapper.html new file mode 100644 index 0000000..a556486 --- /dev/null +++ b/tests/auto/qml/data/wrapper.html @@ -0,0 +1,28 @@ +<html> + <head> + <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> + <script type="text/javascript" src="testsetup.js"></script> + <script type="text/javascript"> + //BEGIN SETUP + createWebChannel(function(channel) { + myFactory.create("testObj", function(obj) { + window[obj.objectName()] = obj; + obj.mySignal.connect(function(arg1, arg2) { + channel.exec({label: "signalReceived", args: [arg1, arg2]}); + }); + obj.myProperty = 42; + obj.myMethod("foobar"); + }); + channel.subscribe("triggerDelete", function() { + testObj.deleteLater(); + }); + channel.subscribe("report", function() { + channel.exec({label:"report", obj: testObj}) + }); + }); + //END SETUP + </script> + </head> + <body> + </body> +</html> diff --git a/tests/auto/qml/qml.cpp b/tests/auto/qml/qml.cpp new file mode 100644 index 0000000..7267842 --- /dev/null +++ b/tests/auto/qml/qml.cpp @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtQuickTest/quicktest.h> + +QUICK_TEST_MAIN(qml) diff --git a/tests/auto/qml/qml.pro b/tests/auto/qml/qml.pro new file mode 100644 index 0000000..f86dc90 --- /dev/null +++ b/tests/auto/qml/qml.pro @@ -0,0 +1,19 @@ +QT += testlib webchannel +TEMPLATE = app +TARGET = qml + +CONFIG += warn_on qmltestcase + +# TODO: running tests without requiring make install +IMPORTPATH += $$OUT_PWD/../../../qml $$PWD + +SOURCES += \ + qml.cpp + +OTHER_FILES += \ + WebChannelTest.qml \ + tst_webchannel.qml \ + tst_metaobjectpublisher.qml \ + tst_bench.qml + +TESTDATA = data/* diff --git a/tests/auto/qml/tst_bench.qml b/tests/auto/qml/tst_bench.qml new file mode 100644 index 0000000..056dda9 --- /dev/null +++ b/tests/auto/qml/tst_bench.qml @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +import QtWebChannel 1.0 + +WebChannelTest { + name: "Bench" + id: test + + Component { + id: component + QtObject { + property var p0 : 0 + property var p1 : 0 + property var p2 : 0 + property var p3 : 0 + property var p4 : 0 + property var p5 : 0 + property var p6 : 0 + property var p7 : 0 + property var p8 : 0 + property var p9 : 0 + function m0(arg1, arg2) {} + function m1(arg1, arg2) {} + function m2(arg1, arg2) {} + function m3(arg1, arg2) {} + function m4(arg1, arg2) {} + function m5(arg1, arg2) {} + function m6(arg1, arg2) {} + function m7(arg1, arg2) {} + function m8(arg1, arg2) {} + function m9(arg1, arg2) {} + signal s0(var arg1, var arg2) + signal s1(var arg1, var arg2) + signal s2(var arg1, var arg2) + signal s3(var arg1, var arg2) + signal s4(var arg1, var arg2) + signal s5(var arg1, var arg2) + signal s6(var arg1, var arg2) + signal s7(var arg1, var arg2) + signal s8(var arg1, var arg2) + signal s9(var arg1, var arg2) + } + } + + property var objects: ({}) + + function initTestCase() + { + for (var i = 0; i < 100; ++i) { + var id = "obj" + i; + var properties = {objectName: id}; + objects[id] = component.createObject(test, properties); + } + + webChannel.registerObjects(objects); + } + + function benchmark_init_baseline() + { + loadUrl("bench_init.html"); + } + + function benchmark_init_webview() + { + useWebViewTransport = true; + loadUrl("bench_init.html"); + // init + awaitMessage(); + // idle + awaitMessage(); + } + + function benchmark_init_websocket() + { + useWebViewTransport = false; + loadUrl("bench_init.html"); + // init + awaitMessage(); + // idle + awaitMessage(); + } +} diff --git a/tests/auto/qml/tst_metaobjectpublisher.qml b/tests/auto/qml/tst_metaobjectpublisher.qml new file mode 100644 index 0000000..e07f105 --- /dev/null +++ b/tests/auto/qml/tst_metaobjectpublisher.qml @@ -0,0 +1,272 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +import QtWebChannel 1.0 + +WebChannelTest { + name: "MetaObjectPublisher" + id: test + + 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 + function create(id) + { + lastObj = component.createObject(myFactory, {objectName: id}); + return lastObj; + } + WebChannel.id: "myFactory" + } + + Component { + id: component + QtObject { + property var myProperty : 0 + function myMethod(arg) { + mySignal(arg, myProperty); + } + signal mySignal(var arg1, var arg2) + } + } + + function initTestCase() + { + webChannel.registeredObjects = [myObj, myOtherObj, myFactory]; + } + + function awaitMessageSkipIdle() + { + var msg; + do { + msg = awaitMessage(); + verify(msg); + verify(msg.data); + } while (msg.data.type === qWebChannelMessageTypes.idle); + return msg; + } + + function test_property() + { + myObj.myProperty = 1 + loadUrl("property.html"); + awaitInit(); + var msg = awaitMessageSkipIdle(); + compare(msg.data.label, "init"); + compare(msg.data.value, 1); + compare(myObj.myProperty, 1); + + // change property, should be propagated to HTML client and a message be send there + myObj.myProperty = 2; + msg = awaitMessageSkipIdle(); + compare(msg.data.label, "changed"); + compare(msg.data.value, 2); + compare(myObj.myProperty, 2); + + // now trigger a write from the client side + webChannel.sendMessage("setProperty", 3); + msg = awaitMessageSkipIdle(); + compare(myObj.myProperty, 3); + + // the above write is also propagated to the HTML client + msg = awaitMessageSkipIdle(); + compare(msg.data.label, "changed"); + compare(msg.data.value, 3); + + awaitIdle(); + } + + function test_method() + { + loadUrl("method.html"); + awaitInit(); + awaitIdle(); + + webChannel.sendMessage("invokeMethod", "test"); + + var msg = awaitMessage(); + compare(msg.data.type, qWebChannelMessageTypes.invokeMethod); + compare(msg.data.object, "myObj"); + compare(msg.data.args, ["test"]); + + compare(lastMethodArg, "test") + } + + function test_signal() + { + loadUrl("signal.html"); + awaitInit(); + + var msg = awaitMessage(); + compare(msg.data.type, qWebChannelMessageTypes.connectToSignal); + compare(msg.data.object, "myObj"); + + awaitIdle(); + + myObj.mySignal("test"); + + msg = awaitMessage(); + compare(msg.data.label, "signalReceived"); + compare(msg.data.value, "test"); + } + + function test_grouping() + { + loadUrl("grouping.html"); + awaitInit(); + awaitIdle(); + + // change properties a lot, we expect this to be grouped into a single update notification + for (var i = 0; i < 10; ++i) { + myObj.myProperty = i; + myOtherObj.foo = i; + myOtherObj.bar = i; + } + + var msg = awaitMessage(); + verify(msg); + compare(msg.data.label, "gotPropertyUpdate"); + compare(msg.data.values, [myObj.myProperty, myOtherObj.foo, myOtherObj.bar]); + + awaitIdle(); + } + + function test_wrapper() + { + loadUrl("wrapper.html"); + awaitInit(); + + var msg = awaitMessageSkipIdle(); + compare(msg.data.type, qWebChannelMessageTypes.invokeMethod); + compare(msg.data.object, "myFactory"); + verify(myFactory.lastObj); + compare(myFactory.lastObj.objectName, "testObj"); + + msg = awaitMessageSkipIdle(); + compare(msg.data.type, qWebChannelMessageTypes.connectToSignal); + verify(msg.data.object); + var objId = msg.data.object; + + msg = awaitMessageSkipIdle(); + compare(msg.data.type, qWebChannelMessageTypes.connectToSignal); + compare(msg.data.object, objId); + + msg = awaitMessageSkipIdle(); + compare(msg.data.type, qWebChannelMessageTypes.setProperty); + compare(msg.data.object, objId); + compare(myFactory.lastObj.myProperty, 42); + + msg = awaitMessageSkipIdle(); + compare(msg.data.type, qWebChannelMessageTypes.invokeMethod); + compare(msg.data.object, objId); + compare(msg.data.args, ["foobar"]); + + msg = awaitMessageSkipIdle(); + compare(msg.data.label, "signalReceived"); + compare(msg.data.args, ["foobar", 42]); + + // pass QObject* on the fly and trigger deleteLater from client side + webChannel.sendMessage("triggerDelete"); + + msg = awaitMessageSkipIdle(); + compare(msg.data.type, qWebChannelMessageTypes.invokeMethod); + compare(msg.data.object, objId); + + webChannel.sendMessage("report"); + + msg = awaitMessageSkipIdle(); + compare(msg.data.label, "report"); + compare(msg.data.obj, {}); + } + + function test_disconnect() + { + loadUrl("disconnect.html"); + awaitInit(); + + var msg = awaitMessage(); + compare(msg.data.type, qWebChannelMessageTypes.connectToSignal); + compare(msg.data.object, "myObj"); + + awaitIdle(); + + myObj.mySignal(42); + + msg = awaitMessage(); + compare(msg.data.label, "mySignalReceived"); + compare(msg.data.args, [42]); + + msg = awaitMessage(); + compare(msg.data.type, qWebChannelMessageTypes.disconnectFromSignal); + compare(msg.data.object, "myObj"); + + 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"); + } +} diff --git a/tests/auto/qml/tst_multiclient.qml b/tests/auto/qml/tst_multiclient.qml new file mode 100644 index 0000000..519a63c --- /dev/null +++ b/tests/auto/qml/tst_multiclient.qml @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +import QtWebChannel 1.0 + +WebChannelTest { + name: "MultiClient" + id: test + + QtObject { + id: foo + property int bar: 0 + + signal ping() + + function pong() + { + return ++bar; + } + + WebChannel.id: "foo" + } + + TestWebView { + id: client1 + } + TestWebView { + id: client2 + } + + function initTestCase() + { + webChannel.registeredObjects = [foo]; + } + + function test_multiclient() + { + loadUrl("multiclient.html", client1); + loadUrl("multiclient.html", client2); + // init, connect & idle messages for two clients + for (var i = 0; i < 3 * 2; ++i) { + awaitMessage(); + } + + foo.ping(); + + // invoke of pong method + awaitMessage(); + awaitMessage(); + + var msg = awaitMessage(); + compare(msg.data.pongAnswer, 1); + msg = awaitMessage(); + compare(msg.data.pongAnswer, 2); + + awaitIdle(); + awaitIdle(); + } +} diff --git a/tests/auto/qml/tst_webchannel.qml b/tests/auto/qml/tst_webchannel.qml new file mode 100644 index 0000000..dddba71 --- /dev/null +++ b/tests/auto/qml/tst_webchannel.qml @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +WebChannelTest { + name: "WebChannel" + + function test_receiveRawMessage() + { + loadUrl("receiveRaw.html"); + compare(awaitRawMessage(), "foobar"); + } + + function test_sendMessage() + { + loadUrl("send.html"); + webChannel.sendMessage("myMessage", "foobar"); + compare(awaitRawMessage(), "myMessagePong:foobar"); + } +} |