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 5 #include "components/bookmarks/browser/bookmark_expanded_state_tracker.h" 6 7 #include "base/prefs/pref_service.h" 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 14 namespace bookmarks { 15 16 BookmarkExpandedStateTracker::BookmarkExpandedStateTracker( 17 BookmarkModel* bookmark_model, 18 PrefService* pref_service) 19 : bookmark_model_(bookmark_model), 20 pref_service_(pref_service) { 21 bookmark_model->AddObserver(this); 22 } 23 24 BookmarkExpandedStateTracker::~BookmarkExpandedStateTracker() { 25 } 26 27 void BookmarkExpandedStateTracker::SetExpandedNodes(const Nodes& nodes) { 28 UpdatePrefs(nodes); 29 } 30 31 BookmarkExpandedStateTracker::Nodes 32 BookmarkExpandedStateTracker::GetExpandedNodes() { 33 Nodes nodes; 34 if (!bookmark_model_->loaded()) 35 return nodes; 36 37 if (!pref_service_) 38 return nodes; 39 40 const base::ListValue* value = 41 pref_service_->GetList(prefs::kBookmarkEditorExpandedNodes); 42 if (!value) 43 return nodes; 44 45 bool changed = false; 46 for (base::ListValue::const_iterator i = value->begin(); 47 i != value->end(); ++i) { 48 std::string value; 49 int64 node_id; 50 const BookmarkNode* node; 51 if ((*i)->GetAsString(&value) && base::StringToInt64(value, &node_id) && 52 (node = GetBookmarkNodeByID(bookmark_model_, node_id)) != NULL && 53 node->is_folder()) { 54 nodes.insert(node); 55 } else { 56 changed = true; 57 } 58 } 59 if (changed) 60 UpdatePrefs(nodes); 61 return nodes; 62 } 63 64 void BookmarkExpandedStateTracker::BookmarkModelLoaded(BookmarkModel* model, 65 bool ids_reassigned) { 66 if (ids_reassigned) { 67 // If the ids change we can't trust the value in preferences and need to 68 // reset it. 69 SetExpandedNodes(Nodes()); 70 } 71 } 72 73 void BookmarkExpandedStateTracker::BookmarkModelChanged() { 74 } 75 76 void BookmarkExpandedStateTracker::BookmarkModelBeingDeleted( 77 BookmarkModel* model) { 78 model->RemoveObserver(this); 79 } 80 81 void BookmarkExpandedStateTracker::BookmarkNodeRemoved( 82 BookmarkModel* model, 83 const BookmarkNode* parent, 84 int old_index, 85 const BookmarkNode* node, 86 const std::set<GURL>& removed_urls) { 87 if (!node->is_folder()) 88 return; // Only care about folders. 89 90 // Ask for the nodes again, which removes any nodes that were deleted. 91 GetExpandedNodes(); 92 } 93 94 void BookmarkExpandedStateTracker::BookmarkAllUserNodesRemoved( 95 BookmarkModel* model, 96 const std::set<GURL>& removed_urls) { 97 // Ask for the nodes again, which removes any nodes that were deleted. 98 GetExpandedNodes(); 99 } 100 101 void BookmarkExpandedStateTracker::UpdatePrefs(const Nodes& nodes) { 102 if (!pref_service_) 103 return; 104 105 base::ListValue values; 106 for (Nodes::const_iterator i = nodes.begin(); i != nodes.end(); ++i) { 107 values.Set(values.GetSize(), 108 new base::StringValue(base::Int64ToString((*i)->id()))); 109 } 110 111 pref_service_->Set(prefs::kBookmarkEditorExpandedNodes, values); 112 } 113 114 } // namespace bookmarks 115