summaryrefslogtreecommitdiff
path: root/src/webchannel
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2017-12-15 13:04:02 +0100
committerJüri Valdmann <juri.valdmann@qt.io>2018-01-08 13:53:50 +0000
commit6701ff310933ec33f9199b53d78299764f646387 (patch)
tree5ef941383eb8021acb81ed00a65cc25ff43906e8 /src/webchannel
parentb90fbebbb5e257f771e96980109fb543647b1844 (diff)
downloadqtwebchannel-6701ff310933ec33f9199b53d78299764f646387.tar.gz
Allow deleting a channel during method invocation
A real-life use case is the session restore page in KDE Falkon or, more generally, any kind of closeTab() method exposed to JS in a QWebEnginePage. The approach taken in this patch will only work if the transport can also deal with deletion during a messageReceived signal emission. Alternatively, method invocation could be delayed via the event loop, but this would come with an obvious performance penalty. Change-Id: I2940f61e07c77365f6e3e7cd29463d4cb5b525a6 Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
Diffstat (limited to 'src/webchannel')
-rw-r--r--src/webchannel/qmetaobjectpublisher.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp
index cfc6ad2..8e83237 100644
--- a/src/webchannel/qmetaobjectpublisher.cpp
+++ b/src/webchannel/qmetaobjectpublisher.cpp
@@ -664,9 +664,15 @@ void QMetaObjectPublisher::handleMessage(const QJsonObject &message, QWebChannel
return;
}
- transport->sendMessage(createResponse(message.value(KEY_ID),
- wrapResult(invokeMethod(object, message.value(KEY_METHOD).toInt(-1),
- message.value(KEY_ARGS).toArray()), transport)));
+ QPointer<QMetaObjectPublisher> publisherExists(this);
+ QPointer<QWebChannelAbstractTransport> transportExists(transport);
+ QVariant result =
+ invokeMethod(object,
+ message.value(KEY_METHOD).toInt(-1),
+ message.value(KEY_ARGS).toArray());
+ if (!publisherExists || !transportExists)
+ return;
+ transport->sendMessage(createResponse(message.value(KEY_ID), wrapResult(result, transport)));
} else if (type == TypeConnectToSignal) {
signalHandler.connectTo(object, message.value(KEY_SIGNAL).toInt(-1));
} else if (type == TypeDisconnectFromSignal) {