Skip to content

Fix crash in ColumnView layouting during page removal

Volker Krause requested to merge work/vkrause/fix-column-view-crash-on-pop into master

Since 6411c128 pop'ing the current page triggered the null engine assert in QmlComponentsPoolSingleton::instance while attempting to layout due to a header visibility change during removal of a page.

Found by Itinerary's Selenium tests.

Backtrace:

#4  0x00007ffff3ec19d4 in qAbort() () at /k/qt6/src/qtbase/src/corelib/global/qglobal.cpp:161
#5  0x00007ffff3ef6515 in qt_message_fatal<QString&> (message=..., context=<optimized out>) at /k/qt6/src/qtbase/src/corelib/global/qlogging.cpp:2005
#6  qt_message(QtMsgType, const QMessageLogContext &, const char *, typedef __va_list_tag __va_list_tag *)
    (msgType=msgType@entry=QtFatalMsg, context=..., msg=msg@entry=0x7ffff423cdb8 "ASSERT: \"%s\" in file %s, line %d", ap=ap@entry=0x7fffffff6da8) at /k/qt6/src/qtbase/src/corelib/global/qlogging.cpp:378
#7  0x00007ffff3ec266a in QMessageLogger::fatal(char const*, ...) const (this=this@entry=0x7fffffff6e80, msg=msg@entry=0x7ffff423cdb8 "ASSERT: \"%s\" in file %s, line %d") at /k/qt6/src/qtbase/src/corelib/global/qlogging.cpp:901
#8  0x00007ffff3ec1951 in qt_assert(char const*, char const*, int) (assertion=assertion@entry=0x7fffe4b4ef93 "engine", file=file@entry=0x7fffe4b4e6a0 "/k/kde6/src/kirigami/src/columnview.cpp", line=line@entry=37)
    at /k/qt6/src/qtbase/src/corelib/global/qassert.cpp:68
#9  0x00007fffe4a376d2 in QmlComponentsPoolSingleton::instance(QQmlEngine*) (engine=<optimized out>) at /k/kde6/src/kirigami/src/columnview.cpp:37
#10 0x00007fffe4a517b0 in ContentItem::ensureLeadingSeparator(QQuickItem*) (this=this@entry=0x18d4100, item=<optimized out>, item@entry=0x3845340) at /k/kde6/src/kirigami/src/columnview.cpp:806
#11 0x00007fffe4a52543 in ContentItem::layoutItems() (this=0x18d4100) at /k/kde6/src/kirigami/src/columnview.cpp:574
#12 0x00007ffff3fc0dd3 in QtPrivate::QSlotObjectBase::call(QObject*, void**) (a=0x7fffffff70b0, r=0x18d4100, this=0x32678e0) at /k/qt6/src/qtbase/src/corelib/kernel/qobjectdefs_impl.h:433
#13 doActivate<false>(QObject*, int, void**) (sender=0x3844ef0, signal_index=18, argv=0x7fffffff70b0) at /k/qt6/src/qtbase/src/corelib/kernel/qobject.cpp:4022
#14 0x00007ffff3fb8b0f in QMetaObject::activate(QObject*, QMetaObject const*, int, void**)
    (sender=sender@entry=0x3844ef0, m=m@entry=0x7ffff6277d60 <QQuickItem::staticMetaObject>, local_signal_index=local_signal_index@entry=15, argv=argv@entry=0x0) at /k/qt6/src/qtbase/src/corelib/kernel/qobject.cpp:4082
#15 0x00007ffff5dda632 in QQuickItem::visibleChanged() (this=this@entry=0x3844ef0) at /k/qt6/build/qtdeclarative/src/quick/Quick_autogen/include/moc_qquickitem.cpp:1902
#16 0x00007ffff5de5b7b in QQuickItemPrivate::setEffectiveVisibleRecur(bool) (this=this@entry=0x674c1b0, newEffectiveVisible=<optimized out>) at /k/qt6/src/qtdeclarative/src/quick/items/qquickitem.cpp:6528
#17 0x00007ffff5de5bea in QQuickItemPrivate::setVisible(bool) (this=0x674c1b0, visible=<optimized out>) at /k/qt6/src/qtdeclarative/src/quick/items/qquickitem.cpp:6415
#18 0x00007ffff5dddb98 in QQuickItem::setVisible(bool) (this=this@entry=0x3844ef0, v=v@entry=false) at /k/qt6/src/qtdeclarative/src/quick/items/qquickitem.cpp:6423
#19 0x00007fffe4a502d8 in ContentItem::forgetItem(QQuickItem*) (this=0x18d4100, item=item@entry=0x3843540) at /k/kde6/src/kirigami/src/columnview.cpp:774
#20 0x00007fffe4a5073f in ColumnView::removeItem(QQuickItem*) (this=0x1186eb0, item=0x3843540) at /k/kde6/src/kirigami/src/columnview.cpp:1423
#21 0x00007fffe4a53f17 in ColumnView::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=<optimized out>, _c=<optimized out>, _id=<optimized out>, _a=0x7fffffff7650)

Code triggering this: https://invent.kde.org/pim/itinerary/-/blob/master/src/app/ProgramMembershipEditor.qml?ref_type=heads#L54

Test failure: https://invent.kde.org/pim/itinerary/-/jobs/1526472

Merge request reports