Index: components/bookmarks/managed/managed_bookmark_service.cc |
diff --git a/components/bookmarks/managed/managed_bookmark_service.cc b/components/bookmarks/managed/managed_bookmark_service.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..acf63ad4e76761e925149e30701ccf460cfe3960 |
--- /dev/null |
+++ b/components/bookmarks/managed/managed_bookmark_service.cc |
@@ -0,0 +1,183 @@ |
+// Copyright 2015 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/managed/managed_bookmark_service.h" |
+ |
+#include <stdlib.h> |
+#include <vector> |
+ |
+#include "base/bind.h" |
+#include "base/callback.h" |
+#include "base/logging.h" |
+#include "base/macros.h" |
+#include "base/memory/scoped_vector.h" |
+#include "base/strings/string16.h" |
+#include "base/values.h" |
+#include "components/bookmarks/browser/bookmark_model.h" |
+#include "components/bookmarks/browser/bookmark_utils.h" |
+#include "components/bookmarks/managed/managed_bookmarks_tracker.h" |
+#include "grit/components_strings.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+namespace bookmarks { |
+namespace { |
+ |
+// BookmarkPermanentNodeLoader initializes a BookmarkPermanentNode from a JSON |
+// representation, title id and starting node id. |
+class BookmarkPermanentNodeLoader { |
+ public: |
+ BookmarkPermanentNodeLoader(scoped_ptr<BookmarkPermanentNode> node, |
+ scoped_ptr<base::ListValue> initial_bookmarks, |
+ int title_id) |
+ : node_(node.Pass()), |
+ initial_bookmarks_(initial_bookmarks.Pass()), |
+ title_id_(title_id) { |
+ DCHECK(node_); |
+ } |
+ |
+ ~BookmarkPermanentNodeLoader() {} |
+ |
+ // Initializes |node_| from |initial_bookmarks_| and |title_id_| and returns |
+ // it. The ids are assigned starting at |next_node_id| and the value is |
+ // updated as a side-effect. |
+ scoped_ptr<BookmarkPermanentNode> Load(int64* next_node_id) { |
+ node_->set_id(*next_node_id); |
+ *next_node_id = ManagedBookmarksTracker::LoadInitial( |
+ node_.get(), initial_bookmarks_.get(), node_->id() + 1); |
+ node_->set_visible(!node_->empty()); |
+ node_->SetTitle(l10n_util::GetStringUTF16(title_id_)); |
+ return node_.Pass(); |
+ } |
+ |
+ private: |
+ scoped_ptr<BookmarkPermanentNode> node_; |
+ scoped_ptr<base::ListValue> initial_bookmarks_; |
+ int title_id_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BookmarkPermanentNodeLoader); |
+}; |
+ |
+// Returns a list of initialized BookmarkPermanentNodes using |next_node_id| to |
+// start assigning id. |next_node_id| is updated as a side effect of calling |
+// this method. |
+BookmarkPermanentNodeList LoadExtraNodes( |
+ ScopedVector<BookmarkPermanentNodeLoader> loaders, |
+ int64* next_node_id) { |
+ BookmarkPermanentNodeList extra_nodes; |
+ for (const auto& loader : loaders) |
+ extra_nodes.push_back(loader->Load(next_node_id).release()); |
+ return extra_nodes.Pass(); |
+} |
+ |
+} // namespace |
+ |
+ManagedBookmarkService::ManagedBookmarkService( |
+ PrefService* prefs, |
+ const GetManagementDomainCallback& callback) |
+ : prefs_(prefs), |
+ bookmark_model_(nullptr), |
+ managed_domain_callback_(callback), |
+ managed_node_(nullptr), |
+ supervised_node_(nullptr) {} |
+ |
+ManagedBookmarkService::~ManagedBookmarkService() { |
+ DCHECK(!bookmark_model_); |
+} |
+ |
+void ManagedBookmarkService::BookmarkModelCreated( |
+ BookmarkModel* bookmark_model) { |
+ DCHECK(bookmark_model); |
+ DCHECK(!bookmark_model_); |
+ bookmark_model_ = bookmark_model; |
+ bookmark_model_->AddObserver(this); |
+ |
+ managed_bookmarks_tracker_.reset(new ManagedBookmarksTracker( |
+ bookmark_model_, prefs_, false /* is_supervised */, |
+ managed_domain_callback_)); |
+ |
+ GetManagementDomainCallback unbound_callback; |
+ supervised_bookmarks_tracker_.reset(new ManagedBookmarksTracker( |
+ bookmark_model_, prefs_, true /* is_supervised */, unbound_callback)); |
+} |
+ |
+LoadExtraCallback ManagedBookmarkService::GetLoadExtraNodesCallback() { |
+ // Create two BookmarkPermanentNode with a temporary id of 0. They will be |
+ // populated and assigned proper ids in the LoadExtraNodes callback. Until |
+ // then, they are owned by the returned closure. |
+ scoped_ptr<BookmarkPermanentNode> managed(new BookmarkPermanentNode(0)); |
+ scoped_ptr<BookmarkPermanentNode> supervised(new BookmarkPermanentNode(0)); |
+ |
+ managed_node_ = managed.get(); |
+ supervised_node_ = supervised.get(); |
+ |
+ ScopedVector<BookmarkPermanentNodeLoader> loaders; |
+ loaders.push_back(new BookmarkPermanentNodeLoader( |
+ managed.Pass(), managed_bookmarks_tracker_->GetInitialManagedBookmarks(), |
+ IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME)); |
+ loaders.push_back(new BookmarkPermanentNodeLoader( |
+ supervised.Pass(), |
+ supervised_bookmarks_tracker_->GetInitialManagedBookmarks(), |
+ IDS_BOOKMARK_BAR_SUPERVISED_FOLDER_DEFAULT_NAME)); |
+ |
+ return base::Bind(&LoadExtraNodes, base::Passed(&loaders)); |
+} |
+ |
+bool ManagedBookmarkService::CanSetPermanentNodeTitle( |
+ const BookmarkNode* node) { |
+ // |managed_node_| can have its title updated if the user signs in or out, |
+ // since the name of the managed domain can appear in it. Also both |
+ // |managed_node_| and |supervised_node_| can have their title updated on |
+ // locale changes (http://crbug.com/459448). |
+ if (node == managed_node_ || node == supervised_node_) |
+ return true; |
+ return !IsDescendantOf(node, managed_node_) && |
+ !IsDescendantOf(node, supervised_node_); |
+} |
+ |
+bool ManagedBookmarkService::CanSyncNode(const BookmarkNode* node) { |
+ return !IsDescendantOf(node, managed_node_) && |
+ !IsDescendantOf(node, supervised_node_); |
+} |
+ |
+bool ManagedBookmarkService::CanBeEditedByUser(const BookmarkNode* node) { |
+ return !IsDescendantOf(node, managed_node_) && |
+ !IsDescendantOf(node, supervised_node_); |
+} |
+ |
+void ManagedBookmarkService::Shutdown() { |
+ Cleanup(); |
+} |
+ |
+void ManagedBookmarkService::BookmarkModelChanged() {} |
+ |
+void ManagedBookmarkService::BookmarkModelLoaded(BookmarkModel* bookmark_model, |
+ bool ids_reassigned) { |
+ BaseBookmarkModelObserver::BookmarkModelLoaded(bookmark_model, |
+ ids_reassigned); |
+ // Start tracking the managed and supervised bookmarks. This will detect any |
+ // changes that may have occurred while the initial managed and supervised |
+ // bookmarks were being loaded on the background. |
+ managed_bookmarks_tracker_->Init(managed_node_); |
+ supervised_bookmarks_tracker_->Init(supervised_node_); |
+} |
+ |
+void ManagedBookmarkService::BookmarkModelBeingDeleted( |
+ BookmarkModel* bookmark_model) { |
+ Cleanup(); |
+} |
+ |
+void ManagedBookmarkService::Cleanup() { |
+ if (bookmark_model_) { |
+ bookmark_model_->RemoveObserver(this); |
+ bookmark_model_ = nullptr; |
+ } |
+ |
+ managed_bookmarks_tracker_.reset(); |
+ supervised_bookmarks_tracker_.reset(); |
+ |
+ managed_node_ = nullptr; |
+ supervised_node_ = nullptr; |
+} |
+ |
+} // namespace bookmarks |