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 b57fb06f3c37ae0563662a19d708b6557b4a880a..d6aeaf747fd467c0e999cfda42f808c23e51e317 100644 |
--- a/chrome/browser/bookmarks/chrome_bookmark_client.cc |
+++ b/chrome/browser/bookmarks/chrome_bookmark_client.cc |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/bookmarks/chrome_bookmark_client.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" |
@@ -12,12 +13,17 @@ |
#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 "components/bookmarks/browser/bookmark_model.h" |
#include "components/bookmarks/browser/bookmark_node.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 { |
@@ -33,7 +39,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. |
@@ -48,6 +60,12 @@ ChromeBookmarkClient::~ChromeBookmarkClient() { |
registrar_.RemoveAll(); |
} |
+bool ChromeBookmarkClient::IsAManagedNode(const BookmarkNode* node) { |
+ while (node && node != managed_node_) |
sky
2014/06/04 20:39:52
return node->HasAncestor(managed_node_);
Joao da Silva
2014/06/04 22:35:58
Done.
|
+ node = node->parent(); |
+ return node == managed_node_; |
+} |
+ |
bool ChromeBookmarkClient::PreferTouchIcon() { |
#if !defined(OS_IOS) |
return false; |
@@ -103,17 +121,50 @@ void ChromeBookmarkClient::RecordAction(const base::UserMetricsAction& action) { |
content::RecordAction(action); |
} |
-bool ChromeBookmarkClient::IsPermanentNodeVisible(int node_type) { |
- DCHECK(node_type == BookmarkNode::BOOKMARK_BAR || |
- node_type == BookmarkNode::OTHER_NODE || |
- node_type == BookmarkNode::MOBILE); |
+bool ChromeBookmarkClient::IsPermanentNodeVisible(const BookmarkNode* node) { |
+ DCHECK(node->type() == BookmarkNode::BOOKMARK_BAR || |
+ node->type() == BookmarkNode::OTHER_NODE || |
+ node->type() == BookmarkNode::MOBILE || |
+ node == managed_node_); |
+ if (node == managed_node_) |
+ return false; |
#if !defined(OS_IOS) |
- return node_type != BookmarkNode::MOBILE; |
+ return node->type() != BookmarkNode::MOBILE; |
#else |
- return node_type == BookmarkNode::MOBILE; |
+ return node->type() == BookmarkNode::MOBILE; |
#endif |
} |
+bookmarks::LoadExtraCallback ChromeBookmarkClient::GetLoadExtraNodesCallback() { |
+ return base::Bind( |
+ &ChromeBookmarkClient::LoadExtraNodes, |
+ base::Passed(managed_bookmarks_tracker_.GetInitialManagedBookmarks())); |
+} |
+ |
+void ChromeBookmarkClient::ExtraNodesLoaded( |
+ const std::vector<BookmarkPermanentNode*>& extra_nodes) { |
+ CHECK_EQ(1u, extra_nodes.size()); |
+ managed_node_ = extra_nodes[0]; |
+} |
+ |
+bool ChromeBookmarkClient::CanRemoveNode(const BookmarkNode* node) { |
+ return !IsAManagedNode(node); |
+} |
+ |
+bool ChromeBookmarkClient::CanSetTitle(const BookmarkNode* node) { |
+ // The |managed_node_| can have its title updated if the user signs in or |
+ // out. |
+ return !IsAManagedNode(node) || node == managed_node_; |
+} |
+ |
+bool ChromeBookmarkClient::CanSyncNode(const BookmarkNode* node) { |
+ return !IsAManagedNode(node); |
+} |
+ |
+bool ChromeBookmarkClient::CanReorderChildren(const BookmarkNode* parent) { |
+ return !IsAManagedNode(parent); |
+} |
+ |
void ChromeBookmarkClient::Observe( |
int type, |
const content::NotificationSource& source, |
@@ -152,3 +203,37 @@ void ChromeBookmarkClient::BookmarkAllNodesRemoved( |
const std::set<GURL>& removed_urls) { |
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( |
+ scoped_ptr<base::ListValue> initial_managed_bookmarks, |
+ int64* next_node_id) { |
+ // Create the managed node now, and load its initial contents. |
sky
2014/06/04 20:39:52
DCHECK not on UI thread.
Joao da Silva
2014/06/04 22:35:58
That fails in around 100 unit tests in ~10 suites,
|
+ int64 managed_id = *next_node_id; |
+ BookmarkPermanentNode* managed_node = new BookmarkPermanentNode(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(); |
+} |