File indexing completed on 2024-04-21 14:59:41

0001 /*
0002     This file is part of the KDE project
0003     SPDX-FileCopyrightText: 2014 Frank Reininghaus <frank78ac@googlemail.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "kfileitemactionstest.h"
0009 
0010 #include <kfileitemactions.h>
0011 #include <kfileitemlistproperties.h>
0012 
0013 #include <QMenu>
0014 #include <QStandardPaths>
0015 #include <QTest>
0016 
0017 /**
0018  * In KDE 4.x, calling KFileItemActions::setParentWidget(QWidget *widget) would
0019  * result in 'widget' not only being the parent of any dialogs created by,
0020  * KFileItemActions, but also of the actions. Nevertheless, the destructor of
0021  * KFileItemActions deleted all actions it created. This could lead to the deletion
0022  * of dangling pointers, and thus, a crash, if 'widget' was destroyed before the
0023  * KFileItemActions instance.
0024  */
0025 void KFileItemActionsTest::testSetParentWidget()
0026 {
0027     KFileItemActions fileItemActions;
0028 
0029     // Create a widget and make it the parent for any dialogs created by fileItemActions.
0030     QWidget *widget = new QWidget();
0031     fileItemActions.setParentWidget(widget);
0032 
0033     // Initialize fileItemActions with a KFileItemList that contains only the home URL.
0034     KFileItemList items;
0035     const QUrl homeUrl = QUrl::fromLocalFile(QStandardPaths::standardLocations(QStandardPaths::HomeLocation).constFirst());
0036     const KFileItem item(homeUrl, QStringLiteral("inode/directory"));
0037     items << item;
0038     const KFileItemListProperties properties(items);
0039     fileItemActions.setItemListProperties(properties);
0040 
0041     // Create the "Open With" actions and add them to a menu.
0042     QMenu menu;
0043     fileItemActions.addActionsTo(&menu);
0044 
0045     // Delete the widget. In KDE 4.x, this would also delete the "Open With" actions
0046     // because they were children of the widget. We would then get a crash in the
0047     // destructor of fileItemActions because it tried to delete dangling pointers.
0048     delete widget;
0049 }
0050 
0051 void KFileItemActionsTest::testTopLevelServiceMenuActions()
0052 {
0053 #ifdef Q_OS_WIN
0054     QSKIP("Test skipped on Windows");
0055 #endif
0056     QStandardPaths::setTestModeEnabled(true);
0057 
0058     qputenv("XDG_DATA_DIRS", QFINDTESTDATA("servicemenu_protocol_mime_test_data").toLocal8Bit());
0059     KFileItemActions actions;
0060 
0061     {
0062         // only one menu should show up for the inode/directory mime type
0063         actions.setItemListProperties(KFileItemList({KFileItem(QUrl::fromLocalFile(QFINDTESTDATA("servicemenu_protocol_mime_test_data")))}));
0064         QMenu menu;
0065         actions.addActionsTo(&menu, KFileItemActions::MenuActionSource::Services);
0066         QCOMPARE(menu.actions().count(), 1);
0067         QCOMPARE(menu.actions().constFirst()->text(), "dir_service_menu");
0068     }
0069     {
0070         // The two actions should show up
0071         actions.setItemListProperties(KFileItemList({KFileItem(QUrl(QStringLiteral("smb://somefile.txt")))}));
0072         QMenu menu;
0073         actions.addActionsTo(&menu, KFileItemActions::MenuActionSource::Services);
0074         const auto resultingActions = menu.actions();
0075         QCOMPARE(resultingActions.count(), 2);
0076         QCOMPARE(resultingActions.at(0)->text(), "no_file");
0077         QCOMPARE(resultingActions.at(1)->text(), "smb");
0078     }
0079     {
0080         // Only the menu which handles URLs
0081         actions.setItemListProperties(KFileItemList({KFileItem(QUrl(QStringLiteral("someweirdscheme://somefile.txt")))}));
0082         QMenu menu;
0083         actions.addActionsTo(&menu, KFileItemActions::MenuActionSource::Services);
0084         const auto resultingActions = menu.actions();
0085         QCOMPARE(resultingActions.count(), 1);
0086         QCOMPARE(resultingActions.at(0)->text(), "no_file");
0087     }
0088 }
0089 
0090 QTEST_MAIN(KFileItemActionsTest)
0091 
0092 #include "moc_kfileitemactionstest.cpp"