Commit c228ed86 authored by Mohamed Amir Yosef's avatar Mohamed Amir Yosef Committed by Commit Bot

[Sync:USS] Don't always load favicon when creating bookmark specifics

Before this CL: favicon is always loaded when creating specifics out of
a bookmark node.

After this CL: a new paramter is added to control this behavior and
ignores the favicon field if the favicon is not loaded already.

This is added such that in debug page chrome://sync-internals,
the load of a favicon is avoid if not loaded already.

Bug: 516866
Change-Id: I14093cea131d44e83cca1b5ab07d64d6b46061c1
Reviewed-on: https://chromium-review.googlesource.com/c/1254066
Commit-Queue: Mohamed Amir Yosef <mamir@chromium.org>
Reviewed-by: default avatarMikel Astiz <mastiz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#596550}
parent 23dc588f
...@@ -66,7 +66,8 @@ BookmarkLocalChangesBuilder::BuildCommitRequests(size_t max_entries) const { ...@@ -66,7 +66,8 @@ BookmarkLocalChangesBuilder::BuildCommitRequests(size_t max_entries) const {
data.unique_position = metadata->unique_position(); data.unique_position = metadata->unique_position();
// Assign specifics only for the non-deletion case. In case of deletion, // Assign specifics only for the non-deletion case. In case of deletion,
// EntityData should contain empty specifics to indicate deletion. // EntityData should contain empty specifics to indicate deletion.
data.specifics = CreateSpecificsFromBookmarkNode(node, bookmark_model_); data.specifics = CreateSpecificsFromBookmarkNode(
node, bookmark_model_, /*force_favicon_load=*/true);
} }
request.entity = data.PassToPtr(); request.entity = data.PassToPtr();
request.sequence_number = metadata->sequence_number(); request.sequence_number = metadata->sequence_number();
......
...@@ -334,8 +334,8 @@ void BookmarkModelMerger::ProcessLocalCreation( ...@@ -334,8 +334,8 @@ void BookmarkModelMerger::ProcessLocalCreation(
} }
const bookmarks::BookmarkNode* node = parent->GetChild(index); const bookmarks::BookmarkNode* node = parent->GetChild(index);
const sync_pb::EntitySpecifics specifics = const sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode(
CreateSpecificsFromBookmarkNode(node, bookmark_model_); node, bookmark_model_, /*force_favicon_load=*/true);
bookmark_tracker_->Add(sync_id, node, server_version, creation_time, bookmark_tracker_->Add(sync_id, node, server_version, creation_time,
pos.ToProto(), specifics); pos.ToProto(), specifics);
// Mark the entity that it needs to be committed. // Mark the entity that it needs to be committed.
......
...@@ -63,7 +63,7 @@ void BookmarkModelObserverImpl::BookmarkNodeMoved( ...@@ -63,7 +63,7 @@ void BookmarkModelObserverImpl::BookmarkNodeMoved(
ComputePosition(*new_parent, new_index, sync_id).ToProto(); ComputePosition(*new_parent, new_index, sync_id).ToProto();
sync_pb::EntitySpecifics specifics = sync_pb::EntitySpecifics specifics =
CreateSpecificsFromBookmarkNode(node, model); CreateSpecificsFromBookmarkNode(node, model, /*force_favicon_load=*/true);
bookmark_tracker_->Update(sync_id, entity->metadata()->server_version(), bookmark_tracker_->Update(sync_id, entity->metadata()->server_version(),
modification_time, unique_position, specifics); modification_time, unique_position, specifics);
...@@ -98,7 +98,7 @@ void BookmarkModelObserverImpl::BookmarkNodeAdded( ...@@ -98,7 +98,7 @@ void BookmarkModelObserverImpl::BookmarkNodeAdded(
ComputePosition(*parent, index, sync_id).ToProto(); ComputePosition(*parent, index, sync_id).ToProto();
sync_pb::EntitySpecifics specifics = sync_pb::EntitySpecifics specifics =
CreateSpecificsFromBookmarkNode(node, model); CreateSpecificsFromBookmarkNode(node, model, /*force_favicon_load=*/true);
bookmark_tracker_->Add(sync_id, node, server_version, creation_time, bookmark_tracker_->Add(sync_id, node, server_version, creation_time,
unique_position, specifics); unique_position, specifics);
...@@ -180,7 +180,7 @@ void BookmarkModelObserverImpl::BookmarkNodeChanged( ...@@ -180,7 +180,7 @@ void BookmarkModelObserverImpl::BookmarkNodeChanged(
const std::string& sync_id = entity->metadata()->server_id(); const std::string& sync_id = entity->metadata()->server_id();
const base::Time modification_time = base::Time::Now(); const base::Time modification_time = base::Time::Now();
sync_pb::EntitySpecifics specifics = sync_pb::EntitySpecifics specifics =
CreateSpecificsFromBookmarkNode(node, model); CreateSpecificsFromBookmarkNode(node, model, /*force_favicon_load=*/true);
if (entity->MatchesSpecificsHash(specifics)) { if (entity->MatchesSpecificsHash(specifics)) {
// We should push data to the server only if there is an actual change in // We should push data to the server only if there is an actual change in
// the data. We could hit this code path without having actual changes // the data. We could hit this code path without having actual changes
...@@ -262,8 +262,8 @@ void BookmarkModelObserverImpl::BookmarkNodeChildrenReordered( ...@@ -262,8 +262,8 @@ void BookmarkModelObserverImpl::BookmarkNodeChildrenReordered(
previous_position = position; previous_position = position;
const sync_pb::EntitySpecifics specifics = const sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode(
CreateSpecificsFromBookmarkNode(node, model); node, model, /*force_favicon_load=*/true);
bookmark_tracker_->Update(sync_id, entity->metadata()->server_version(), bookmark_tracker_->Update(sync_id, entity->metadata()->server_version(),
modification_time, position.ToProto(), specifics); modification_time, position.ToProto(), specifics);
......
...@@ -451,7 +451,8 @@ void BookmarkModelTypeProcessor::AppendNodeAndChildrenForDebugging( ...@@ -451,7 +451,8 @@ void BookmarkModelTypeProcessor::AppendNodeAndChildrenForDebugging(
data.non_unique_name = base::UTF16ToUTF8(node->GetTitle()); data.non_unique_name = base::UTF16ToUTF8(node->GetTitle());
data.is_folder = node->is_folder(); data.is_folder = node->is_folder();
data.unique_position = metadata->unique_position(); data.unique_position = metadata->unique_position();
data.specifics = CreateSpecificsFromBookmarkNode(node, bookmark_model_); data.specifics = CreateSpecificsFromBookmarkNode(
node, bookmark_model_, /*force_favicon_load=*/false);
if (node->is_permanent_node()) { if (node->is_permanent_node()) {
data.server_defined_unique_tag = data.server_defined_unique_tag =
ComputeServerDefinedUniqueTagForDebugging(node, bookmark_model_); ComputeServerDefinedUniqueTagForDebugging(node, bookmark_model_);
......
...@@ -89,7 +89,8 @@ void SetBookmarkFaviconFromSpecifics( ...@@ -89,7 +89,8 @@ void SetBookmarkFaviconFromSpecifics(
sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode( sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode(
const bookmarks::BookmarkNode* node, const bookmarks::BookmarkNode* node,
bookmarks::BookmarkModel* model) { bookmarks::BookmarkModel* model,
bool force_favicon_load) {
sync_pb::EntitySpecifics specifics; sync_pb::EntitySpecifics specifics;
sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark(); sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
if (!node->is_folder()) { if (!node->is_folder()) {
...@@ -99,6 +100,14 @@ sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode( ...@@ -99,6 +100,14 @@ sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode(
bm_specifics->set_creation_time_us( bm_specifics->set_creation_time_us(
node->date_added().ToDeltaSinceWindowsEpoch().InMicroseconds()); node->date_added().ToDeltaSinceWindowsEpoch().InMicroseconds());
if (node->GetMetaInfoMap()) {
UpdateBookmarkSpecificsMetaInfo(node->GetMetaInfoMap(), bm_specifics);
}
if (!force_favicon_load && !node->is_favicon_loaded()) {
return specifics;
}
// Encodes a bookmark's favicon into raw PNG data. // Encodes a bookmark's favicon into raw PNG data.
scoped_refptr<base::RefCountedMemory> favicon_bytes(nullptr); scoped_refptr<base::RefCountedMemory> favicon_bytes(nullptr);
const gfx::Image& favicon = model->GetFavicon(node); const gfx::Image& favicon = model->GetFavicon(node);
...@@ -122,9 +131,6 @@ sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode( ...@@ -122,9 +131,6 @@ sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode(
bm_specifics->clear_icon_url(); bm_specifics->clear_icon_url();
} }
if (node->GetMetaInfoMap()) {
UpdateBookmarkSpecificsMetaInfo(node->GetMetaInfoMap(), bm_specifics);
}
return specifics; return specifics;
} }
......
...@@ -23,7 +23,8 @@ namespace sync_bookmarks { ...@@ -23,7 +23,8 @@ namespace sync_bookmarks {
sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode( sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode(
const bookmarks::BookmarkNode* node, const bookmarks::BookmarkNode* node,
bookmarks::BookmarkModel* model); bookmarks::BookmarkModel* model,
bool force_favicon_load);
// Creates a bookmark node under the given parent node from the given specifics. // Creates a bookmark node under the given parent node from the given specifics.
// Returns the newly created node. Callers must verify that // Returns the newly created node. Callers must verify that
......
...@@ -6,7 +6,9 @@ ...@@ -6,7 +6,9 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility>
#include "base/macros.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_model.h"
...@@ -26,6 +28,29 @@ namespace sync_bookmarks { ...@@ -26,6 +28,29 @@ namespace sync_bookmarks {
namespace { namespace {
class TestBookmarkClientWithFaviconLoad : public bookmarks::TestBookmarkClient {
public:
TestBookmarkClientWithFaviconLoad() = default;
~TestBookmarkClientWithFaviconLoad() override = default;
base::CancelableTaskTracker::TaskId GetFaviconImageForPageURL(
const GURL& page_url,
favicon_base::IconType type,
const favicon_base::FaviconImageCallback& callback,
base::CancelableTaskTracker* tracker) override {
++load_favicon_requests;
return TestBookmarkClient::GetFaviconImageForPageURL(page_url, type,
callback, tracker);
}
int GetLoadFaviconRequestsForTest() { return load_favicon_requests; }
private:
int load_favicon_requests = 0;
DISALLOW_COPY_AND_ASSIGN(TestBookmarkClientWithFaviconLoad);
};
TEST(BookmarkSpecificsConversionsTest, ShouldCreateSpecificsFromBookmarkNode) { TEST(BookmarkSpecificsConversionsTest, ShouldCreateSpecificsFromBookmarkNode) {
const GURL kUrl("http://www.url.com"); const GURL kUrl("http://www.url.com");
const std::string kTitle = "Title"; const std::string kTitle = "Title";
...@@ -41,14 +66,14 @@ TEST(BookmarkSpecificsConversionsTest, ShouldCreateSpecificsFromBookmarkNode) { ...@@ -41,14 +66,14 @@ TEST(BookmarkSpecificsConversionsTest, ShouldCreateSpecificsFromBookmarkNode) {
const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node(); const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node();
const bookmarks::BookmarkNode* node = model->AddURL( const bookmarks::BookmarkNode* node = model->AddURL(
/*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle), /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle),
GURL(kUrl)); kUrl);
ASSERT_THAT(node, NotNull()); ASSERT_THAT(node, NotNull());
model->SetDateAdded(node, kTime); model->SetDateAdded(node, kTime);
model->SetNodeMetaInfo(node, kKey1, kValue1); model->SetNodeMetaInfo(node, kKey1, kValue1);
model->SetNodeMetaInfo(node, kKey2, kValue2); model->SetNodeMetaInfo(node, kKey2, kValue2);
sync_pb::EntitySpecifics specifics = sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode(
CreateSpecificsFromBookmarkNode(node, model.get()); node, model.get(), /*force_favicon_load=*/false);
const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark(); const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark();
EXPECT_THAT(bm_specifics.title(), Eq(kTitle)); EXPECT_THAT(bm_specifics.title(), Eq(kTitle));
EXPECT_THAT(GURL(bm_specifics.url()), Eq(kUrl)); EXPECT_THAT(GURL(bm_specifics.url()), Eq(kUrl));
...@@ -72,12 +97,54 @@ TEST(BookmarkSpecificsConversionsTest, ...@@ -72,12 +97,54 @@ TEST(BookmarkSpecificsConversionsTest,
/*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16("Title")); /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16("Title"));
ASSERT_THAT(node, NotNull()); ASSERT_THAT(node, NotNull());
sync_pb::EntitySpecifics specifics = sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode(
CreateSpecificsFromBookmarkNode(node, model.get()); node, model.get(), /*force_favicon_load=*/false);
const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark(); const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark();
EXPECT_FALSE(bm_specifics.has_url()); EXPECT_FALSE(bm_specifics.has_url());
} }
TEST(BookmarkSpecificsConversionsTest,
ShouldLoadFaviconWhenCreatingSpecificsFromBookmarkNode) {
auto client = std::make_unique<TestBookmarkClientWithFaviconLoad>();
TestBookmarkClientWithFaviconLoad* client_ptr = client.get();
std::unique_ptr<bookmarks::BookmarkModel> model =
TestBookmarkClientWithFaviconLoad::CreateModelWithClient(
std::move(client));
const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node();
const bookmarks::BookmarkNode* node = model->AddURL(
/*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16("Title"),
GURL("http://www.url.com"));
ASSERT_THAT(node, NotNull());
ASSERT_FALSE(node->is_favicon_loaded());
ASSERT_THAT(client_ptr->GetLoadFaviconRequestsForTest(), Eq(0));
sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode(
node, model.get(), /*force_favicon_load=*/true);
EXPECT_THAT(client_ptr->GetLoadFaviconRequestsForTest(), Eq(1));
}
TEST(BookmarkSpecificsConversionsTest,
ShouldNotLoadFaviconWhenCreatingSpecificsFromBookmarkNode) {
auto client = std::make_unique<TestBookmarkClientWithFaviconLoad>();
TestBookmarkClientWithFaviconLoad* client_ptr = client.get();
std::unique_ptr<bookmarks::BookmarkModel> model =
TestBookmarkClientWithFaviconLoad::CreateModelWithClient(
std::move(client));
const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node();
const bookmarks::BookmarkNode* node = model->AddURL(
/*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16("Title"),
GURL("http://www.url.com"));
ASSERT_THAT(node, NotNull());
ASSERT_FALSE(node->is_favicon_loaded());
ASSERT_THAT(client_ptr->GetLoadFaviconRequestsForTest(), Eq(0));
sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode(
node, model.get(), /*force_favicon_load=*/false);
EXPECT_THAT(client_ptr->GetLoadFaviconRequestsForTest(), Eq(0));
}
TEST(BookmarkSpecificsConversionsTest, ShouldCreateBookmarkNodeFromSpecifics) { TEST(BookmarkSpecificsConversionsTest, ShouldCreateBookmarkNodeFromSpecifics) {
const GURL kUrl("http://www.url.com"); const GURL kUrl("http://www.url.com");
const std::string kTitle = "Title"; const std::string kTitle = "Title";
......
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