#ifndef COMPONENTS_BOOKMARKS_BROWSER_URL_INDEX_H_
#define COMPONENTS_BOOKMARKS_BROWSER_URL_INDEX_H_
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/synchronization/lock.h"
#include "components/bookmarks/browser/bookmark_node.h"
#include "components/bookmarks/browser/history_bookmark_model.h"
#include "url/gurl.h"
namespace bookmarks {
class BookmarkNode;
struct UrlLoadStats;
struct UrlAndTitle;
class UrlIndex : public HistoryBookmarkModel {
public:
explicit UrlIndex(std::unique_ptr<BookmarkNode> root);
UrlIndex(const UrlIndex&) = delete;
UrlIndex& operator=(const UrlIndex&) = delete;
BookmarkNode* root() { return root_.get(); }
void Add(BookmarkNode* parent,
size_t index,
std::unique_ptr<BookmarkNode> node);
std::unique_ptr<BookmarkNode> RemoveChildAt(BookmarkNode* parent,
size_t index,
std::set<GURL>* removed_urls);
void SetUrl(BookmarkNode* node, const GURL& url);
void SetTitle(BookmarkNode* node, const std::u16string& title);
void GetNodesWithIconUrl(const GURL& icon_url,
std::set<const BookmarkNode*>* nodes);
void GetNodesByUrl(
const GURL& url,
std::vector<raw_ptr<const BookmarkNode, VectorExperimental>>* nodes);
bool HasBookmarks() const;
UrlLoadStats ComputeStats() const;
bool IsBookmarked(const GURL& url) override;
[[nodiscard]] std::vector<UrlAndTitle> GetUniqueUrls() override;
private:
friend class base::RefCountedThreadSafe<UrlIndex>;
~UrlIndex() override;
class NodeUrlComparator {
public:
using is_transparent = void;
bool operator()(const BookmarkNode* n1, const BookmarkNode* n2) const {
return n1->url() < n2->url();
}
bool operator()(const BookmarkNode* n1, const GURL& url2) const {
return n1->url() < url2;
}
bool operator()(const GURL& url1, const BookmarkNode* n2) const {
return url1 < n2->url();
}
};
bool IsBookmarkedNoLock(const GURL& url);
void AddImpl(BookmarkNode* node);
void RemoveImpl(BookmarkNode* node, std::set<GURL>* removed_urls);
std::unique_ptr<BookmarkNode> root_;
using NodesOrderedByUrlSet = std::multiset<BookmarkNode*, NodeUrlComparator>;
NodesOrderedByUrlSet nodes_ordered_by_url_set_;
mutable base::Lock url_lock_;
};
}
#endif