summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2023-02-14 13:06:30 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2023-02-14 15:12:49 +0000
commit97841a5d5ade97876db056c2a7db486684769d01 (patch)
treee3a428f3e2055083f070ca95eb0a16a24c2dab64
parent47546ea6bbeb9650c3fcd8dbdb2b02da46d0d85a (diff)
downloadqtwebchannel-97841a5d5ade97876db056c2a7db486684769d01.tar.gz
Improve backward support
Do both variant conversions and qjsonvalue conversions. Change-Id: I655395aa64c83ef62e8062d0820fdff437ebb156 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--src/webchannel/qmetaobjectpublisher.cpp14
-rw-r--r--tests/auto/webchannel/tst_webchannel.cpp22
-rw-r--r--tests/auto/webchannel/tst_webchannel.h4
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<const void*>(&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