/**************************************************************************** ** ** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtWebChannel module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** 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 The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtTest 1.0 import QtWebChannel 1.0 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 QtObject { id: clientTransport property var onmessage; function send(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) verify(webChannel.clientIsIdle()); } Component.onCompleted: { 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}); }); } } readonly property var clientTransport: clientTransport function createChannel(callback, raw) { return new JSClient.QWebChannel(clientTransport, callback, raw); } function cleanup() { clientMessages = []; serverMessages = []; } function awaitRawMessage(from) { var messages; if (!from || typeof from !== "string" || from == "client") { from = "client"; messages = clientMessages; } else { from = "server"; messages = serverMessages; } for (var i = 0; i < 10 && !messages.length; ++i) wait(10); var msg = messages.shift(); if (debug) { console.log((root.objectName ? "(" + root.objectName + ")" : ""), "shifting message " + from + "[" + messages.length + "]" + ":" + JSON.stringify(msg)); } return msg; } function awaitMessage(from) { 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(from); if (!msg) { console.trace(); verify(msg); } } while (skip && (msg.type === JSClient.QWebChannelMessageTypes.idle)); if (type !== null) { if (!msg || msg.type != type) console.trace(); verify(msg); compare(msg.type, type); } 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 awaitSignal() { return await(JSClient.QWebChannelMessageTypes.signal, "server"); } function awaitPropertyUpdate() { return await(JSClient.QWebChannelMessageTypes.propertyUpdate, "server"); } function awaitResponse() { 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; } }