From 97841a5d5ade97876db056c2a7db486684769d01 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 14 Feb 2023 13:06:30 +0100 Subject: Improve backward support Do both variant conversions and qjsonvalue conversions. Change-Id: I655395aa64c83ef62e8062d0820fdff437ebb156 Reviewed-by: Allan Sandfeld Jensen --- src/webchannel/qmetaobjectpublisher.cpp | 14 +++++++------- tests/auto/webchannel/tst_webchannel.cpp | 22 ++++++++++++++++++++++ tests/auto/webchannel/tst_webchannel.h | 4 ++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp index c956676..e641109 100644 --- a/src/webchannel/qmetaobjectpublisher.cpp +++ b/src/webchannel/qmetaobjectpublisher.cpp @@ -793,16 +793,16 @@ QVariant QMetaObjectPublisher::toVariant(const QJsonValue &value, int targetType return QVariant(target, reinterpret_cast(&flagsValue)); } - QVariant variant = QJsonValue::fromVariant(value); - // Try explicit conversion to the target type first. If that fails, fall - // back to generic conversion + QVariant variant = value.toVariant(); + // Try variant conversion to the target type first. If that fails, + // try conversion over QJsonvalue. if (auto converted = variant; converted.convert(target)) { variant = std::move(converted); - } else { - if (targetType != QMetaType::QVariant) { + } else if (targetType != QMetaType::QVariant) { + if (QVariant converted = value; converted.convert(target)) + variant = std::move(converted); + else qWarning() << "Could not convert argument" << value << "to target type" << target.name() << '.'; - } - variant = value.toVariant(); } return unwrapVariant(variant); } diff --git a/tests/auto/webchannel/tst_webchannel.cpp b/tests/auto/webchannel/tst_webchannel.cpp index 7305929..4884ea9 100644 --- a/tests/auto/webchannel/tst_webchannel.cpp +++ b/tests/auto/webchannel/tst_webchannel.cpp @@ -335,6 +335,16 @@ void TestWebChannel::setJsonValue(const QJsonValue& v) emit lastJsonValueChanged(); } +QUrl TestWebChannel::readUrl() const +{ + return m_lastUrl; +} + +void TestWebChannel::setUrl(const QUrl& u) +{ + m_lastUrl = u; +} + QJsonObject TestWebChannel::readJsonObject() const { return m_lastJsonObject; @@ -683,6 +693,15 @@ void TestWebChannel::testInvokeMethodConversion() auto retVal = channel.d_func()->publisher->invokeMethod(this, getterMethod, {}); QCOMPARE(retVal, QVariant::fromValue(array)); } + { + args[0] = QJsonValue::fromVariant(QUrl("aviancarrier:/ok")); + channel.d_func()->publisher->invokeMethod(this, "setUrl", args); + QVERIFY(m_lastUrl.isValid()); + int getterMethod = metaObject()->indexOfMethod("readUrl()"); + QVERIFY(getterMethod != -1); + auto retVal = channel.d_func()->publisher->invokeMethod(this, getterMethod, {}); + QCOMPARE(retVal, args.at(0).toVariant().toUrl()); + } } void TestWebChannel::testFunctionOverloading() @@ -975,6 +994,9 @@ void TestWebChannel::testWrapValues_data() << QJsonValue(QJsonObject{{"One", 1}, {"Two", 2}}); + QTest::addRow("url") << QVariant::fromValue(QUrl("aviancarrier:/test")) + << QJsonValue(QJsonValue(QString("aviancarrier:/test"))); + QTest::addRow("map") << QVariant::fromValue(QVariantMap{{"One", 1}, {"Two", 2}}) << QJsonValue(QJsonObject{{"One", 1}, diff --git a/tests/auto/webchannel/tst_webchannel.h b/tests/auto/webchannel/tst_webchannel.h index 290457f..c1e3ee3 100644 --- a/tests/auto/webchannel/tst_webchannel.h +++ b/tests/auto/webchannel/tst_webchannel.h @@ -329,6 +329,9 @@ public slots: QJsonArray readJsonArray() const; void setJsonArray(const QJsonArray &v); + QUrl readUrl() const; + void setUrl(const QUrl &u); + int readOverload(int i); QString readOverload(const QString &arg); QString readOverload(const QString &arg, int i); @@ -396,6 +399,7 @@ private: QJsonValue m_lastJsonValue; QJsonObject m_lastJsonObject; QJsonArray m_lastJsonArray; + QUrl m_lastUrl; }; QT_END_NAMESPACE -- cgit v1.2.1