bookmark_expanded_state_tracker.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/bookmarks/browser/bookmark_expanded_state_tracker.h"
  5. #include <stdint.h>
  6. #include <utility>
  7. #include <vector>
  8. #include "base/strings/string_number_conversions.h"
  9. #include "base/values.h"
  10. #include "components/bookmarks/browser/bookmark_model.h"
  11. #include "components/bookmarks/browser/bookmark_utils.h"
  12. #include "components/bookmarks/common/bookmark_pref_names.h"
  13. #include "components/prefs/pref_service.h"
  14. namespace bookmarks {
  15. BookmarkExpandedStateTracker::BookmarkExpandedStateTracker(
  16. BookmarkModel* bookmark_model,
  17. PrefService* pref_service)
  18. : bookmark_model_(bookmark_model),
  19. pref_service_(pref_service) {
  20. bookmark_model->AddObserver(this);
  21. }
  22. BookmarkExpandedStateTracker::~BookmarkExpandedStateTracker() {
  23. }
  24. void BookmarkExpandedStateTracker::SetExpandedNodes(const Nodes& nodes) {
  25. UpdatePrefs(nodes);
  26. }
  27. BookmarkExpandedStateTracker::Nodes
  28. BookmarkExpandedStateTracker::GetExpandedNodes() {
  29. Nodes nodes;
  30. if (!bookmark_model_->loaded())
  31. return nodes;
  32. if (!pref_service_)
  33. return nodes;
  34. const base::Value::List& value =
  35. pref_service_->GetValueList(prefs::kBookmarkEditorExpandedNodes);
  36. bool changed = false;
  37. for (const auto& entry : value) {
  38. int64_t node_id;
  39. const BookmarkNode* node;
  40. const std::string* value_str = entry.GetIfString();
  41. if (value_str && base::StringToInt64(*value_str, &node_id) &&
  42. (node = GetBookmarkNodeByID(bookmark_model_, node_id)) != nullptr &&
  43. node->is_folder()) {
  44. nodes.insert(node);
  45. } else {
  46. changed = true;
  47. }
  48. }
  49. if (changed)
  50. UpdatePrefs(nodes);
  51. return nodes;
  52. }
  53. void BookmarkExpandedStateTracker::BookmarkModelLoaded(BookmarkModel* model,
  54. bool ids_reassigned) {
  55. if (ids_reassigned) {
  56. // If the ids change we can't trust the value in preferences and need to
  57. // reset it.
  58. SetExpandedNodes(Nodes());
  59. }
  60. }
  61. void BookmarkExpandedStateTracker::BookmarkModelChanged() {
  62. }
  63. void BookmarkExpandedStateTracker::BookmarkModelBeingDeleted(
  64. BookmarkModel* model) {
  65. model->RemoveObserver(this);
  66. }
  67. void BookmarkExpandedStateTracker::BookmarkNodeRemoved(
  68. BookmarkModel* model,
  69. const BookmarkNode* parent,
  70. size_t old_index,
  71. const BookmarkNode* node,
  72. const std::set<GURL>& removed_urls) {
  73. if (!node->is_folder())
  74. return; // Only care about folders.
  75. // Ask for the nodes again, which removes any nodes that were deleted.
  76. GetExpandedNodes();
  77. }
  78. void BookmarkExpandedStateTracker::BookmarkAllUserNodesRemoved(
  79. BookmarkModel* model,
  80. const std::set<GURL>& removed_urls) {
  81. // Ask for the nodes again, which removes any nodes that were deleted.
  82. GetExpandedNodes();
  83. }
  84. void BookmarkExpandedStateTracker::UpdatePrefs(const Nodes& nodes) {
  85. if (!pref_service_)
  86. return;
  87. base::Value::List values;
  88. values.reserve(nodes.size());
  89. for (const auto* node : nodes) {
  90. values.Append(base::NumberToString(node->id()));
  91. }
  92. pref_service_->SetList(prefs::kBookmarkEditorExpandedNodes,
  93. std::move(values));
  94. }
  95. } // namespace bookmarks