From 5fd9f0766418b70374c7620ebfc0d12f748e0549 Mon Sep 17 00:00:00 2001 From: James Graham Date: Sat, 11 Oct 2025 19:11:57 +0100 Subject: [PATCH] Some further belt and braces to ensure that we don't crash in the timeline Some further belt and braces to ensure that we don't crash in the timeline. This does the following: - Checks all callback inputs - Makes sure that any objects are cleaned up from incubators when deleting the delegate as it turns out that clear() doesn't do this. Hopefully this stops callbacks into an already deleted parent. Hopefully helps with https://crash-reports.kde.org/organizations/kde/issues/261627/events/0b6bef500c5641e1924aa0bc2b0c11bd/ --- src/timeline/messagedelegate.cpp | 3 +++ src/timeline/messagedelegate.h | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/timeline/messagedelegate.cpp b/src/timeline/messagedelegate.cpp index c057fb7e2..676e3f5fb 100644 --- a/src/timeline/messagedelegate.cpp +++ b/src/timeline/messagedelegate.cpp @@ -52,6 +52,9 @@ MessageDelegateBase::~MessageDelegateBase() { for (const auto &incubator : m_activeIncubators) { incubator->clear(); + if (const auto object = qobject_cast(incubator->object())) { + cleanupItem(object); + } delete incubator; } } diff --git a/src/timeline/messagedelegate.h b/src/timeline/messagedelegate.h index 12a9759d7..c7c7945f6 100644 --- a/src/timeline/messagedelegate.h +++ b/src/timeline/messagedelegate.h @@ -235,12 +235,20 @@ private: void hoverLeaveEvent(QHoverEvent *event) override; std::function m_objectInitialCallback = [this](QQuickItem *object) { + if (!object) { + return; + } + object->setParentItem(this); connect(object, &QQuickItem::implicitWidthChanged, this, &MessageDelegateBase::markAsDirty); connect(object, &QQuickItem::implicitHeightChanged, this, &MessageDelegateBase::markAsDirty); connect(object, &QQuickItem::visibleChanged, this, &MessageDelegateBase::markAsDirty); }; std::function m_errorCallback = [this](MessageObjectIncubator *incubator) { + if (!incubator) { + return; + } + if (incubator->object()) { incubator->object()->deleteLater(); }