summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--src/imports/webchannel/dependencies.json2
-rw-r--r--src/imports/webchannel/plugins.qmltypes5
-rw-r--r--src/webchannel/qmetaobjectpublisher.cpp8
-rw-r--r--src/webchannel/qqmlwebchannel.cpp4
-rw-r--r--src/webchannel/qwebchannel.cpp10
-rw-r--r--tests/auto/webchannel/tst_webchannel.cpp33
-rw-r--r--tests/auto/webchannel/tst_webchannel.h3
8 files changed, 52 insertions, 15 deletions
diff --git a/.qmake.conf b/.qmake.conf
index a3c853d..7b49e2c 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -1,4 +1,4 @@
load(qt_build_config)
CONFIG += warning_clean
-MODULE_VERSION = 5.12.3
+MODULE_VERSION = 5.13.0
diff --git a/src/imports/webchannel/dependencies.json b/src/imports/webchannel/dependencies.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/src/imports/webchannel/dependencies.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/src/imports/webchannel/plugins.qmltypes b/src/imports/webchannel/plugins.qmltypes
index 4d0155d..c138386 100644
--- a/src/imports/webchannel/plugins.qmltypes
+++ b/src/imports/webchannel/plugins.qmltypes
@@ -1,12 +1,13 @@
-import QtQuick.tooling 1.1
+import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by:
-// 'qmlplugindump -nonrelocatable QtWebChannel 1.0'
+// 'qmlplugindump -nonrelocatable -dependencies dependencies.json QtWebChannel 1.0'
Module {
+ dependencies: []
Component {
name: "QQmlWebChannel"
prototype: "QWebChannel"
diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp
index 3b2c016..c9285b7 100644
--- a/src/webchannel/qmetaobjectpublisher.cpp
+++ b/src/webchannel/qmetaobjectpublisher.cpp
@@ -591,11 +591,9 @@ QJsonValue QMetaObjectPublisher::wrapResult(const QVariant &result, QWebChannelA
} else if (wrappedObjects.contains(id)) {
Q_ASSERT(object == wrappedObjects.value(id).object);
// check if this transport is already assigned to the object
- if (transport) {
- if (!wrappedObjects.value(id).transports.contains(transport))
- wrappedObjects[id].transports.append(transport);
- if (!transportedWrappedObjects.contains(transport, id))
- transportedWrappedObjects.insertMulti(transport, id);
+ if (transport && !wrappedObjects.value(id).transports.contains(transport)) {
+ wrappedObjects[id].transports.append(transport);
+ transportedWrappedObjects.insert(transport, id);
}
classInfo = wrappedObjects.value(id).classinfo;
}
diff --git a/src/webchannel/qqmlwebchannel.cpp b/src/webchannel/qqmlwebchannel.cpp
index d23ebef..20f6e73 100644
--- a/src/webchannel/qqmlwebchannel.cpp
+++ b/src/webchannel/qqmlwebchannel.cpp
@@ -134,8 +134,8 @@ QQmlWebChannel::~QQmlWebChannel()
/*!
\qmlmethod void WebChannel::registerObjects(QVariantMap objects)
- Registers objects to make them accessible to HTML clients. The key of the
- map is used as an identifier for the object on the client side.
+ Registers the specified \a objects to make them accessible to HTML clients.
+ The key of the map is used as an identifier for the object on the client side.
Once registered, all signals and property changes are automatically propagated to the clients.
Public invokable methods, including slots, are also accessible to the clients.
diff --git a/src/webchannel/qwebchannel.cpp b/src/webchannel/qwebchannel.cpp
index 0e9a4c5..050d04e 100644
--- a/src/webchannel/qwebchannel.cpp
+++ b/src/webchannel/qwebchannel.cpp
@@ -46,6 +46,8 @@
#include <QJsonDocument>
#include <QJsonObject>
+#include <algorithm>
+
QT_BEGIN_NAMESPACE
/*!
@@ -81,10 +83,10 @@ QT_BEGIN_NAMESPACE
*/
void QWebChannelPrivate::_q_transportDestroyed(QObject *object)
{
- QWebChannelAbstractTransport *transport = static_cast<QWebChannelAbstractTransport*>(object);
- const int idx = transports.indexOf(transport);
- if (idx != -1) {
- transports.remove(idx);
+ auto it = std::find(transports.begin(), transports.end(), object);
+ if (it != transports.end()) {
+ auto *transport = *it;
+ transports.erase(it);
publisher->transportRemoved(transport);
}
}
diff --git a/tests/auto/webchannel/tst_webchannel.cpp b/tests/auto/webchannel/tst_webchannel.cpp
index 57aab53..9a0f575 100644
--- a/tests/auto/webchannel/tst_webchannel.cpp
+++ b/tests/auto/webchannel/tst_webchannel.cpp
@@ -1115,6 +1115,39 @@ void TestWebChannel::qtbug46548_overriddenProperties()
#endif // WEBCHANNEL_TESTS_CAN_USE_JS_ENGINE
}
+void TestWebChannel::qtbug62388_wrapObjectMultipleTransports()
+{
+ QWebChannel channel;
+ TestObject obj;
+
+ auto initTransport = [&channel](QWebChannelAbstractTransport *transport) {
+ channel.connectTo(transport);
+ channel.d_func()->publisher->initializeClient(transport);
+ };
+ initTransport(m_dummyTransport);
+
+ auto queryObjectInfo = [&channel](QObject *obj, QWebChannelAbstractTransport *transport) {
+ return channel.d_func()->publisher->wrapResult(QVariant::fromValue(obj), transport).toObject();
+ };
+ const auto objectInfo = queryObjectInfo(&obj, m_dummyTransport);
+
+ QCOMPARE(objectInfo.length(), 3);
+ QVERIFY(objectInfo.contains("id"));
+ QVERIFY(objectInfo.contains("__QObject*__"));
+ QVERIFY(objectInfo.contains("data"));
+ QVERIFY(objectInfo.value("__QObject*__").isBool() && objectInfo.value("__QObject*__").toBool());
+
+ const auto id = objectInfo.value("id").toString();
+
+ QCOMPARE(channel.d_func()->publisher->unwrapObject(id), &obj);
+
+ DummyTransport transport;
+ initTransport(&transport);
+ QCOMPARE(queryObjectInfo(&obj, &transport), objectInfo);
+
+ // don't crash when the transport is destroyed
+}
+
QTEST_MAIN(TestWebChannel)
#include "tst_webchannel.moc"
diff --git a/tests/auto/webchannel/tst_webchannel.h b/tests/auto/webchannel/tst_webchannel.h
index 3d725f4..3d16f7b 100644
--- a/tests/auto/webchannel/tst_webchannel.h
+++ b/tests/auto/webchannel/tst_webchannel.h
@@ -45,7 +45,7 @@ class DummyTransport : public QWebChannelAbstractTransport
{
Q_OBJECT
public:
- explicit DummyTransport(QObject *parent)
+ explicit DummyTransport(QObject *parent = nullptr)
: QWebChannelAbstractTransport(parent)
{}
~DummyTransport() {};
@@ -329,6 +329,7 @@ private slots:
void benchRemoveTransport();
void qtbug46548_overriddenProperties();
+ void qtbug62388_wrapObjectMultipleTransports();
private:
DummyTransport *m_dummyTransport;