Make sure that old URLs do not appear duplicated in places model

Summary:
BUG: 389401

KIO model now provides Baloo URLs; we need to remove the old ones
created by Dolphin places model

BUG: 387888
Depends on D9332

Test Plan: unit test

Reviewers: mwolff, #dolphin, ngraham, elvisangelaccio

Reviewed By: #dolphin, ngraham, elvisangelaccio

Subscribers: elvisangelaccio, broulik, ervin, ngraham, #dolphin

Differential Revision: https://phabricator.kde.org/D9333
This commit is contained in:
Renato Araujo Oliveira Filho 2017-12-14 12:35:44 -03:00
parent ea6a2424fb
commit 3bf68fd714
3 changed files with 72 additions and 32 deletions

View file

@ -53,9 +53,19 @@
#include <views/viewproperties.h> #include <views/viewproperties.h>
namespace { namespace {
// Hence a prefix to the application-name of the stored bookmarks is // A suffix to the application-name of the stored bookmarks is
// added, which is only read by PlacesItemModel. // added, which is only read by PlacesItemModel.
const char AppNamePrefix[] = "-places-panel"; const QString AppNameSuffix = QStringLiteral("-places-panel");
static QList<QUrl> balooURLs = {
QUrl(QStringLiteral("timeline:/today")),
QUrl(QStringLiteral("timeline:/yesterday")),
QUrl(QStringLiteral("timeline:/thismonth")),
QUrl(QStringLiteral("timeline:/lastmonth")),
QUrl(QStringLiteral("search:/documents")),
QUrl(QStringLiteral("search:/images")),
QUrl(QStringLiteral("search:/audio")),
QUrl(QStringLiteral("search:/videos"))
};
} }
PlacesItemModel::PlacesItemModel(QObject* parent) : PlacesItemModel::PlacesItemModel(QObject* parent) :
@ -63,8 +73,9 @@ PlacesItemModel::PlacesItemModel(QObject* parent) :
m_hiddenItemsShown(false), m_hiddenItemsShown(false),
m_deviceToTearDown(nullptr), m_deviceToTearDown(nullptr),
m_storageSetupInProgress(), m_storageSetupInProgress(),
m_sourceModel(new KFilePlacesModel(this)) m_sourceModel(new KFilePlacesModel(KAboutData::applicationData().componentName() + AppNameSuffix, this))
{ {
cleanupBookmarks();
loadBookmarks(); loadBookmarks();
initializeDefaultViewProperties(); initializeDefaultViewProperties();
@ -153,12 +164,13 @@ void PlacesItemModel::insertSortedItem(PlacesItem* item)
for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) {
sourceIndex = m_sourceModel->index(r, 0); sourceIndex = m_sourceModel->index(r, 0);
const KBookmark sourceBookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
if (bookmarkId(m_sourceModel->bookmarkForIndex(sourceIndex)) == iBookmarkId) { if (bookmarkId(sourceBookmark) == iBookmarkId) {
break; break;
} }
if (!m_sourceModel->isHidden(sourceIndex)) { if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) {
pos++; pos++;
} }
} }
@ -559,11 +571,7 @@ void PlacesItemModel::onSourceModelRowsMoved(const QModelIndex &parent, int star
const int targetRow = row + (start - r) - (r < row ? blockSize : 0); const int targetRow = row + (start - r) - (r < row ? blockSize : 0);
const QModelIndex targetIndex = m_sourceModel->index(targetRow, 0, destination); const QModelIndex targetIndex = m_sourceModel->index(targetRow, 0, destination);
const KBookmark bookmark = m_sourceModel->bookmarkForIndex(targetIndex); addItemFromSourceModel(targetIndex);
PlacesItem *item = new PlacesItem(bookmark);
updateItem(item, targetIndex);
insertSortedItem(item);
} }
} }
@ -608,13 +616,33 @@ void PlacesItemModel::onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupTyp
} }
} }
void PlacesItemModel::cleanupBookmarks()
{
// KIO model now provides support for baloo urls, and because of that we
// need to remove old URLs that were visible only in Dolphin to avoid duplication
int row = 0;
do {
const QModelIndex sourceIndex = m_sourceModel->index(row, 0);
const KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
const QUrl url = bookmark.url();
const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp"));
if ((appName == KAboutData::applicationData().componentName() ||
appName == KAboutData::applicationData().componentName() + AppNameSuffix) && balooURLs.contains(url)) {
qCDebug(DolphinDebug) << "Removing old baloo url:" << url;
m_sourceModel->removePlace(sourceIndex);
} else {
row++;
}
} while (row < m_sourceModel->rowCount());
}
void PlacesItemModel::loadBookmarks() void PlacesItemModel::loadBookmarks()
{ {
for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) {
const QModelIndex sourceIndex = m_sourceModel->index(r, 0); const QModelIndex sourceIndex = m_sourceModel->index(r, 0);
KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex); KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
if (acceptBookmark(bookmark) && if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) {
(m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex))) {
addItemFromSourceModel(sourceIndex); addItemFromSourceModel(sourceIndex);
} }
} }
@ -625,19 +653,6 @@ void PlacesItemModel::loadBookmarks()
#endif #endif
} }
bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark) const
{
const QString udi = bookmark.metaDataItem(QStringLiteral("UDI"));
const QUrl url = bookmark.url();
const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp"));
const bool allowedHere = (appName.isEmpty()
|| appName == KAboutData::applicationData().componentName()
|| appName == KAboutData::applicationData().componentName() + AppNamePrefix);
return (udi.isEmpty() && allowedHere);
}
void PlacesItemModel::clear() { void PlacesItemModel::clear() {
KStandardItemModel::clear(); KStandardItemModel::clear();
} }

View file

@ -167,19 +167,18 @@ private slots:
void onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden); void onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden);
private: private:
/**
* Remove bookmarks created by the previous version of dolphin that are
* not valid anymore
*/
void cleanupBookmarks();
/** /**
* Loads the bookmarks from the bookmark-manager and creates items for * Loads the bookmarks from the bookmark-manager and creates items for
* the model or moves hidden items to m_bookmarkedItems. * the model or moves hidden items to m_bookmarkedItems.
*/ */
void loadBookmarks(); void loadBookmarks();
/**
* @return True, if the bookmark can be accepted in the context of the
* current application (e.g. bookmarks from other applications
* will be ignored).
*/
bool acceptBookmark(const KBookmark& bookmark) const;
QString internalMimeType() const; QString internalMimeType() const;
/** /**

View file

@ -83,6 +83,7 @@ private slots:
void testIcons(); void testIcons();
void testDragAndDrop(); void testDragAndDrop();
void testHideDevices(); void testHideDevices();
void testDuplicatedEntries();
private: private:
PlacesItemModel* m_model; PlacesItemModel* m_model;
@ -780,6 +781,31 @@ void PlacesItemModelTest::testHideDevices()
m_model = new PlacesItemModel(); m_model = new PlacesItemModel();
QTRY_COMPARE(m_model->count(), urls.count()); QTRY_COMPARE(m_model->count(), urls.count());
CHECK_PLACES_URLS(urls); CHECK_PLACES_URLS(urls);
// revert changes
m_model->setGroupHidden(KFilePlacesModel::RemovableDevicesType, false);
urls = initialUrls();
QTRY_COMPARE(m_model->count(), urls.count());
CHECK_PLACES_URLS(urls);
}
void PlacesItemModelTest::testDuplicatedEntries()
{
QStringList urls = initialUrls();
// create a duplicated entry on bookmark
KBookmarkManager *bookmarkManager = KBookmarkManager::managerForFile(bookmarksFile(), QStringLiteral("kfilePlaces"));
KBookmarkGroup root = bookmarkManager->root();
KBookmark bookmark = root.addBookmark(QStringLiteral("Duplicated Search Videos"), QUrl("search:/videos"), {});
const QString id = QUuid::createUuid().toString();
bookmark.setMetaDataItem(QStringLiteral("ID"), id);
bookmark.setMetaDataItem(QStringLiteral("OnlyInApp"), KAboutData::applicationData().componentName());
bookmarkManager->emitChanged(bookmarkManager->root());
PlacesItemModel *newModel = new PlacesItemModel();
QTRY_COMPARE(placesUrls(newModel).count(QStringLiteral("search:/videos")), 1);
QTRY_COMPARE(urls, placesUrls(newModel));
delete newModel;
} }
QTEST_MAIN(PlacesItemModelTest) QTEST_MAIN(PlacesItemModelTest)