From e3414b5d6bcfb3bed3964e80bbfd95f873d2c35c Mon Sep 17 00:00:00 2001 From: uazo <29201891+uazo@users.noreply.github.com> Date: Tue, 25 May 2021 20:58:03 +0200 Subject: [PATCH] fix saving tabs bookmarks folder (#1166) --- .../Add-menu-item-to-bookmark-all-tabs.patch | 171 +++++++++++++++++- 1 file changed, 169 insertions(+), 2 deletions(-) diff --git a/build/patches/Add-menu-item-to-bookmark-all-tabs.patch b/build/patches/Add-menu-item-to-bookmark-all-tabs.patch index ce1d0646..977c2010 100644 --- a/build/patches/Add-menu-item-to-bookmark-all-tabs.patch +++ b/build/patches/Add-menu-item-to-bookmark-all-tabs.patch @@ -12,13 +12,16 @@ Subject: Add menu item to bookmark all tabs .../bookmarks/chrome_bookmark_client.cc | 2 + .../strings/android_chrome_strings.grd | 3 + components/bookmark_bar_strings.grdp | 6 ++ + .../bookmarks/browser/bookmark_codec.cc | 24 ++++++-- + components/bookmarks/browser/bookmark_codec.h | 7 ++- .../browser/bookmark_load_details.cc | 4 ++ .../bookmarks/browser/bookmark_load_details.h | 2 + .../bookmarks/browser/bookmark_model.cc | 3 +- components/bookmarks/browser/bookmark_model.h | 7 +++ components/bookmarks/browser/bookmark_node.cc | 13 ++++ components/bookmarks/browser/bookmark_node.h | 5 ++ - 15 files changed, 163 insertions(+), 1 deletion(-) + components/bookmarks/browser/model_loader.cc | 3 +- + 18 files changed, 191 insertions(+), 7 deletions(-) diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml --- a/chrome/android/java/res/menu/main_menu.xml @@ -79,7 +82,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct + + final BookmarkBridge bridge = mBookmarkBridgeSupplier.get(); + final BookmarkModel bookmarkModel = new BookmarkModel(); -+ bookmarkModel.finishLoadingBookmarkModel(() -> { ++ bookmarkModel.finishLoadingBookmarkModel(() -> { + for (int i = 0; i < tabModel.getCount(); i++) { + Tab tab = tabModel.getTabAt(i); + if (tab.isNativePage()) { @@ -331,6 +334,157 @@ diff --git a/components/bookmark_bar_strings.grdp b/components/bookmark_bar_stri Other Bookmarks +diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmarks/browser/bookmark_codec.cc +--- a/components/bookmarks/browser/bookmark_codec.cc ++++ b/components/bookmarks/browser/bookmark_codec.cc +@@ -32,6 +32,7 @@ const char BookmarkCodec::kRootFolderNameKey[] = "bookmark_bar"; + const char BookmarkCodec::kOtherBookmarkFolderNameKey[] = "other"; + // The value is left as 'synced' for historical reasons. + const char BookmarkCodec::kMobileBookmarkFolderNameKey[] = "synced"; ++const char BookmarkCodec::kTabsBookmarkFolderNameKey[] = "tabs"; + const char BookmarkCodec::kVersionKey[] = "version"; + const char BookmarkCodec::kChecksumKey[] = "checksum"; + const char BookmarkCodec::kIdKey[] = "id"; +@@ -62,7 +63,8 @@ std::unique_ptr BookmarkCodec::Encode( + BookmarkModel* model, + const std::string& sync_metadata_str) { + return Encode(model->bookmark_bar_node(), model->other_node(), +- model->mobile_node(), model->root_node()->GetMetaInfoMap(), ++ model->mobile_node(), model->tabs_collection_node(), ++ model->root_node()->GetMetaInfoMap(), + sync_metadata_str); + } + +@@ -70,6 +72,7 @@ std::unique_ptr BookmarkCodec::Encode( + const BookmarkNode* bookmark_bar_node, + const BookmarkNode* other_folder_node, + const BookmarkNode* mobile_folder_node, ++ const BookmarkNode* tabs_folder_node, + const BookmarkNode::MetaInfoMap* model_meta_info_map, + const std::string& sync_metadata_str) { + ids_reassigned_ = false; +@@ -79,6 +82,7 @@ std::unique_ptr BookmarkCodec::Encode( + roots->Set(kRootFolderNameKey, EncodeNode(bookmark_bar_node)); + roots->Set(kOtherBookmarkFolderNameKey, EncodeNode(other_folder_node)); + roots->Set(kMobileBookmarkFolderNameKey, EncodeNode(mobile_folder_node)); ++ roots->Set(kTabsBookmarkFolderNameKey, EncodeNode(tabs_folder_node)); + if (model_meta_info_map) + roots->Set(kMetaInfo, EncodeMetaInfo(*model_meta_info_map)); + auto main = std::make_unique(); +@@ -102,6 +106,7 @@ bool BookmarkCodec::Decode(const base::Value& value, + BookmarkNode* bb_node, + BookmarkNode* other_folder_node, + BookmarkNode* mobile_folder_node, ++ BookmarkNode* tabs_folder_node, + int64_t* max_id, + std::string* sync_metadata_str) { + ids_.clear(); +@@ -109,7 +114,8 @@ bool BookmarkCodec::Decode(const base::Value& value, + base::GUID::ParseLowercase(BookmarkNode::kBookmarkBarNodeGuid), + base::GUID::ParseLowercase(BookmarkNode::kOtherBookmarksNodeGuid), + base::GUID::ParseLowercase(BookmarkNode::kMobileBookmarksNodeGuid), +- base::GUID::ParseLowercase(BookmarkNode::kManagedNodeGuid)}; ++ base::GUID::ParseLowercase(BookmarkNode::kManagedNodeGuid), ++ base::GUID::ParseLowercase(BookmarkNode::kTabsCollectionBookmarksNodeGuid)}; + ids_reassigned_ = false; + guids_reassigned_ = false; + ids_valid_ = true; +@@ -117,12 +123,13 @@ bool BookmarkCodec::Decode(const base::Value& value, + stored_checksum_.clear(); + InitializeChecksum(); + bool success = DecodeHelper(bb_node, other_folder_node, mobile_folder_node, ++ tabs_folder_node, + value, sync_metadata_str); + FinalizeChecksum(); + // If either the checksums differ or some IDs were missing/not unique, + // reassign IDs. + if (!ids_valid_ || computed_checksum() != stored_checksum()) +- ReassignIDs(bb_node, other_folder_node, mobile_folder_node); ++ ReassignIDs(bb_node, other_folder_node, mobile_folder_node, tabs_folder_node); + *max_id = maximum_id_ + 1; + return success; + } +@@ -173,6 +180,7 @@ std::unique_ptr BookmarkCodec::EncodeMetaInfo( + bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node, + BookmarkNode* other_folder_node, + BookmarkNode* mobile_folder_node, ++ BookmarkNode* tabs_folder_node, + const base::Value& value, + std::string* sync_metadata_str) { + const base::DictionaryValue* d_value = nullptr; +@@ -212,6 +220,12 @@ bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node, + DecodeNode(*root_folder_d_value, nullptr, bb_node); + DecodeNode(*other_folder_d_value, nullptr, other_folder_node); + ++ const base::Value* tabs_folder_value; ++ const base::DictionaryValue* tabs_folder_d_value = nullptr; ++ if (roots_d_value->Get(kTabsBookmarkFolderNameKey, &tabs_folder_value) && ++ tabs_folder_value->GetAsDictionary(&tabs_folder_d_value)) ++ DecodeNode(*tabs_folder_d_value, nullptr, tabs_folder_node); ++ + // Fail silently if we can't deserialize mobile bookmarks. We can't require + // them to exist in order to be backwards-compatible with older versions of + // chrome. +@@ -457,11 +471,13 @@ void BookmarkCodec::DecodeMetaInfoHelper( + + void BookmarkCodec::ReassignIDs(BookmarkNode* bb_node, + BookmarkNode* other_node, +- BookmarkNode* mobile_node) { ++ BookmarkNode* mobile_node, ++ BookmarkNode* tabs_folder_node) { + maximum_id_ = 0; + ReassignIDsHelper(bb_node); + ReassignIDsHelper(other_node); + ReassignIDsHelper(mobile_node); ++ ReassignIDsHelper(tabs_folder_node); + ids_reassigned_ = true; + } + +diff --git a/components/bookmarks/browser/bookmark_codec.h b/components/bookmarks/browser/bookmark_codec.h +--- a/components/bookmarks/browser/bookmark_codec.h ++++ b/components/bookmarks/browser/bookmark_codec.h +@@ -50,6 +50,7 @@ class BookmarkCodec { + const BookmarkNode* bookmark_bar_node, + const BookmarkNode* other_folder_node, + const BookmarkNode* mobile_folder_node, ++ const BookmarkNode* tabs_folder_node, + const BookmarkNode::MetaInfoMap* model_meta_info_map, + const std::string& sync_metadata_str); + +@@ -62,6 +63,7 @@ class BookmarkCodec { + BookmarkNode* bb_node, + BookmarkNode* other_folder_node, + BookmarkNode* mobile_folder_node, ++ BookmarkNode* tabs_folder_node, + int64_t* max_node_id, + std::string* sync_metadata_str); + +@@ -107,6 +109,7 @@ class BookmarkCodec { + // Allows the BookmarkClient to read and a write a string blob from the JSON + // file. That string captures the bookmarks sync metadata. + static const char kSyncMetadata[]; ++ static const char kTabsBookmarkFolderNameKey[]; + + // Possible values for kTypeKey. + static const char kTypeURL[]; +@@ -124,6 +127,7 @@ class BookmarkCodec { + bool DecodeHelper(BookmarkNode* bb_node, + BookmarkNode* other_folder_node, + BookmarkNode* mobile_folder_node, ++ BookmarkNode* tabs_folder_node, + const base::Value& value, + std::string* sync_metadata_str); + +@@ -134,7 +138,8 @@ class BookmarkCodec { + // Reassigns bookmark IDs for all nodes. + void ReassignIDs(BookmarkNode* bb_node, + BookmarkNode* other_node, +- BookmarkNode* mobile_node); ++ BookmarkNode* mobile_node, ++ BookmarkNode* tabs_folder_node); + + // Helper to recursively reassign IDs. + void ReassignIDsHelper(BookmarkNode* node); diff --git a/components/bookmarks/browser/bookmark_load_details.cc b/components/bookmarks/browser/bookmark_load_details.cc --- a/components/bookmarks/browser/bookmark_load_details.cc +++ b/components/bookmarks/browser/bookmark_load_details.cc @@ -467,6 +621,19 @@ diff --git a/components/bookmarks/browser/bookmark_node.h b/components/bookmarks // Constructor is private to disallow the construction of permanent nodes // other than the well-known ones, see factory methods. +diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc +--- a/components/bookmarks/browser/model_loader.cc ++++ b/components/bookmarks/browser/model_loader.cc +@@ -54,7 +54,8 @@ void LoadBookmarks(const base::FilePath& path, + std::string sync_metadata_str; + BookmarkCodec codec; + codec.Decode(*root, details->bb_node(), details->other_folder_node(), +- details->mobile_folder_node(), &max_node_id, ++ details->mobile_folder_node(), ++ details->tabs_collection_folder_node(), &max_node_id, + &sync_metadata_str); + details->set_sync_metadata_str(std::move(sync_metadata_str)); + details->set_max_id(std::max(max_node_id, details->max_id())); -- 2.17.1