From 7165378bd8b997604be5833fe696fc0f10a4417e Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Tue, 8 Oct 2013 08:47:00 +0300 Subject: Revert "EditorManager: Fix crash when closing an editor upon activation" Deleting an editor while currentEditorChanged is apparently not a good idea. Use a queued connection instead. This reverts commits 243a6259618e69b8da9ac2438480c449754f7f77 and d9602ca550c53e60a5229bfec9539e41fa5a694c. Task-number: QTCREATORBUG-10190 Task-number: QTCREATORBUG-10235 Change-Id: Iccbee25fb77714963faa6f7184d1f5f53ed348a6 Reviewed-by: Eike Ziller Reviewed-by: Nikolai Kosjar Reviewed-by: Jarek Kobus --- src/plugins/coreplugin/coreplugin.pro | 5 --- src/plugins/coreplugin/coreplugin.qbs | 10 ----- .../coreplugin/editormanager/editormanager.cpp | 2 +- src/plugins/coreplugin/plugintestutils.cpp | 50 ---------------------- src/plugins/coreplugin/plugintestutils.h | 50 ---------------------- src/plugins/cppeditor/cppdoxygen_test.cpp | 4 +- src/plugins/cppeditor/cppquickfix_test.cpp | 5 +-- .../followsymbol_switchmethoddecldef_test.cpp | 4 +- src/plugins/cpptools/cppcompletion_test.cpp | 4 +- src/plugins/vcsbase/vcsbasesubmiteditor.cpp | 6 ++- 10 files changed, 13 insertions(+), 127 deletions(-) delete mode 100644 src/plugins/coreplugin/plugintestutils.cpp delete mode 100644 src/plugins/coreplugin/plugintestutils.h diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index accc477d71..192c16f4bb 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -241,8 +241,3 @@ else:unix { } } OTHER_FILES += editormanager/BinFiles.mimetypes.xml - -equals(TEST, 1) { - SOURCES += plugintestutils.cpp - HEADERS += plugintestutils.h -} diff --git a/src/plugins/coreplugin/coreplugin.qbs b/src/plugins/coreplugin/coreplugin.qbs index 374da3f4d4..6ebcfb76a0 100644 --- a/src/plugins/coreplugin/coreplugin.qbs +++ b/src/plugins/coreplugin/coreplugin.qbs @@ -1,6 +1,5 @@ import qbs.base 1.0 import "../QtcPlugin.qbs" as QtcPlugin -import "../../../qbs/defaults.js" as Defaults QtcPlugin { name: "Core" @@ -259,15 +258,6 @@ QtcPlugin { ] } - Group { - name: "Tests" - condition: Defaults.testsEnabled(qbs) - files: [ - "plugintestutils.cpp", - "plugintestutils.h" - ] - } - Export { Depends { name: "Aggregation" } Depends { name: "Utils" } diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 2f1cc62df8..420b3a7940 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1162,7 +1162,7 @@ bool EditorManager::closeEditors(const QList &editorsToClose, bool ask emit editorsClosed(acceptedEditors); foreach (IEditor *editor, acceptedEditors) - editor->deleteLater(); + delete editor; if (currentView) { if (IEditor *editor = currentView->currentEditor()) diff --git a/src/plugins/coreplugin/plugintestutils.cpp b/src/plugins/coreplugin/plugintestutils.cpp deleted file mode 100644 index d94f606da1..0000000000 --- a/src/plugins/coreplugin/plugintestutils.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - - -#include "plugintestutils.h" - -#include "editormanager/editormanager.h" -#include "editormanager/ieditor.h" - -#include - -void Core::Tests::closeAndDeleteEditors(QList editorsToClose) -{ - EditorManager::instance()->closeEditors(editorsToClose, /*askAboutModifiedEditors=*/ false); - // The editors are going to be deleted by the event loop (deleteLater()), - // but for tests we need them deleted now. - foreach (Core::IEditor *editor, editorsToClose) - QCoreApplication::sendPostedEvents(editor, QEvent::DeferredDelete); -} - -void Core::Tests::closeAndDeleteEditor(Core::IEditor *editor) -{ - closeAndDeleteEditors(QList() << editor); -} diff --git a/src/plugins/coreplugin/plugintestutils.h b/src/plugins/coreplugin/plugintestutils.h deleted file mode 100644 index 69ada2bad3..0000000000 --- a/src/plugins/coreplugin/plugintestutils.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - - -#ifndef PLUGINTESTUTILS_H -#define PLUGINTESTUTILS_H - -#include "core_global.h" - -#include - -namespace Core { - -class IEditor; - -namespace Tests { - -void CORE_EXPORT closeAndDeleteEditor(Core::IEditor *editor); -void CORE_EXPORT closeAndDeleteEditors(QList editorsToClose); - -} // namespace Tests -} // namespace Core - -#endif // PLUGINTESTUTILS_H diff --git a/src/plugins/cppeditor/cppdoxygen_test.cpp b/src/plugins/cppeditor/cppdoxygen_test.cpp index 5ee9989f60..13d0d2d3a0 100644 --- a/src/plugins/cppeditor/cppdoxygen_test.cpp +++ b/src/plugins/cppeditor/cppdoxygen_test.cpp @@ -30,7 +30,6 @@ #include "cppeditor.h" #include -#include #include #include #include @@ -116,7 +115,8 @@ TestCase::TestCase(const QByteArray &input) TestCase::~TestCase() { - Core::Tests::closeAndDeleteEditor(editor); + EditorManager::instance()->closeEditors(QList() << editor, false); + QCoreApplication::processEvents(); // process any pending events // Remove the test file from the code-model CppTools::CppModelManagerInterface *mmi = CppTools::CppModelManagerInterface::instance(); diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 8ac2e80d27..0d1bf885fa 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -34,7 +34,6 @@ #include "cppquickfixassistant.h" #include "cppquickfixes.h" -#include #include #include #include @@ -238,7 +237,6 @@ void TestCase::init(const QStringList &includePaths) // Rehighlight testFile->editorWidget->semanticRehighlight(true); - // Wait for the semantic info from the future while (testFile->editorWidget->semanticInfo().doc.isNull()) QCoreApplication::processEvents(); @@ -264,7 +262,8 @@ TestCase::~TestCase() if (testFile->editor) editorsToClose << testFile->editor; } - Core::Tests::closeAndDeleteEditors(editorsToClose); + EditorManager::instance()->closeEditors(editorsToClose, false); + QCoreApplication::processEvents(); // process any pending events // Remove the test files from the code-model CppModelManagerInterface *mmi = CppModelManagerInterface::instance(); diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp index a236396de9..428b6e2079 100644 --- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp +++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp @@ -30,7 +30,6 @@ #include "cppeditor.h" #include "cppeditorplugin.h" -#include #include #include @@ -252,7 +251,8 @@ TestCase::~TestCase() if (testFile->editor) editorsToClose << testFile->editor; } - Core::Tests::closeAndDeleteEditors(editorsToClose); + EditorManager::instance()->closeEditors(editorsToClose, false); + QCoreApplication::processEvents(); // process any pending events // Remove the test files from the code-model CppModelManagerInterface *mmi = CppTools::CppModelManagerInterface::instance(); diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index d08f62a172..bb1bbd2d6e 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -31,7 +31,6 @@ #include "cppcompletionassist.h" #include "cppmodelmanager.h" -#include #include #include @@ -91,7 +90,8 @@ public: ~CompletionTestCase() { - Core::Tests::closeAndDeleteEditor(editor); + EditorManager::instance()->closeEditors(QList() << editor, + /*askAboutModifiedEditors=*/ false); cmm->GC(); QVERIFY(cmm->snapshot().isEmpty()); } diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index e8c1cfd1d9..15820ce08f 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -227,9 +227,11 @@ VcsBaseSubmitEditor::VcsBaseSubmitEditor(const VcsBaseSubmitEditorParameters *pa connect(VcsPlugin::instance(), SIGNAL(settingsChanged(VcsBase::Internal::CommonVcsSettings)), this, SLOT(slotUpdateEditorSettings(VcsBase::Internal::CommonVcsSettings))); + // Commit data refresh might lead to closing the editor, so use a queued connection connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), - this, SLOT(slotRefreshCommitData())); - connect(Core::ICore::mainWindow(), SIGNAL(windowActivated()), this, SLOT(slotRefreshCommitData())); + this, SLOT(slotRefreshCommitData()), Qt::QueuedConnection); + connect(Core::ICore::mainWindow(), SIGNAL(windowActivated()), + this, SLOT(slotRefreshCommitData()), Qt::QueuedConnection); Aggregation::Aggregate *aggregate = new Aggregation::Aggregate; aggregate->add(new Find::BaseTextFind(d->m_widget->descriptionEdit())); -- cgit v1.2.3