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