From 3ae3b765fcc650d34c5f777e39b2302b77896d04 Mon Sep 17 00:00:00 2001 From: Milian Wolff Date: Wed, 8 Jan 2014 17:59:55 +0100 Subject: Fix regression in handling of var-emitting signals from QML. Qt 5.3 propagates var-arguments of signals as QJSValue instead of as a QVariant. This then fails to be serialized to QJson, failing our unit tests. Now, QJSValue types are manually casted to QJsonValues which makes the tests pass again. Change-Id: I730c595eee214ebe3d1f83009cd5605f66407f55 Reviewed-by: Simon Hausmann --- src/webchannel/qmetaobjectpublisher.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/webchannel/qmetaobjectpublisher.cpp') diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp index d3659bd..2f0ef74 100644 --- a/src/webchannel/qmetaobjectpublisher.cpp +++ b/src/webchannel/qmetaobjectpublisher.cpp @@ -49,6 +49,11 @@ #include #include +#if HAVE_QML +#include +#include +#endif + namespace { const QString KEY_SIGNALS = QStringLiteral("signals"); const QString KEY_METHODS = QStringLiteral("methods"); @@ -375,7 +380,20 @@ void QMetaObjectPublisher::signalEmitted(const QObject *object, const int signal data[KEY_SIGNAL] = signalIndex; if (!arguments.isEmpty()) { // TODO: wrap (new) objects on the fly - data[KEY_ARGS] = QJsonArray::fromVariantList(arguments); + QJsonArray args; +#if HAVE_QML + foreach (const QVariant &arg, arguments) { + if (arg.canConvert()) { + const QJSValue &jsValue = arg.value(); + args.append(qjsvalue_cast(jsValue)); + } else { + args.append(QJsonValue::fromVariant(arg)); + } + } +#else + args = QJsonArray::fromVariantList(arguments); +#endif + data[KEY_ARGS] = args; } webChannel->sendMessage(TYPE_SIGNAL, data); -- cgit v1.2.1