From 0842d32441a585026336d616b051915865d51d6a Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 8 Aug 2012 12:42:06 +0200 Subject: QFileSystemModel: fix permission mangling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The old code masked out write flags before returning permissions from permissions() or data(FilePermissions) in order to force QFileDialog to disable the rename and delete actions. This was to fix Task 143519, but introduced QTBUG-20503. Instead, revert to the pre-143519-bugfix code and do the necessary check in QFileDialog directly. Also add a testcase for 143519. Reported-by: Gilles Pascual Task-number: QTBUG-20503 Task-number: 143519 Change-Id: I140109341c0ed40722e3aac4327c2a740fb014c2 Reviewed-by: Jan Arve Sæther --- .../dialogs/qfiledialog2/tst_qfiledialog2.cpp | 99 ++++++++++++++++++++++ 1 file changed, 99 insertions(+) (limited to 'tests/auto/widgets/dialogs/qfiledialog2') diff --git a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp index 69d9903e3d..b4985df8d4 100644 --- a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp +++ b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include "../../../../../src/widgets/dialogs/qsidebar_p.h" #include "../../../../../src/widgets/dialogs/qfilesystemmodel_p.h" #include "../../../../../src/widgets/dialogs/qfiledialog_p.h" @@ -114,6 +115,9 @@ private slots: void unc(); void emptyUncPath(); +#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_MENU) + void task143519_deleteAndRenameActionBehavior(); +#endif void task178897_minimumSize(); void task180459_lastDirectory_data(); void task180459_lastDirectory(); @@ -314,6 +318,101 @@ void tst_QFileDialog2::emptyUncPath() QVERIFY(model); } +#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_MENU) +struct MenuCloser { + QWidget *w; + explicit MenuCloser(QWidget *w) : w(w) {} + void operator()() const + { + QMenu *menu = qFindChild(w); + if (!menu) { + qDebug("%s: cannot find file dialog child of type QMenu", Q_FUNC_INFO); + w->close(); + } + QTest::keyClick(menu, Qt::Key_Escape); + } +}; +static bool openContextMenu(QFileDialog &fd) +{ + QListView *list = qFindChild(&fd, "listView"); + if (!list) { + qDebug("%s: didn't find file dialog child \"listView\"", Q_FUNC_INFO); + return false; + } + QTimer timer; + timer.setInterval(300); + timer.setSingleShot(true); + QObject::connect(&timer, &QTimer::timeout, MenuCloser(&fd)); + timer.start(); + QContextMenuEvent cme(QContextMenuEvent::Mouse, QPoint(10, 10)); + qApp->sendEvent(list->viewport(), &cme); // blocks until menu is closed again. + return true; +} + +void tst_QFileDialog2::task143519_deleteAndRenameActionBehavior() +{ + // test based on task233037_selectingDirectory + + struct TestContext { + TestContext() + : current(QDir::current()) {} + ~TestContext() { + file.remove(); + current.rmdir(test.dirName()); + } + QDir current; + QDir test; + QFile file; + } ctx; + + // setup testbed + QVERIFY(ctx.current.mkdir("task143519_deleteAndRenameActionBehavior_test")); // ensure at least one item + ctx.test = ctx.current; + QVERIFY(ctx.test.cd("task143519_deleteAndRenameActionBehavior_test")); + ctx.file.setFileName(ctx.test.absoluteFilePath("hello")); + QVERIFY(ctx.file.open(QIODevice::WriteOnly)); + QVERIFY(ctx.file.permissions() & QFile::WriteUser); + ctx.file.close(); + + QNonNativeFileDialog fd; + fd.setViewMode(QFileDialog::List); + fd.setDirectory(ctx.test.absolutePath()); + fd.show(); + + QTest::qWaitForWindowActive(&fd); + + // grab some internals: + QAction *rm = qFindChild(&fd, "qt_delete_action"); + QVERIFY(rm); + QAction *mv = qFindChild(&fd, "qt_rename_action"); + QVERIFY(mv); + + // these are the real test cases: + + // defaults + QVERIFY(openContextMenu(fd)); + QCOMPARE(fd.selectedFiles().size(), 1); + QCOMPARE(rm->isEnabled(), !fd.isReadOnly()); + QCOMPARE(mv->isEnabled(), !fd.isReadOnly()); + + // change to non-defaults: + fd.setReadOnly(!fd.isReadOnly()); + + QVERIFY(openContextMenu(fd)); + QCOMPARE(fd.selectedFiles().size(), 1); + QCOMPARE(rm->isEnabled(), !fd.isReadOnly()); + QCOMPARE(mv->isEnabled(), !fd.isReadOnly()); + + // and changed back to defaults: + fd.setReadOnly(!fd.isReadOnly()); + + QVERIFY(openContextMenu(fd)); + QCOMPARE(fd.selectedFiles().size(), 1); + QCOMPARE(rm->isEnabled(), !fd.isReadOnly()); + QCOMPARE(mv->isEnabled(), !fd.isReadOnly()); +} +#endif // !QT_NO_CONTEXTMENU && !QT_NO_MENU + void tst_QFileDialog2::task178897_minimumSize() { QNonNativeFileDialog fd; -- cgit v1.2.3