aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickwindow.cpp1
-rw-r--r--tests/auto/quick/qquickwindow/data/unloadSubWindow.qml22
-rw-r--r--tests/auto/quick/qquickwindow/tst_qquickwindow.cpp23
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()
{