Commit af1a45f5 authored by Mikel Astiz's avatar Mikel Astiz Committed by Commit Bot

bookmarks: Simplify visibility of permanent nodes

This removes BookmarkPermanentNode::set_visible(), which was misnamed
in the sense that it didn't directly determine what
BookmarkNode::IsVisible() returns, but instead the returned value for
the case where the node has no children.

As it turns out, none of the callers need to change this attribute
(i.e. the visibility when empty) dynamically. For the managed node, it
needs to always be false, and the remaining permanent nodes take this
value from BookmarkClient upon construction.

BookmarkClient gets a minor refactoring to adopt more accurate names
and to allow evaluating the visibility of permanent nodes prior to their
construction.

Change-Id: I4435140e80216800ce1dcee5604e8370bcc2cedc
Bug: 1060311
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2095125
Commit-Queue: Mikel Astiz <mastiz@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748891}
parent acc992b5
...@@ -89,16 +89,29 @@ void ChromeBookmarkClient::GetTypedCountForUrls( ...@@ -89,16 +89,29 @@ void ChromeBookmarkClient::GetTypedCountForUrls(
} }
} }
bool ChromeBookmarkClient::IsPermanentNodeVisible( bool ChromeBookmarkClient::IsPermanentNodeVisibleWhenEmpty(
const bookmarks::BookmarkPermanentNode* node) { bookmarks::BookmarkNode::Type type) {
DCHECK(bookmarks::IsPermanentNode(node, managed_bookmark_service_));
if (bookmarks::IsManagedNode(node, managed_bookmark_service_))
return false;
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
return node->type() == bookmarks::BookmarkNode::MOBILE; const bool is_mobile = true;
#else #else
return node->type() != bookmarks::BookmarkNode::MOBILE; const bool is_mobile = false;
#endif #endif
switch (type) {
case bookmarks::BookmarkNode::URL:
NOTREACHED();
return false;
case bookmarks::BookmarkNode::FOLDER:
// Managed node.
return false;
case bookmarks::BookmarkNode::BOOKMARK_BAR:
case bookmarks::BookmarkNode::OTHER_NODE:
return !is_mobile;
case bookmarks::BookmarkNode::MOBILE:
return is_mobile;
}
return false;
} }
void ChromeBookmarkClient::RecordAction(const base::UserMetricsAction& action) { void ChromeBookmarkClient::RecordAction(const base::UserMetricsAction& action) {
......
...@@ -19,7 +19,6 @@ class Profile; ...@@ -19,7 +19,6 @@ class Profile;
namespace bookmarks { namespace bookmarks {
class BookmarkModel; class BookmarkModel;
class BookmarkNode; class BookmarkNode;
class BookmarkPermanentNode;
class ManagedBookmarkService; class ManagedBookmarkService;
} }
...@@ -51,8 +50,8 @@ class ChromeBookmarkClient : public bookmarks::BookmarkClient { ...@@ -51,8 +50,8 @@ class ChromeBookmarkClient : public bookmarks::BookmarkClient {
base::CancelableTaskTracker* tracker) override; base::CancelableTaskTracker* tracker) override;
bool SupportsTypedCountForUrls() override; bool SupportsTypedCountForUrls() override;
void GetTypedCountForUrls(UrlTypedCountMap* url_typed_count_map) override; void GetTypedCountForUrls(UrlTypedCountMap* url_typed_count_map) override;
bool IsPermanentNodeVisible( bool IsPermanentNodeVisibleWhenEmpty(
const bookmarks::BookmarkPermanentNode* node) override; bookmarks::BookmarkNode::Type type) override;
void RecordAction(const base::UserMetricsAction& action) override; void RecordAction(const base::UserMetricsAction& action) override;
bookmarks::LoadManagedNodeCallback GetLoadManagedNodeCallback() override; bookmarks::LoadManagedNodeCallback GetLoadManagedNodeCallback() override;
bool CanSetPermanentNodeTitle( bool CanSetPermanentNodeTitle(
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/task/cancelable_task_tracker.h" #include "base/task/cancelable_task_tracker.h"
#include "components/bookmarks/browser/bookmark_node.h"
#include "components/bookmarks/browser/bookmark_storage.h" #include "components/bookmarks/browser/bookmark_storage.h"
#include "components/favicon_base/favicon_callback.h" #include "components/favicon_base/favicon_callback.h"
#include "components/favicon_base/favicon_types.h" #include "components/favicon_base/favicon_types.h"
...@@ -24,8 +25,6 @@ struct UserMetricsAction; ...@@ -24,8 +25,6 @@ struct UserMetricsAction;
namespace bookmarks { namespace bookmarks {
class BookmarkModel; class BookmarkModel;
class BookmarkNode;
class BookmarkPermanentNode;
// This class abstracts operations that depends on the embedder's environment, // This class abstracts operations that depends on the embedder's environment,
// e.g. Chrome. // e.g. Chrome.
...@@ -66,9 +65,9 @@ class BookmarkClient { ...@@ -66,9 +65,9 @@ class BookmarkClient {
// |url_typed_count_map| must not be null. // |url_typed_count_map| must not be null.
virtual void GetTypedCountForUrls(UrlTypedCountMap* url_typed_count_map); virtual void GetTypedCountForUrls(UrlTypedCountMap* url_typed_count_map);
// Returns whether the embedder wants permanent node |node| // Returns whether the embedder wants permanent node of type |type|
// to always be visible or to only show them when not empty. // to always be visible or to only show them when not empty.
virtual bool IsPermanentNodeVisible(const BookmarkPermanentNode* node) = 0; virtual bool IsPermanentNodeVisibleWhenEmpty(BookmarkNode::Type type) = 0;
// Wrapper around RecordAction defined in base/metrics/user_metrics.h // Wrapper around RecordAction defined in base/metrics/user_metrics.h
// that ensure that the action is posted from the correct thread. // that ensure that the action is posted from the correct thread.
......
...@@ -58,10 +58,8 @@ class VisibilityComparator { ...@@ -58,10 +58,8 @@ class VisibilityComparator {
const std::unique_ptr<BookmarkNode>& n2) { const std::unique_ptr<BookmarkNode>& n2) {
DCHECK(n1->is_permanent_node()); DCHECK(n1->is_permanent_node());
DCHECK(n2->is_permanent_node()); DCHECK(n2->is_permanent_node());
bool n1_visible = client_->IsPermanentNodeVisible( bool n1_visible = client_->IsPermanentNodeVisibleWhenEmpty(n1->type());
static_cast<BookmarkPermanentNode*>(n1.get())); bool n2_visible = client_->IsPermanentNodeVisibleWhenEmpty(n2->type());
bool n2_visible = client_->IsPermanentNodeVisible(
static_cast<BookmarkPermanentNode*>(n2.get()));
return n1_visible != n2_visible && n1_visible; return n1_visible != n2_visible && n1_visible;
} }
......
...@@ -162,15 +162,22 @@ void BookmarkNode::InvalidateFavicon() { ...@@ -162,15 +162,22 @@ void BookmarkNode::InvalidateFavicon() {
// BookmarkPermanentNode ------------------------------------------------------- // BookmarkPermanentNode -------------------------------------------------------
BookmarkPermanentNode::BookmarkPermanentNode(int64_t id, Type type) BookmarkPermanentNode::BookmarkPermanentNode(int64_t id,
: BookmarkNode(id, PermanentNodeTypeToGuid(type), GURL(), type, true) { Type type,
bool visible_when_empty)
: BookmarkNode(id,
PermanentNodeTypeToGuid(type),
GURL(),
type,
/*is_permanent_node=*/true),
visible_when_empty_(visible_when_empty) {
DCHECK(type != URL); DCHECK(type != URL);
} }
BookmarkPermanentNode::~BookmarkPermanentNode() = default; BookmarkPermanentNode::~BookmarkPermanentNode() = default;
bool BookmarkPermanentNode::IsVisible() const { bool BookmarkPermanentNode::IsVisible() const {
return visible_ || !children().empty(); return visible_when_empty_ || !children().empty();
} }
} // namespace bookmarks } // namespace bookmarks
...@@ -222,17 +222,15 @@ class BookmarkNode : public ui::TreeNode<BookmarkNode>, public TitledUrlNode { ...@@ -222,17 +222,15 @@ class BookmarkNode : public ui::TreeNode<BookmarkNode>, public TitledUrlNode {
// Node used for the permanent folders (excluding the root). // Node used for the permanent folders (excluding the root).
class BookmarkPermanentNode : public BookmarkNode { class BookmarkPermanentNode : public BookmarkNode {
public: public:
BookmarkPermanentNode(int64_t id, Type type); // TODO(mastiz): Remove default value for |visible_when_empty|.
BookmarkPermanentNode(int64_t id, Type type, bool visible_when_empty = false);
~BookmarkPermanentNode() override; ~BookmarkPermanentNode() override;
// WARNING: this code is used for other projects. Contact noyau@ for details.
void set_visible(bool value) { visible_ = value; }
// BookmarkNode overrides: // BookmarkNode overrides:
bool IsVisible() const override; bool IsVisible() const override;
private: private:
bool visible_ = false; const bool visible_when_empty_;
DISALLOW_COPY_AND_ASSIGN(BookmarkPermanentNode); DISALLOW_COPY_AND_ASSIGN(BookmarkPermanentNode);
}; };
......
...@@ -241,8 +241,9 @@ BookmarkPermanentNode* BookmarkLoadDetails::CreatePermanentNode( ...@@ -241,8 +241,9 @@ BookmarkPermanentNode* BookmarkLoadDetails::CreatePermanentNode(
DCHECK(type == BookmarkNode::BOOKMARK_BAR || DCHECK(type == BookmarkNode::BOOKMARK_BAR ||
type == BookmarkNode::OTHER_NODE || type == BookmarkNode::MOBILE); type == BookmarkNode::OTHER_NODE || type == BookmarkNode::MOBILE);
std::unique_ptr<BookmarkPermanentNode> node = std::unique_ptr<BookmarkPermanentNode> node =
std::make_unique<BookmarkPermanentNode>(max_id_++, type); std::make_unique<BookmarkPermanentNode>(
node->set_visible(client->IsPermanentNodeVisible(node.get())); max_id_++, type,
/*visible_when_empty=*/client->IsPermanentNodeVisibleWhenEmpty(type));
int title_id; int title_id;
switch (type) { switch (type) {
......
...@@ -49,7 +49,6 @@ class BookmarkPermanentNodeLoader { ...@@ -49,7 +49,6 @@ class BookmarkPermanentNodeLoader {
node_->set_id(*next_node_id); node_->set_id(*next_node_id);
*next_node_id = ManagedBookmarksTracker::LoadInitial( *next_node_id = ManagedBookmarksTracker::LoadInitial(
node_.get(), initial_bookmarks_.get(), node_->id() + 1); node_.get(), initial_bookmarks_.get(), node_->id() + 1);
node_->set_visible(!node_->children().empty());
node_->SetTitle(l10n_util::GetStringUTF16(title_id_)); node_->SetTitle(l10n_util::GetStringUTF16(title_id_));
return std::move(node_); return std::move(node_);
} }
...@@ -100,8 +99,8 @@ LoadManagedNodeCallback ManagedBookmarkService::GetLoadManagedNodeCallback() { ...@@ -100,8 +99,8 @@ LoadManagedNodeCallback ManagedBookmarkService::GetLoadManagedNodeCallback() {
// Create a BookmarkPermanentNode with a temporary id of 0. It will be // Create a BookmarkPermanentNode with a temporary id of 0. It will be
// populated and assigned a proper id in the LoadManagedNode callback. Until // populated and assigned a proper id in the LoadManagedNode callback. Until
// then, it is owned by the returned closure. // then, it is owned by the returned closure.
std::unique_ptr<BookmarkPermanentNode> managed( auto managed = std::make_unique<BookmarkPermanentNode>(
new BookmarkPermanentNode(0, BookmarkNode::FOLDER)); 0, BookmarkNode::FOLDER, /*visible_when_empty=*/false);
managed_node_ = managed.get(); managed_node_ = managed.get();
......
...@@ -109,9 +109,6 @@ void ManagedBookmarksTracker::ReloadManagedBookmarks() { ...@@ -109,9 +109,6 @@ void ManagedBookmarksTracker::ReloadManagedBookmarks() {
// Recursively update all the managed bookmarks and folders. // Recursively update all the managed bookmarks and folders.
const base::ListValue* list = prefs_->GetList(prefs::kManagedBookmarks); const base::ListValue* list = prefs_->GetList(prefs::kManagedBookmarks);
UpdateBookmarks(managed_node_, list); UpdateBookmarks(managed_node_, list);
// The managed bookmarks folder isn't visible when that pref isn't present.
managed_node_->set_visible(!managed_node_->children().empty());
} }
void ManagedBookmarksTracker::UpdateBookmarks(const BookmarkNode* folder, void ManagedBookmarksTracker::UpdateBookmarks(const BookmarkNode* folder,
......
...@@ -59,7 +59,6 @@ class ManagedBookmarksTrackerTest : public testing::Test { ...@@ -59,7 +59,6 @@ class ManagedBookmarksTrackerTest : public testing::Test {
BookmarkPermanentNode* managed_node = owned_managed_node.get(); BookmarkPermanentNode* managed_node = owned_managed_node.get();
ManagedBookmarksTracker::LoadInitial( ManagedBookmarksTracker::LoadInitial(
managed_node, prefs_.GetList(prefs::kManagedBookmarks), 101); managed_node, prefs_.GetList(prefs::kManagedBookmarks), 101);
managed_node->set_visible(!managed_node->children().empty());
managed_node->SetTitle(l10n_util::GetStringUTF16( managed_node->SetTitle(l10n_util::GetStringUTF16(
IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME)); IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME));
......
...@@ -58,12 +58,22 @@ bool TestBookmarkClient::IsAManagedNode(const BookmarkNode* node) { ...@@ -58,12 +58,22 @@ bool TestBookmarkClient::IsAManagedNode(const BookmarkNode* node) {
return node && node->HasAncestor(unowned_managed_node_); return node && node->HasAncestor(unowned_managed_node_);
} }
bool TestBookmarkClient::IsPermanentNodeVisible( bool TestBookmarkClient::IsPermanentNodeVisibleWhenEmpty(
const BookmarkPermanentNode* node) { BookmarkNode::Type type) {
DCHECK(node->type() == BookmarkNode::BOOKMARK_BAR || switch (type) {
node->type() == BookmarkNode::OTHER_NODE || case bookmarks::BookmarkNode::URL:
node->type() == BookmarkNode::MOBILE || IsManagedNodeRoot(node)); NOTREACHED();
return node->type() != BookmarkNode::MOBILE && !IsManagedNodeRoot(node); return false;
case bookmarks::BookmarkNode::BOOKMARK_BAR:
case bookmarks::BookmarkNode::OTHER_NODE:
return true;
case bookmarks::BookmarkNode::FOLDER:
case bookmarks::BookmarkNode::MOBILE:
return false;
}
NOTREACHED();
return false;
} }
void TestBookmarkClient::RecordAction(const base::UserMetricsAction& action) { void TestBookmarkClient::RecordAction(const base::UserMetricsAction& action) {
......
...@@ -44,7 +44,7 @@ class TestBookmarkClient : public BookmarkClient { ...@@ -44,7 +44,7 @@ class TestBookmarkClient : public BookmarkClient {
private: private:
// BookmarkClient: // BookmarkClient:
bool IsPermanentNodeVisible(const BookmarkPermanentNode* node) override; bool IsPermanentNodeVisibleWhenEmpty(BookmarkNode::Type type) override;
void RecordAction(const base::UserMetricsAction& action) override; void RecordAction(const base::UserMetricsAction& action) override;
LoadManagedNodeCallback GetLoadManagedNodeCallback() override; LoadManagedNodeCallback GetLoadManagedNodeCallback() override;
bool CanSetPermanentNodeTitle(const BookmarkNode* permanent_node) override; bool CanSetPermanentNodeTitle(const BookmarkNode* permanent_node) override;
......
...@@ -71,9 +71,9 @@ void BookmarkClientImpl::GetTypedCountForUrls( ...@@ -71,9 +71,9 @@ void BookmarkClientImpl::GetTypedCountForUrls(
} }
} }
bool BookmarkClientImpl::IsPermanentNodeVisible( bool BookmarkClientImpl::IsPermanentNodeVisibleWhenEmpty(
const bookmarks::BookmarkPermanentNode* node) { bookmarks::BookmarkNode::Type type) {
return node->type() == bookmarks::BookmarkNode::MOBILE; return type == bookmarks::BookmarkNode::MOBILE;
} }
void BookmarkClientImpl::RecordAction(const base::UserMetricsAction& action) { void BookmarkClientImpl::RecordAction(const base::UserMetricsAction& action) {
......
...@@ -17,8 +17,6 @@ class GURL; ...@@ -17,8 +17,6 @@ class GURL;
namespace bookmarks { namespace bookmarks {
class BookmarkModel; class BookmarkModel;
class BookmarkNode;
class BookmarkPermanentNode;
} }
namespace sync_bookmarks { namespace sync_bookmarks {
...@@ -42,8 +40,8 @@ class BookmarkClientImpl : public bookmarks::BookmarkClient { ...@@ -42,8 +40,8 @@ class BookmarkClientImpl : public bookmarks::BookmarkClient {
base::CancelableTaskTracker* tracker) override; base::CancelableTaskTracker* tracker) override;
bool SupportsTypedCountForUrls() override; bool SupportsTypedCountForUrls() override;
void GetTypedCountForUrls(UrlTypedCountMap* url_typed_count_map) override; void GetTypedCountForUrls(UrlTypedCountMap* url_typed_count_map) override;
bool IsPermanentNodeVisible( bool IsPermanentNodeVisibleWhenEmpty(
const bookmarks::BookmarkPermanentNode* node) override; bookmarks::BookmarkNode::Type type) override;
void RecordAction(const base::UserMetricsAction& action) override; void RecordAction(const base::UserMetricsAction& action) override;
bookmarks::LoadManagedNodeCallback GetLoadManagedNodeCallback() override; bookmarks::LoadManagedNodeCallback GetLoadManagedNodeCallback() override;
bool CanSetPermanentNodeTitle( bool CanSetPermanentNodeTitle(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment