From 184bfebaabf019a46989c72e12f99997b6eaa7db Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@digia.com>
Date: Mon, 7 Apr 2014 13:46:04 +0200
Subject: [PATCH] QmlDesigner: Always warn asynchronously in exceptions

Exceptions are likely to be triggered from QML code.
Calling QMessageBox::warning() results in a call to exec() and
exec() returns back into the Qt event loop.

This is dangerous, because QML might have scheduled a deleteLater
which is then executed by exec(). This can crash the application, because
the object is supposed to be "deleted later" and not directly
as a side effect of the signal that was emmited by QML.

Task-number: QTCREATORBUG-11946

Change-Id: Icb884847633bd421d3dc7bc034d598ef84d39429
Reviewed-by: Marco Bubke <marco.bubke@digia.com>
---
 .../qmldesigner/designercore/exceptions/exception.cpp    | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/plugins/qmldesigner/designercore/exceptions/exception.cpp b/src/plugins/qmldesigner/designercore/exceptions/exception.cpp
index c00b52f0246..29d820683d7 100644
--- a/src/plugins/qmldesigner/designercore/exceptions/exception.cpp
+++ b/src/plugins/qmldesigner/designercore/exceptions/exception.cpp
@@ -39,6 +39,13 @@
 #include <QCoreApplication>
 #include <QMessageBox>
 
+static void showAsyncWarning(const QString &title, const QString &desciption)
+{
+    QMessageBox *messageBox = new QMessageBox(QMessageBox::Warning, title, desciption, QMessageBox::Ok, Core::ICore::dialogParent());
+    messageBox->setAttribute(Qt::WA_DeleteOnClose);
+    messageBox->setModal(true);
+    messageBox->show();
+}
 
 /*!
 \defgroup CoreExceptions
@@ -156,7 +163,7 @@ QString Exception::description() const
 void Exception::showException(const QString &title) const
 {
     QString t = title.isEmpty() ? QCoreApplication::translate("QmlDesigner", "Error") : title;
-    QMessageBox::warning(Core::ICore::dialogParent(), t, description());
+    showAsyncWarning(t, description());
 }
 
 /*!
-- 
GitLab