summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2014-09-15 16:23:02 +0200
committerGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2014-09-15 20:50:50 +0200
commitb2b9fdfda0f7838059d7e826d81740977ef35a6e (patch)
treeed65536f27f5bcfe984ca18f69974e317a3bc148 /tests/auto
parent0fa0608f707306cb34a9ca91952cebbac25065a5 (diff)
QSizeGrip: use a QPointer to the tracked TLW
And not a normal pointer. The problem is that in certain scenarios, if the TLW containing a QSizeGrip changes and the old TLW gets immediately destroyed, then the mechanism which updates the tracked TLW is run too late, and ends up accessing a dangling pointer. Therefore, we need to protect that pointer via a smart pointer. Task-number: QTBUG-22867 Change-Id: Icfb051132bacde604f660ac7a98bc0a9d1022c68 Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp b/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp
index f88cd634de..2600348998 100644
--- a/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp
+++ b/tests/auto/widgets/widgets/qsizegrip/tst_qsizegrip.cpp
@@ -46,6 +46,10 @@
#include <QLineEdit>
#include <QVBoxLayout>
#include <QLabel>
+#include <QMainWindow>
+#include <QStatusBar>
+#include <QMdiArea>
+#include <QMdiSubWindow>
static inline Qt::Corner sizeGripCorner(QWidget *parent, QSizeGrip *sizeGrip)
{
@@ -75,6 +79,7 @@ private slots:
void hideAndShowOnWindowStateChange_data();
void hideAndShowOnWindowStateChange();
void orientation();
+ void dontCrashOnTLWChange();
private:
QLineEdit *dummyWidget;
@@ -191,6 +196,26 @@ void tst_QSizeGrip::orientation()
QCOMPARE(sizeGripCorner(&widget, sizeGrip), Qt::TopRightCorner);
}
+void tst_QSizeGrip::dontCrashOnTLWChange()
+{
+ // QTBUG-22867
+ QMdiArea mdiArea;
+ mdiArea.show();
+
+ QMainWindow *mw = new QMainWindow();
+ QMdiSubWindow *mdi = mdiArea.addSubWindow(mw);
+ mw->statusBar()->setSizeGripEnabled(true);
+ mdiArea.removeSubWindow(mw);
+ delete mdi;
+ mw->show();
+
+ // the above setup causes a change of TLW for the size grip,
+ // and it must not crash.
+
+ QVERIFY(QTest::qWaitForWindowExposed(&mdiArea));
+ QVERIFY(QTest::qWaitForWindowExposed(mw));
+}
+
QTEST_MAIN(tst_QSizeGrip)
#include "tst_qsizegrip.moc"