| 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..286572470af16373986afcda655172f787144152 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::IsAManagedNode(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,35 @@ 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 !IsAManagedNode(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 !IsAManagedNode(permanent_node) || permanent_node == managed_node_;
|
| }
|
|
|
| bool ChromeBookmarkClient::CanSyncNode(const BookmarkNode* node) {
|
| - return true;
|
| + return !IsAManagedNode(node);
|
| }
|
|
|
| bool ChromeBookmarkClient::CanReorderChildren(const BookmarkNode* parent) {
|
| - return true;
|
| + return !IsAManagedNode(parent);
|
| }
|
|
|
| void ChromeBookmarkClient::Observe(
|
| @@ -177,9 +210,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();
|
| }
|
|
|