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 14namespace bookmarks { 15 16BookmarkExpandedStateTracker::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 24BookmarkExpandedStateTracker::~BookmarkExpandedStateTracker() { 25} 26 27void BookmarkExpandedStateTracker::SetExpandedNodes(const Nodes& nodes) { 28 UpdatePrefs(nodes); 29} 30 31BookmarkExpandedStateTracker::Nodes 32BookmarkExpandedStateTracker::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 64void 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 73void BookmarkExpandedStateTracker::BookmarkModelChanged() { 74} 75 76void BookmarkExpandedStateTracker::BookmarkModelBeingDeleted( 77 BookmarkModel* model) { 78 model->RemoveObserver(this); 79} 80 81void 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 94void 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 101void 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