File indexing completed on 2024-03-24 03:56:27
0001 /* 0002 This file is part of the KDE libraries 0003 SPDX-FileCopyrightText: 2005 David Faure <faure@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "kurlmimedatatest.h" 0009 #include <QMimeData> 0010 #include <QTest> 0011 #include <kurlmimedata.h> 0012 #include <kurlmimedata_p.h> 0013 #include <memory> 0014 0015 QTEST_MAIN(KUrlMimeDataTest) 0016 0017 void KUrlMimeDataTest::testURLList() 0018 { 0019 QMimeData *mimeData = new QMimeData(); 0020 QVERIFY(!mimeData->hasUrls()); 0021 0022 QList<QUrl> urls; 0023 urls.append(QUrl(QLatin1String("https://www.kde.org"))); 0024 urls.append(QUrl(QLatin1String("http://wstephenson:secret@example.com/path"))); 0025 urls.append(QUrl(QLatin1String("file:///home/dfaure/konqtests/Mat%C3%A9riel"))); 0026 QMap<QString, QString> metaData; 0027 metaData[QLatin1String("key")] = QLatin1String("value"); 0028 metaData[QLatin1String("key2")] = QLatin1String("value2"); 0029 0030 KUrlMimeData::setUrls(QList<QUrl>(), urls, mimeData); 0031 KUrlMimeData::setMetaData(metaData, mimeData); 0032 0033 QVERIFY(mimeData->hasUrls()); 0034 QVERIFY(mimeData->hasText()); 0035 0036 QMap<QString, QString> decodedMetaData; 0037 QList<QUrl> decodedURLs = KUrlMimeData::urlsFromMimeData(mimeData, KUrlMimeData::PreferKdeUrls, &decodedMetaData); 0038 QVERIFY(!decodedURLs.isEmpty()); 0039 QList<QUrl> expectedUrls = urls; 0040 expectedUrls[1] = QUrl(QLatin1String("http://wstephenson:secret@example.com/path")); // password kept, unlike in KDE4, but that's okay, it's not displayed 0041 QCOMPARE(expectedUrls, decodedURLs); 0042 0043 const QList<QUrl> qurls = mimeData->urls(); 0044 QCOMPARE(qurls.count(), urls.count()); 0045 for (int i = 0; i < qurls.count(); ++i) { 0046 QCOMPARE(qurls[i], decodedURLs[i]); 0047 } 0048 0049 QVERIFY(!decodedMetaData.isEmpty()); 0050 QCOMPARE(decodedMetaData[QLatin1String("key")], QString::fromLatin1("value")); 0051 QCOMPARE(decodedMetaData[QLatin1String("key2")], QString::fromLatin1("value2")); 0052 0053 delete mimeData; 0054 } 0055 0056 void KUrlMimeDataTest::testOneURL() 0057 { 0058 QUrl oneURL(QLatin1String("file:///tmp")); 0059 QList<QUrl> oneEltList; 0060 oneEltList.append(oneURL); 0061 QMimeData *mimeData = new QMimeData(); 0062 0063 KUrlMimeData::setUrls(QList<QUrl>(), oneEltList, mimeData); 0064 QVERIFY(mimeData->hasUrls()); 0065 0066 QMap<QString, QString> decodedMetaData; 0067 QList<QUrl> decodedURLs = KUrlMimeData::urlsFromMimeData(mimeData, KUrlMimeData::PreferKdeUrls, &decodedMetaData); 0068 QVERIFY(!decodedURLs.isEmpty()); 0069 QCOMPARE(decodedURLs.count(), 1); 0070 QCOMPARE(decodedURLs[0], oneURL); 0071 QVERIFY(decodedMetaData.isEmpty()); 0072 delete mimeData; 0073 } 0074 0075 void KUrlMimeDataTest::testFromQUrl() 0076 { 0077 QList<QUrl> qurls; 0078 qurls.append(QUrl(QLatin1String("https://www.kde.org"))); 0079 qurls.append(QUrl(QLatin1String("file:///home/dfaure/konqtests/Mat%C3%A9riel"))); 0080 QMimeData *mimeData = new QMimeData(); 0081 KUrlMimeData::setUrls(QList<QUrl>(), qurls, mimeData); 0082 QVERIFY(mimeData->hasUrls()); 0083 0084 QMap<QString, QString> decodedMetaData; 0085 QList<QUrl> decodedURLs = KUrlMimeData::urlsFromMimeData(mimeData, KUrlMimeData::PreferKdeUrls, &decodedMetaData); 0086 QVERIFY(!decodedURLs.isEmpty()); 0087 QCOMPARE(decodedURLs.count(), 2); 0088 QCOMPARE(decodedURLs[0], qurls[0]); 0089 QCOMPARE(decodedURLs[1], qurls[1]); 0090 QVERIFY(decodedMetaData.isEmpty()); 0091 delete mimeData; 0092 } 0093 0094 void KUrlMimeDataTest::testMostLocalUrlList_data() 0095 { 0096 QTest::addColumn<bool>("withKdeUrls"); 0097 QTest::addColumn<bool>("withLocalUrls"); 0098 QTest::addColumn<bool>("expectedLocalUrls"); 0099 0100 QTest::newRow("both") << true << true << false; 0101 QTest::newRow("local_only") << false << true << true; 0102 QTest::newRow("kde_only") << true << false << false; 0103 } 0104 0105 void KUrlMimeDataTest::testMostLocalUrlList() 0106 { 0107 QFETCH(bool, withKdeUrls); 0108 QFETCH(bool, withLocalUrls); 0109 QFETCH(bool, expectedLocalUrls); 0110 0111 QMimeData *mimeData = new QMimeData(); 0112 QList<QUrl> urls; 0113 urls.append(QUrl(QLatin1String("desktop:/foo"))); 0114 urls.append(QUrl(QLatin1String("desktop:/bar"))); 0115 QList<QUrl> localUrls; 0116 localUrls.append(QUrl(QLatin1String("file:/home/dfaure/Desktop/foo"))); 0117 localUrls.append(QUrl(QLatin1String("file:/home/dfaure/Desktop/bar"))); 0118 0119 if (withKdeUrls && withLocalUrls) { 0120 KUrlMimeData::setUrls(urls, localUrls, mimeData); 0121 } else if (withKdeUrls) { 0122 KUrlMimeData::setUrls(urls, {}, mimeData); 0123 } else if (withLocalUrls) { 0124 KUrlMimeData::setUrls({}, localUrls, mimeData); 0125 } 0126 0127 QVERIFY(mimeData->hasUrls()); 0128 QVERIFY(mimeData->hasText()); 0129 // The support for urls is done in hasText, a direct call to hasFormat will say false. 0130 // QVERIFY(mimeData->hasFormat(QLatin1String("text/plain"))); 0131 0132 // urlsFromMimeData decodes the real "kde" urls by default, if any 0133 QList<QUrl> decodedURLs = KUrlMimeData::urlsFromMimeData(mimeData); 0134 QVERIFY(!decodedURLs.isEmpty()); 0135 if (expectedLocalUrls) { 0136 QCOMPARE(decodedURLs, localUrls); 0137 } else { 0138 QCOMPARE(decodedURLs, urls); 0139 } 0140 0141 // urlsFromMimeData can also be told to decode the "most local" urls 0142 decodedURLs = KUrlMimeData::urlsFromMimeData(mimeData, KUrlMimeData::PreferLocalUrls); 0143 QVERIFY(!decodedURLs.isEmpty()); 0144 if (withLocalUrls) { 0145 QCOMPARE(decodedURLs, localUrls); 0146 } else { 0147 QCOMPARE(decodedURLs, urls); 0148 } 0149 0150 // QMimeData decodes the "most local" urls 0151 const QList<QUrl> qurls = mimeData->urls(); 0152 if (withLocalUrls) { 0153 QCOMPARE(qurls.count(), localUrls.count()); 0154 for (int i = 0; i < qurls.count(); ++i) { 0155 QCOMPARE(qurls[i], static_cast<QUrl>(localUrls[i])); 0156 } 0157 } else { 0158 QCOMPARE(qurls.count(), 0); 0159 } 0160 0161 delete mimeData; 0162 } 0163 0164 #if HAVE_QTDBUS 0165 0166 void KUrlMimeDataTest::testSameProcessCopyPaste() 0167 { 0168 if (!KUrlMimeData::isDocumentsPortalAvailable()) { 0169 QSKIP("Documents portal not available"); 0170 } 0171 0172 std::unique_ptr<QMimeData> mimeData(new QMimeData()); 0173 QList<QUrl> urls{QUrl(QStringLiteral("desktop:/foo")), QUrl(QStringLiteral("desktop:/bar"))}; 0174 0175 KUrlMimeData::setUrls(urls, {}, mimeData.get()); 0176 mimeData->setData(QStringLiteral("application/vnd.portal.filetransfer"), QFile::encodeName(QStringLiteral("bad-transfer-id"))); 0177 0178 // Should fail because the transfer id is invalid 0179 QList<QUrl> decodedURLs = KUrlMimeData::urlsFromMimeData(mimeData.get()); 0180 QVERIFY(decodedURLs.length() != 2); 0181 0182 // Should succeed because we put in the source id, so the portal is skipped 0183 KUrlMimeData::setSourceId(mimeData.get()); 0184 decodedURLs = KUrlMimeData::urlsFromMimeData(mimeData.get()); 0185 QVERIFY(!decodedURLs.isEmpty()); 0186 QCOMPARE(decodedURLs, urls); 0187 0188 // Should fail because we put in a bad source id, so the portal is not skipped 0189 mimeData->setData(QStringLiteral("application/x-kde-source-id"), QStringLiteral("bad-source-id").toUtf8()); 0190 decodedURLs = KUrlMimeData::urlsFromMimeData(mimeData.get()); 0191 QVERIFY(decodedURLs.length() != 2); 0192 } 0193 0194 #endif // HAVE_QTDBUS 0195 0196 #include "moc_kurlmimedatatest.cpp"