File indexing completed on 2024-04-28 07:42:15

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"