summaryrefslogtreecommitdiff
path: root/chromium/components/bookmarks/browser/bookmark_expanded_state_tracker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/bookmarks/browser/bookmark_expanded_state_tracker.cc')
-rw-r--r--chromium/components/bookmarks/browser/bookmark_expanded_state_tracker.cc116
1 files changed, 116 insertions, 0 deletions
diff --git a/chromium/components/bookmarks/browser/bookmark_expanded_state_tracker.cc b/chromium/components/bookmarks/browser/bookmark_expanded_state_tracker.cc
new file mode 100644
index 00000000000..427f2d3c446
--- /dev/null
+++ b/chromium/components/bookmarks/browser/bookmark_expanded_state_tracker.cc
@@ -0,0 +1,116 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/bookmarks/browser/bookmark_expanded_state_tracker.h"
+
+#include <stdint.h>
+
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "components/bookmarks/browser/bookmark_model.h"
+#include "components/bookmarks/browser/bookmark_utils.h"
+#include "components/bookmarks/common/bookmark_pref_names.h"
+#include "components/prefs/pref_service.h"
+
+namespace bookmarks {
+
+BookmarkExpandedStateTracker::BookmarkExpandedStateTracker(
+ BookmarkModel* bookmark_model,
+ PrefService* pref_service)
+ : bookmark_model_(bookmark_model),
+ pref_service_(pref_service) {
+ bookmark_model->AddObserver(this);
+}
+
+BookmarkExpandedStateTracker::~BookmarkExpandedStateTracker() {
+}
+
+void BookmarkExpandedStateTracker::SetExpandedNodes(const Nodes& nodes) {
+ UpdatePrefs(nodes);
+}
+
+BookmarkExpandedStateTracker::Nodes
+BookmarkExpandedStateTracker::GetExpandedNodes() {
+ Nodes nodes;
+ if (!bookmark_model_->loaded())
+ return nodes;
+
+ if (!pref_service_)
+ return nodes;
+
+ const base::ListValue* value =
+ pref_service_->GetList(prefs::kBookmarkEditorExpandedNodes);
+ if (!value)
+ return nodes;
+
+ bool changed = false;
+ for (base::ListValue::const_iterator i = value->begin();
+ i != value->end(); ++i) {
+ std::string value;
+ int64_t node_id;
+ const BookmarkNode* node;
+ if ((*i)->GetAsString(&value) && base::StringToInt64(value, &node_id) &&
+ (node = GetBookmarkNodeByID(bookmark_model_, node_id)) != NULL &&
+ node->is_folder()) {
+ nodes.insert(node);
+ } else {
+ changed = true;
+ }
+ }
+ if (changed)
+ UpdatePrefs(nodes);
+ return nodes;
+}
+
+void BookmarkExpandedStateTracker::BookmarkModelLoaded(BookmarkModel* model,
+ bool ids_reassigned) {
+ if (ids_reassigned) {
+ // If the ids change we can't trust the value in preferences and need to
+ // reset it.
+ SetExpandedNodes(Nodes());
+ }
+}
+
+void BookmarkExpandedStateTracker::BookmarkModelChanged() {
+}
+
+void BookmarkExpandedStateTracker::BookmarkModelBeingDeleted(
+ BookmarkModel* model) {
+ model->RemoveObserver(this);
+}
+
+void BookmarkExpandedStateTracker::BookmarkNodeRemoved(
+ BookmarkModel* model,
+ const BookmarkNode* parent,
+ int old_index,
+ const BookmarkNode* node,
+ const std::set<GURL>& removed_urls) {
+ if (!node->is_folder())
+ return; // Only care about folders.
+
+ // Ask for the nodes again, which removes any nodes that were deleted.
+ GetExpandedNodes();
+}
+
+void BookmarkExpandedStateTracker::BookmarkAllUserNodesRemoved(
+ BookmarkModel* model,
+ const std::set<GURL>& removed_urls) {
+ // Ask for the nodes again, which removes any nodes that were deleted.
+ GetExpandedNodes();
+}
+
+void BookmarkExpandedStateTracker::UpdatePrefs(const Nodes& nodes) {
+ if (!pref_service_)
+ return;
+
+ base::ListValue values;
+ for (Nodes::const_iterator i = nodes.begin(); i != nodes.end(); ++i) {
+ values.Set(values.GetSize(),
+ new base::StringValue(base::Int64ToString((*i)->id())));
+ }
+
+ pref_service_->Set(prefs::kBookmarkEditorExpandedNodes, values);
+}
+
+} // namespace bookmarks