From 9d21b49006ee6be2991988280ad811010ae28111 Mon Sep 17 00:00:00 2001 From: Arno Rehn Date: Fri, 16 Apr 2021 15:16:40 +0200 Subject: Fix up the recently added test for QProperty/QWebChannel interaction The recently added code was not quite conformant to the coding style and did not properly use Q_OBJECT_BINDABLE_PROPERTY together with a notify signal. This commit fixes both. The commit also adds a test to verify that changes to a QProperty are actually transmitted over QWebChannel. At the moment, this relies on notify signals. A follow-up patch will use onValueChanged() to propagate changes of properties without a NOTIFY signal. Task-number: QTBUG-91757 Change-Id: Ia5a323cba02dc72df774beeba445d40140d7af7f Reviewed-by: Allan Sandfeld Jensen --- tests/auto/webchannel/tst_webchannel.cpp | 18 +++++++++++++++--- tests/auto/webchannel/tst_webchannel.h | 7 ++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/tests/auto/webchannel/tst_webchannel.cpp b/tests/auto/webchannel/tst_webchannel.cpp index f9f6845..1b48949 100644 --- a/tests/auto/webchannel/tst_webchannel.cpp +++ b/tests/auto/webchannel/tst_webchannel.cpp @@ -409,7 +409,7 @@ void TestWebChannel::testInfoForObject() addMethod(QStringLiteral("bindableStringProperty"), "bindableStringProperty()"); addMethod(QStringLiteral("getStringProperty"), "getStringProperty()"); addMethod(QStringLiteral("bindStringPropertyToStringProperty2"), "bindStringPropertyToStringProperty2()"); - addMethod(QStringLiteral("setStringProperty2"), "setStringProperty2(QString&)"); + addMethod(QStringLiteral("setStringProperty2"), "setStringProperty2(QString)"); addMethod(QStringLiteral("method1"), "method1()"); QCOMPARE(info["methods"].toArray(), expected); } @@ -1007,20 +1007,26 @@ void TestWebChannel::testAsyncObject() void TestWebChannel::testQProperty() { + static const int IndexOfStringProperty = + TestObject::staticMetaObject.indexOfProperty("stringProperty"); + + DummyTransport transport; QWebChannel channel; TestObject testObj; testObj.setObjectName("testObject"); QProperty obj1("Hello"); testObj.bindableStringProperty().setBinding([&](){ return obj1.value(); }); + QCOMPARE(obj1.value(), testObj.readStringProperty()); channel.registerObject(testObj.objectName(), &testObj); - channel.connectTo(m_dummyTransport); - channel.d_func()->publisher->initializeClient(m_dummyTransport); + channel.connectTo(&transport); + channel.d_func()->publisher->initializeClient(&transport); QVariant result; QMetaObjectPublisher *publisher = channel.d_func()->publisher; + publisher->setClientIsIdle(true); result = publisher->invokeMethod(&testObj, "getStringProperty", {}); QCOMPARE(result.toString(), obj1.value()); @@ -1029,6 +1035,12 @@ void TestWebChannel::testQProperty() result = publisher->invokeMethod(&testObj, "getStringProperty", {}); QCOMPARE(result.toString(), obj1.value()); + publisher->sendPendingPropertyUpdates(); + QVERIFY(!transport.messagesSent().isEmpty()); + const QJsonObject updateMessage = transport.messagesSent().last()["data"][0].toObject(); + QCOMPARE(updateMessage["object"], testObj.objectName()); + QCOMPARE(updateMessage["properties"][QString::number(IndexOfStringProperty)], obj1.value()); + publisher->invokeMethod(&testObj, "setStringProperty2", {"Hey"}); publisher->invokeMethod(&testObj, "bindStringPropertyToStringProperty2", {}); obj1 = "This should not affect getStringProperty"; diff --git a/tests/auto/webchannel/tst_webchannel.h b/tests/auto/webchannel/tst_webchannel.h index e75c13c..0660f89 100644 --- a/tests/auto/webchannel/tst_webchannel.h +++ b/tests/auto/webchannel/tst_webchannel.h @@ -131,7 +131,7 @@ public: } QString readStringProperty() const { return mStringProperty; } - void setStringProperty(QString v) { mStringProperty = v; emit stringPropertyChanged(); } + void setStringProperty(const QString &v) { mStringProperty = v; } Q_INVOKABLE void method1() {} @@ -179,10 +179,11 @@ public slots: QString overload(const QString &str) { return str.toUpper(); } QString overload(const QString &str, int i) { return str.toUpper() + QString::number(i + 1); } QString overload(const QJsonArray &v) { return QString::number(v[1].toInt()) + v[0].toString(); } + QBindable bindableStringProperty() { return &mStringProperty; } QString getStringProperty() const { return mStringProperty; } void bindStringPropertyToStringProperty2() { bindableStringProperty().setBinding(Qt::makePropertyBinding(mStringProperty2)); } - void setStringProperty2(QString& string) { mStringProperty2 = string; } + void setStringProperty2(const QString &string) { mStringProperty2 = string; } protected slots: void slot3() {} @@ -194,7 +195,7 @@ public: QObject *mObjectProperty; TestObject *mReturnedObject; QString mProp; - Q_OBJECT_BINDABLE_PROPERTY(TestObject, QString, mStringProperty); + Q_OBJECT_BINDABLE_PROPERTY(TestObject, QString, mStringProperty, &TestObject::stringPropertyChanged); QProperty mStringProperty2; }; -- cgit v1.2.1