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..521c383c7a4268b1451e159db48aa01be3c3fc0b |
--- /dev/null |
+++ b/components/bookmarks/managed/managed_bookmark_service.cc |
@@ -0,0 +1,174 @@ |
+// 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/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 { |
+ |
+// Initializes |node| from |initial_bookmarks| and |title_id| and returns it. |
+// The ids are assigned starting at |next_node_id| value and the value is |
+// updated as a side effect. |
+scoped_ptr<BookmarkPermanentNode> LoadNodeInitialContent( |
+ scoped_ptr<BookmarkPermanentNode> node, |
+ scoped_ptr<base::ListValue> initial_bookmarks, |
+ int title_id, |
+ int64* next_node_id) { |
+ // Load the initial contents of |node| now and assign it an unused 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(); |
+} |
+ |
+// BookmarkPermanentNodeLoader is a closure that returns initialized |
+// BookmarkPermanentNode when passed a mutable pointer to the next node id to |
+// use. |
+typedef base::Callback<scoped_ptr<BookmarkPermanentNode>(int64*)> |
+ 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( |
+ scoped_ptr<std::vector<BookmarkPermanentNodeLoader>> loaders, |
+ int64* next_node_id) { |
+ BookmarkPermanentNodeList extra_nodes; |
+ for (const auto& loader : *loaders.get()) { |
sky
2015/07/20 15:53:19
nit: no {}
sdefresne
2015/07/20 17:43:40
Done.
|
+ extra_nodes.push_back(loader.Run(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(); |
+ |
+ scoped_ptr<std::vector<BookmarkPermanentNodeLoader>> loaders( |
+ new std::vector<BookmarkPermanentNodeLoader>()); |
+ loaders->push_back(base::Bind( |
+ &LoadNodeInitialContent, base::Passed(&managed), |
sky
2015/07/20 15:53:20
As you always call LoadNodeInitialContext is there
sdefresne
2015/07/20 17:43:40
I've used objects instead. Is it clearer now?
sky
2015/07/20 20:10:56
Yes, thanks!
|
+ base::Passed(managed_bookmarks_tracker_->GetInitialManagedBookmarks()), |
+ IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME)); |
+ loaders->push_back(base::Bind( |
+ &LoadNodeInitialContent, base::Passed(&supervised), |
+ base::Passed(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 |