diff --git a/host/tabsrunnerplugin.h b/host/tabsrunnerplugin.h --- a/host/tabsrunnerplugin.h +++ b/host/tabsrunnerplugin.h @@ -46,6 +46,6 @@ void SetMuted(int tabId, bool muted); private: - QDBusMessage m_tabsReplyMessage; + QVector m_tabRequestMessages; }; diff --git a/host/tabsrunnerplugin.cpp b/host/tabsrunnerplugin.cpp --- a/host/tabsrunnerplugin.cpp +++ b/host/tabsrunnerplugin.cpp @@ -55,21 +55,7 @@ // may access your tabs QList TabsRunnerPlugin::GetTabs() { - // already a get tabs request pending, abort it and then start anew - // TODO would be lovely to marshall that stuff somehow, ie. every GetTabs call gets - // its own reply instead of just aborting and serving the one who came last - // however, the TabsRunner blocks waiting for a reply, so in practise this isn't as urgent - if (m_tabsReplyMessage.type() != QDBusMessage::InvalidMessage) { - QDBusConnection::sessionBus().send( - m_tabsReplyMessage.createErrorReply( - QStringLiteral("org.kde.plasma.browser_integration.TabsRunner.Error.Cancelled"), - QStringLiteral("GetTabs got cancelled because a another request came in") - ) - ); - return {}; - } - - m_tabsReplyMessage = message(); + m_tabRequestMessages.append(message()); setDelayedReply(true); sendData(QStringLiteral("getTabs")); @@ -95,7 +81,7 @@ void TabsRunnerPlugin::handleData(const QString& event, const QJsonObject& json) { if (event == QLatin1String("gotTabs")) { - if (m_tabsReplyMessage.type() != QDBusMessage::InvalidMessage) { + if (!m_tabRequestMessages.isEmpty()) { const QJsonArray &tabs = json.value(QStringLiteral("tabs")).toArray(); @@ -111,11 +97,14 @@ QList reply; reply.append(QVariant(tabsReply)); - QDBusConnection::sessionBus().send( - // TODO why does it unwrap this? didn't we want a a(a{sv}) instead of a{sv}a{sv}a{sv}..? :/ - m_tabsReplyMessage.createReply(QList{tabsReply}) - ); - m_tabsReplyMessage = QDBusMessage(); + for (const QDBusMessage &request : qAsConst(m_tabRequestMessages)) { + QDBusConnection::sessionBus().send( + // TODO why does it unwrap this? didn't we want a a(a{sv}) instead of a{sv}a{sv}a{sv}..? :/ + request.createReply(QList{tabsReply}) + ); + } + + m_tabRequestMessages.clear(); } } } diff --git a/tabsrunner/tabsrunner.cpp b/tabsrunner/tabsrunner.cpp --- a/tabsrunner/tabsrunner.cpp +++ b/tabsrunner/tabsrunner.cpp @@ -100,6 +100,11 @@ QDBusMessage reply = QDBusConnection::sessionBus().call(message); + // By the time the reply came in, the context might have already been invalidated + if (!context.isValid()) { + return; + } + if (reply.type() != QDBusMessage::ReplyMessage || reply.arguments().length() != 1) { continue; }