diff options
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 1 | ||||
-rw-r--r-- | tests/auto/quick/qquickwindow/data/unloadSubWindow.qml | 22 | ||||
-rw-r--r-- | tests/auto/quick/qquickwindow/tst_qquickwindow.cpp | 23 |
3 files changed, 46 insertions, 0 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index e78f9141a8..6276bedc0b 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -1093,6 +1093,7 @@ QQuickWindow::~QQuickWindow() d->windowManager->windowDestroyed(this); } + QCoreApplication::removePostedEvents(this, QEvent::DeferredDelete); QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); delete d->incubationController; d->incubationController = 0; #ifndef QT_NO_DRAGANDDROP diff --git a/tests/auto/quick/qquickwindow/data/unloadSubWindow.qml b/tests/auto/quick/qquickwindow/data/unloadSubWindow.qml new file mode 100644 index 0000000000..bf9df4867d --- /dev/null +++ b/tests/auto/quick/qquickwindow/data/unloadSubWindow.qml @@ -0,0 +1,22 @@ +import QtQuick 2.3 +import QtQuick.Window 2.2 + +Window { + id: root + property var transientWindow + property Loader loader1: Loader { + sourceComponent: Item { + Loader { + id: loader2 + sourceComponent : Window { + id: inner + visible: true + Component.onCompleted: root.transientWindow = inner + } + } + Component.onDestruction: { + loader2.active = false; + } + } + } +} diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index b05146fa3a..b8f9102775 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -47,6 +47,7 @@ #include <QtQml/QQmlEngine> #include <QtQml/QQmlComponent> #include <QtQuick/private/qquickrectangle_p.h> +#include <QtQuick/private/qquickloader_p.h> #include "../../shared/util.h" #include "../shared/visualtestutil.h" #include <QSignalSpy> @@ -347,6 +348,8 @@ private slots: void crashWhenHoverItemDeleted(); + void unloadSubWindow(); + void qobjectEventFilter_touch(); void qobjectEventFilter_key(); void qobjectEventFilter_mouse(); @@ -1705,6 +1708,26 @@ void tst_qquickwindow::crashWhenHoverItemDeleted() } } +// QTBUG-33436 +void tst_qquickwindow::unloadSubWindow() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl("unloadSubWindow.qml")); + QQuickWindow *window = qobject_cast<QQuickWindow *>(component.create()); + QVERIFY(window); + window->show(); + QTest::qWaitForWindowExposed(window); + QQuickWindow *transient = Q_NULLPTR; + QTRY_VERIFY(transient = window->property("transientWindow").value<QQuickWindow*>()); + QTest::qWaitForWindowExposed(transient); + + // Unload the inner window (in nested Loaders) and make sure it doesn't crash + QQuickLoader *loader = window->property("loader1").value<QQuickLoader*>(); + loader->setActive(false); + QTRY_VERIFY(!transient->isVisible()); +} + // QTBUG-32004 void tst_qquickwindow::qobjectEventFilter_touch() { |