Index: chrome/browser/bookmarks/chrome_bookmark_client.cc |
diff --git a/chrome/browser/bookmarks/chrome_bookmark_client.cc b/chrome/browser/bookmarks/chrome_bookmark_client.cc |
index e601cd40cecade1c1134807da64794470d76f4bf..55a60bd6c05107d2515f6ced505cd55bf79a4b44 100644 |
--- a/chrome/browser/bookmarks/chrome_bookmark_client.cc |
+++ b/chrome/browser/bookmarks/chrome_bookmark_client.cc |
@@ -5,7 +5,9 @@ |
#include "chrome/browser/bookmarks/chrome_bookmark_client.h" |
#include "base/bind.h" |
+#include "base/bind_helpers.h" |
#include "base/logging.h" |
+#include "base/values.h" |
#include "chrome/browser/chrome_notification_types.h" |
#include "chrome/browser/favicon/favicon_changed_details.h" |
#include "chrome/browser/favicon/favicon_service.h" |
@@ -13,12 +15,20 @@ |
#include "chrome/browser/history/history_service.h" |
#include "chrome/browser/history/history_service_factory.h" |
#include "chrome/browser/history/url_database.h" |
+#include "chrome/browser/policy/profile_policy_connector.h" |
+#include "chrome/browser/policy/profile_policy_connector_factory.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/profiles/startup_task_runner_service.h" |
+#include "chrome/browser/profiles/startup_task_runner_service_factory.h" |
#include "components/bookmarks/browser/bookmark_model.h" |
#include "components/bookmarks/browser/bookmark_node.h" |
+#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/notification_details.h" |
#include "content/public/browser/notification_source.h" |
#include "content/public/browser/user_metrics.h" |
+#include "grit/components_strings.h" |
+#include "policy/policy_constants.h" |
+#include "ui/base/l10n/l10n_util.h" |
namespace { |
@@ -34,7 +44,13 @@ void NotifyHistoryOfRemovedURLs(Profile* profile, |
ChromeBookmarkClient::ChromeBookmarkClient(Profile* profile, bool index_urls) |
: profile_(profile), |
- model_(new BookmarkModel(this, index_urls)) { |
+ model_(new BookmarkModel(this, index_urls)), |
+ managed_bookmarks_tracker_( |
+ model_.get(), |
+ profile_->GetPrefs(), |
+ base::Bind(&ChromeBookmarkClient::GetManagedBookmarksDomain, |
+ base::Unretained(this))), |
+ managed_node_(NULL) { |
model_->AddObserver(this); |
// Listen for changes to favicons so that we can update the favicon of the |
// node appropriately. |
@@ -49,6 +65,10 @@ ChromeBookmarkClient::~ChromeBookmarkClient() { |
registrar_.RemoveAll(); |
} |
+bool ChromeBookmarkClient::IsDescendantOfManagedNode(const BookmarkNode* node) { |
+ return node && node->HasAncestor(managed_node_); |
+} |
+ |
bool ChromeBookmarkClient::PreferTouchIcon() { |
#if !defined(OS_IOS) |
return false; |
@@ -104,7 +124,10 @@ bool ChromeBookmarkClient::IsPermanentNodeVisible( |
const BookmarkPermanentNode* node) { |
DCHECK(node->type() == BookmarkNode::BOOKMARK_BAR || |
node->type() == BookmarkNode::OTHER_NODE || |
- node->type() == BookmarkNode::MOBILE); |
+ node->type() == BookmarkNode::MOBILE || |
+ node == managed_node_); |
+ if (node == managed_node_) |
+ return false; |
#if !defined(OS_IOS) |
return node->type() != BookmarkNode::MOBILE; |
#else |
@@ -117,25 +140,36 @@ void ChromeBookmarkClient::RecordAction(const base::UserMetricsAction& action) { |
} |
bookmarks::LoadExtraCallback ChromeBookmarkClient::GetLoadExtraNodesCallback() { |
- return base::Bind(&ChromeBookmarkClient::LoadExtraNodes); |
+ // Create the managed_node now; it will be populated in the LoadExtraNodes |
+ // callback. |
+ managed_node_ = new BookmarkPermanentNode(0); |
+ return base::Bind( |
+ &ChromeBookmarkClient::LoadExtraNodes, |
+ StartupTaskRunnerServiceFactory::GetForProfile(profile_) |
+ ->GetBookmarkTaskRunner(), |
+ managed_node_, |
+ base::Passed(managed_bookmarks_tracker_.GetInitialManagedBookmarks())); |
} |
bool ChromeBookmarkClient::CanRemovePermanentNodeChildren( |
const BookmarkNode* node) { |
- return true; |
+ return !IsDescendantOfManagedNode(node); |
} |
bool ChromeBookmarkClient::CanSetPermanentNodeTitle( |
const BookmarkNode* permanent_node) { |
- return false; |
+ // The |managed_node_| can have its title updated if the user signs in or |
+ // out. |
+ return !IsDescendantOfManagedNode(permanent_node) || |
+ permanent_node == managed_node_; |
} |
bool ChromeBookmarkClient::CanSyncNode(const BookmarkNode* node) { |
- return true; |
+ return !IsDescendantOfManagedNode(node); |
} |
bool ChromeBookmarkClient::CanReorderChildren(const BookmarkNode* parent) { |
- return true; |
+ return !IsDescendantOfManagedNode(parent); |
} |
void ChromeBookmarkClient::Observe( |
@@ -177,9 +211,40 @@ void ChromeBookmarkClient::BookmarkAllNodesRemoved( |
NotifyHistoryOfRemovedURLs(profile_, removed_urls); |
} |
+void ChromeBookmarkClient::BookmarkModelLoaded(BookmarkModel* model, |
+ bool ids_reassigned) { |
+ // Start tracking the managed bookmarks. This will detect any changes that |
+ // may have occurred while the initial managed bookmarks were being loaded |
+ // on the background. |
+ managed_bookmarks_tracker_.Init(managed_node_); |
+} |
+ |
// static |
bookmarks::BookmarkPermanentNodeList ChromeBookmarkClient::LoadExtraNodes( |
- int64* next_id) { |
- // TODO(joaodasilva): load the managed node. http://crbug.com/49598 |
- return bookmarks::BookmarkPermanentNodeList(); |
+ const scoped_refptr<base::DeferredSequencedTaskRunner>& profile_io_runner, |
+ BookmarkPermanentNode* managed_node, |
+ scoped_ptr<base::ListValue> initial_managed_bookmarks, |
+ int64* next_node_id) { |
+ DCHECK(profile_io_runner->RunsTasksOnCurrentThread()); |
+ // Load the initial contents of the |managed_node| now, and assign it an |
+ // unused ID. |
+ int64 managed_id = *next_node_id; |
+ managed_node->set_id(managed_id); |
+ *next_node_id = policy::ManagedBookmarksTracker::LoadInitial( |
+ managed_node, initial_managed_bookmarks.get(), managed_id + 1); |
+ managed_node->set_visible(!managed_node->empty()); |
+ managed_node->SetTitle( |
+ l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME)); |
+ |
+ bookmarks::BookmarkPermanentNodeList extra_nodes; |
+ extra_nodes.push_back(managed_node); |
+ return extra_nodes.Pass(); |
+} |
+ |
+std::string ChromeBookmarkClient::GetManagedBookmarksDomain() { |
+ policy::ProfilePolicyConnector* connector = |
+ policy::ProfilePolicyConnectorFactory::GetForProfile(profile_); |
+ if (connector->IsPolicyFromCloudPolicy(policy::key::kManagedBookmarks)) |
+ return connector->GetManagementDomain(); |
+ return std::string(); |
} |