From 6701ff310933ec33f9199b53d78299764f646387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCri=20Valdmann?= Date: Fri, 15 Dec 2017 13:04:02 +0100 Subject: 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 --- src/webchannel/qmetaobjectpublisher.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/webchannel') 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 publisherExists(this); + QPointer 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) { -- cgit v1.2.1