diff options
Diffstat (limited to 'tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp')
-rw-r--r-- | tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp index 8d209fc241..05410f4a0f 100644 --- a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp +++ b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp @@ -144,6 +144,7 @@ private slots: #endif void rejectModalDialogs(); void QTBUG49600_nativeIconProviderCrash(); + void focusObjectDuringDestruction(); // NOTE: Please keep widgetlessNativeDialog() as the LAST test! // @@ -1467,7 +1468,7 @@ public: } public slots: - void rejectFileDialog() + virtual void rejectFileDialog() { if (QWidget *w = QApplication::activeModalWidget()) if (QDialog *d = qobject_cast<QDialog *>(w)) @@ -1511,5 +1512,36 @@ void tst_QFiledialog::QTBUG49600_nativeIconProviderCrash() fd.iconProvider(); } +class qtbug57193DialogRejecter : public DialogRejecter +{ +public: + void rejectFileDialog() override + { + QCOMPARE(QGuiApplication::topLevelWindows().size(), 1); + const QWindow *window = QGuiApplication::topLevelWindows().constFirst(); + + const QFileDialog *fileDialog = qobject_cast<QFileDialog*>(QApplication::activeModalWidget()); + QVERIFY(fileDialog); + + // The problem in QTBUG-57193 was from a platform input context plugin that was + // connected to QWindow::focusObjectChanged(), and consequently accessed the focus + // object (the QFileDialog) that was in the process of being destroyed. This test + // checks that the QFileDialog is never set as the focus object after its destruction process begins. + connect(window, &QWindow::focusObjectChanged, [=](QObject *focusObject) { + QVERIFY(focusObject != fileDialog); + }); + DialogRejecter::rejectFileDialog(); + } +}; + +void tst_QFiledialog::focusObjectDuringDestruction() +{ + QTRY_VERIFY(QGuiApplication::topLevelWindows().isEmpty()); + + qtbug57193DialogRejecter dialogRejecter; + + QFileDialog::getOpenFileName(nullptr, QString(), QString(), QString(), nullptr); +} + QTEST_MAIN(tst_QFiledialog) #include "tst_qfiledialog.moc" |