Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/bookmarks/chrome_bookmark_client.h" | 5 #include "chrome/browser/bookmarks/chrome_bookmark_client.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 34 if (bitmap_result.is_valid()) { | 34 if (bitmap_result.is_valid()) { |
| 35 result.image = gfx::Image::CreateFrom1xPNGBytes( | 35 result.image = gfx::Image::CreateFrom1xPNGBytes( |
| 36 bitmap_result.bitmap_data->front(), bitmap_result.bitmap_data->size()); | 36 bitmap_result.bitmap_data->front(), bitmap_result.bitmap_data->size()); |
| 37 result.icon_url = bitmap_result.icon_url; | 37 result.icon_url = bitmap_result.icon_url; |
| 38 callback.Run(result); | 38 callback.Run(result); |
| 39 return; | 39 return; |
| 40 } | 40 } |
| 41 callback.Run(result); | 41 callback.Run(result); |
| 42 } | 42 } |
| 43 | 43 |
| 44 bool IsDescendantOf(const BookmarkNode* node, const BookmarkNode* root) { | |
| 45 return node && node->HasAncestor(root); | |
| 46 } | |
| 47 | |
| 48 bool HasDescendantsOf(const std::vector<const BookmarkNode*>& list, | |
|
Pam (message me for reviews)
2015/01/14 14:03:36
This name is a little misleading, so a quick comme
Marc Treib
2015/01/14 16:40:49
Done.
| |
| 49 const BookmarkNode* root) { | |
| 50 for (size_t i = 0; i < list.size(); ++i) { | |
| 51 if (IsDescendantOf(list[i], root)) | |
| 52 return true; | |
| 53 } | |
| 54 return false; | |
| 55 } | |
| 56 | |
| 57 void LoadInitialContents(BookmarkPermanentNode* node, | |
| 58 base::ListValue* initial_bookmarks, | |
| 59 int64* next_node_id) { | |
| 60 // Load the initial contents of the |node| now, and assign it an unused ID. | |
|
Pam (message me for reviews)
2015/01/14 14:03:36
What are "initial" contents, as opposed to any oth
Marc Treib
2015/01/14 16:40:50
AIUI, the "initial contents" are just "whatever's
| |
| 61 int64 id = *next_node_id; | |
| 62 node->set_id(id); | |
| 63 *next_node_id = policy::ManagedBookmarksTracker::LoadInitial( | |
| 64 node, initial_bookmarks, id + 1); | |
|
Pam (message me for reviews)
2015/01/14 14:03:37
I suppose this object is profile-keyed and not mul
Marc Treib
2015/01/14 16:40:49
"this object" meaning what, exactly? LoadInitial i
Pam (message me for reviews)
2015/01/15 11:37:03
OK, then, I suppose there's nothing to do here...
| |
| 65 node->set_visible(!node->empty()); | |
| 66 } | |
| 67 | |
| 44 } // namespace | 68 } // namespace |
| 45 | 69 |
| 46 ChromeBookmarkClient::ChromeBookmarkClient(Profile* profile) | 70 ChromeBookmarkClient::ChromeBookmarkClient(Profile* profile) |
| 47 : profile_(profile), | 71 : profile_(profile), |
| 48 history_service_(NULL), | 72 history_service_(NULL), |
| 49 model_(NULL), | 73 model_(NULL), |
| 50 managed_node_(NULL) { | 74 managed_node_(NULL), |
| 75 supervised_node_(NULL) { | |
| 51 } | 76 } |
| 52 | 77 |
| 53 ChromeBookmarkClient::~ChromeBookmarkClient() { | 78 ChromeBookmarkClient::~ChromeBookmarkClient() { |
| 54 } | 79 } |
| 55 | 80 |
| 56 void ChromeBookmarkClient::Init(BookmarkModel* model) { | 81 void ChromeBookmarkClient::Init(BookmarkModel* model) { |
| 57 DCHECK(model); | 82 DCHECK(model); |
| 58 DCHECK(!model_); | 83 DCHECK(!model_); |
| 59 model_ = model; | 84 model_ = model; |
| 60 model_->AddObserver(this); | 85 model_->AddObserver(this); |
| 61 | 86 |
| 62 managed_bookmarks_tracker_.reset(new policy::ManagedBookmarksTracker( | 87 managed_bookmarks_tracker_.reset(new policy::ManagedBookmarksTracker( |
| 63 model_, | 88 model_, |
| 64 profile_->GetPrefs(), | 89 profile_->GetPrefs(), |
| 90 false, | |
| 65 base::Bind(&ChromeBookmarkClient::GetManagedBookmarksDomain, | 91 base::Bind(&ChromeBookmarkClient::GetManagedBookmarksDomain, |
| 66 base::Unretained(this)))); | 92 base::Unretained(this)))); |
| 93 supervised_bookmarks_tracker_.reset(new policy::ManagedBookmarksTracker( | |
| 94 model_, | |
| 95 profile_->GetPrefs(), | |
| 96 true, | |
| 97 base::Callback<std::string()>())); | |
| 67 } | 98 } |
| 68 | 99 |
| 69 void ChromeBookmarkClient::Shutdown() { | 100 void ChromeBookmarkClient::Shutdown() { |
| 70 favicon_changed_subscription_.reset(); | 101 favicon_changed_subscription_.reset(); |
| 71 if (model_) { | 102 if (model_) { |
| 72 model_->RemoveObserver(this); | 103 model_->RemoveObserver(this); |
| 73 model_ = NULL; | 104 model_ = NULL; |
| 74 } | 105 } |
| 75 BookmarkClient::Shutdown(); | 106 BookmarkClient::Shutdown(); |
| 76 } | 107 } |
| 77 | 108 |
| 78 bool ChromeBookmarkClient::IsDescendantOfManagedNode(const BookmarkNode* node) { | 109 bool ChromeBookmarkClient::IsDescendantOfManagedNode(const BookmarkNode* node) { |
| 79 return node && node->HasAncestor(managed_node_); | 110 return IsDescendantOf(node, managed_node_); |
| 80 } | 111 } |
| 81 | 112 |
| 82 bool ChromeBookmarkClient::HasDescendantsOfManagedNode( | 113 bool ChromeBookmarkClient::HasDescendantsOfManagedNode( |
| 83 const std::vector<const BookmarkNode*>& list) { | 114 const std::vector<const BookmarkNode*>& list) { |
| 84 for (size_t i = 0; i < list.size(); ++i) { | 115 return HasDescendantsOf(list, managed_node_); |
| 85 if (IsDescendantOfManagedNode(list[i])) | 116 } |
| 86 return true; | 117 |
| 87 } | 118 bool ChromeBookmarkClient::IsDescendantOfSupervisedNode( |
| 88 return false; | 119 const BookmarkNode* node) { |
| 120 return IsDescendantOf(node, supervised_node_); | |
| 121 } | |
| 122 | |
| 123 bool ChromeBookmarkClient::HasDescendantsOfSupervisedNode( | |
| 124 const std::vector<const BookmarkNode*>& list) { | |
| 125 return HasDescendantsOf(list, supervised_node_); | |
| 126 } | |
| 127 | |
| 128 bool ChromeBookmarkClient::IsDescendantOfManagedOrSupervisedNode( | |
| 129 const BookmarkNode* node) { | |
| 130 return IsDescendantOfManagedNode(node) || IsDescendantOfSupervisedNode(node); | |
| 131 } | |
| 132 | |
| 133 bool ChromeBookmarkClient::HasDescendantsOfManagedOrSupervisedNode( | |
| 134 const std::vector<const BookmarkNode*>& list) { | |
| 135 return HasDescendantsOfManagedNode(list) || | |
| 136 HasDescendantsOfSupervisedNode(list); | |
| 89 } | 137 } |
| 90 | 138 |
| 91 bool ChromeBookmarkClient::PreferTouchIcon() { | 139 bool ChromeBookmarkClient::PreferTouchIcon() { |
| 92 #if !defined(OS_IOS) | 140 #if !defined(OS_IOS) |
| 93 return false; | 141 return false; |
| 94 #else | 142 #else |
| 95 return true; | 143 return true; |
| 96 #endif | 144 #endif |
| 97 } | 145 } |
| 98 | 146 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 141 NodeTypedCountPair pair(*i, typed_count); | 189 NodeTypedCountPair pair(*i, typed_count); |
| 142 node_typed_count_pairs->push_back(pair); | 190 node_typed_count_pairs->push_back(pair); |
| 143 } | 191 } |
| 144 } | 192 } |
| 145 | 193 |
| 146 bool ChromeBookmarkClient::IsPermanentNodeVisible( | 194 bool ChromeBookmarkClient::IsPermanentNodeVisible( |
| 147 const BookmarkPermanentNode* node) { | 195 const BookmarkPermanentNode* node) { |
| 148 DCHECK(node->type() == BookmarkNode::BOOKMARK_BAR || | 196 DCHECK(node->type() == BookmarkNode::BOOKMARK_BAR || |
| 149 node->type() == BookmarkNode::OTHER_NODE || | 197 node->type() == BookmarkNode::OTHER_NODE || |
| 150 node->type() == BookmarkNode::MOBILE || | 198 node->type() == BookmarkNode::MOBILE || |
| 151 node == managed_node_); | 199 node == managed_node_ || |
| 152 if (node == managed_node_) | 200 node == supervised_node_); |
| 201 if (node == managed_node_ || node == supervised_node_) | |
| 153 return false; | 202 return false; |
| 154 #if !defined(OS_IOS) | 203 #if !defined(OS_IOS) |
| 155 return node->type() != BookmarkNode::MOBILE; | 204 return node->type() != BookmarkNode::MOBILE; |
| 156 #else | 205 #else |
| 157 return node->type() == BookmarkNode::MOBILE; | 206 return node->type() == BookmarkNode::MOBILE; |
| 158 #endif | 207 #endif |
| 159 } | 208 } |
| 160 | 209 |
| 161 void ChromeBookmarkClient::RecordAction(const base::UserMetricsAction& action) { | 210 void ChromeBookmarkClient::RecordAction(const base::UserMetricsAction& action) { |
| 162 content::RecordAction(action); | 211 content::RecordAction(action); |
| 163 } | 212 } |
| 164 | 213 |
| 165 bookmarks::LoadExtraCallback ChromeBookmarkClient::GetLoadExtraNodesCallback() { | 214 bookmarks::LoadExtraCallback ChromeBookmarkClient::GetLoadExtraNodesCallback() { |
| 166 // Create the managed_node now; it will be populated in the LoadExtraNodes | 215 // Create the managed_node_ and supervised_node_ now; they will be populated |
| 167 // callback. | 216 // in the LoadExtraNodes callback. |
| 168 // The ownership of managed_node_ is in limbo until LoadExtraNodes runs, | 217 // The ownership of managed_node_ and supervised_node_ is in limbo until |
| 169 // so we leave it in the care of the closure meanwhile. | 218 // LoadExtraNodes runs, so we leave them in the care of the closure meanwhile. |
| 170 scoped_ptr<BookmarkPermanentNode> managed(new BookmarkPermanentNode(0)); | 219 scoped_ptr<BookmarkPermanentNode> managed(new BookmarkPermanentNode(0)); |
| 171 managed_node_ = managed.get(); | 220 managed_node_ = managed.get(); |
| 221 scoped_ptr<BookmarkPermanentNode> supervised(new BookmarkPermanentNode(1)); | |
| 222 supervised_node_ = supervised.get(); | |
| 172 | 223 |
| 173 return base::Bind( | 224 return base::Bind( |
| 174 &ChromeBookmarkClient::LoadExtraNodes, | 225 &ChromeBookmarkClient::LoadExtraNodes, |
| 175 base::Passed(&managed), | 226 base::Passed(&managed), |
| 176 base::Passed(managed_bookmarks_tracker_->GetInitialManagedBookmarks())); | 227 base::Passed(managed_bookmarks_tracker_->GetInitialManagedBookmarks()), |
| 228 base::Passed(&supervised), | |
| 229 base::Passed( | |
| 230 supervised_bookmarks_tracker_->GetInitialManagedBookmarks())); | |
| 177 } | 231 } |
| 178 | 232 |
| 179 bool ChromeBookmarkClient::CanSetPermanentNodeTitle( | 233 bool ChromeBookmarkClient::CanSetPermanentNodeTitle( |
| 180 const BookmarkNode* permanent_node) { | 234 const BookmarkNode* permanent_node) { |
| 181 // The |managed_node_| can have its title updated if the user signs in or | 235 // The |managed_node_| can have its title updated if the user signs in or |
|
Pam (message me for reviews)
2015/01/14 14:03:36
Please explain why |managed_node_| (that is, the t
Marc Treib
2015/01/14 16:40:49
Done.
| |
| 182 // out. | 236 // out. |
| 183 return !IsDescendantOfManagedNode(permanent_node) || | 237 return !IsDescendantOfManagedOrSupervisedNode(permanent_node) || |
| 184 permanent_node == managed_node_; | 238 permanent_node == managed_node_; |
| 185 } | 239 } |
| 186 | 240 |
| 187 bool ChromeBookmarkClient::CanSyncNode(const BookmarkNode* node) { | 241 bool ChromeBookmarkClient::CanSyncNode(const BookmarkNode* node) { |
| 188 return !IsDescendantOfManagedNode(node); | 242 return !IsDescendantOfManagedOrSupervisedNode(node); |
| 189 } | 243 } |
| 190 | 244 |
| 191 bool ChromeBookmarkClient::CanBeEditedByUser(const BookmarkNode* node) { | 245 bool ChromeBookmarkClient::CanBeEditedByUser(const BookmarkNode* node) { |
| 192 return !IsDescendantOfManagedNode(node); | 246 return !IsDescendantOfManagedOrSupervisedNode(node); |
| 193 } | 247 } |
| 194 | 248 |
| 195 void ChromeBookmarkClient::SetHistoryService(HistoryService* history_service) { | 249 void ChromeBookmarkClient::SetHistoryService(HistoryService* history_service) { |
| 196 DCHECK(history_service); | 250 DCHECK(history_service); |
| 197 history_service_ = history_service; | 251 history_service_ = history_service; |
| 198 favicon_changed_subscription_ = history_service_->AddFaviconChangedCallback( | 252 favicon_changed_subscription_ = history_service_->AddFaviconChangedCallback( |
| 199 base::Bind(&BookmarkModel::OnFaviconChanged, base::Unretained(model_))); | 253 base::Bind(&BookmarkModel::OnFaviconChanged, base::Unretained(model_))); |
| 200 } | 254 } |
| 201 | 255 |
| 202 void ChromeBookmarkClient::BookmarkModelChanged() { | 256 void ChromeBookmarkClient::BookmarkModelChanged() { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 214 | 268 |
| 215 void ChromeBookmarkClient::BookmarkAllUserNodesRemoved( | 269 void ChromeBookmarkClient::BookmarkAllUserNodesRemoved( |
| 216 BookmarkModel* model, | 270 BookmarkModel* model, |
| 217 const std::set<GURL>& removed_urls) { | 271 const std::set<GURL>& removed_urls) { |
| 218 if (history_service_) | 272 if (history_service_) |
| 219 history_service_->URLsNoLongerBookmarked(removed_urls); | 273 history_service_->URLsNoLongerBookmarked(removed_urls); |
| 220 } | 274 } |
| 221 | 275 |
| 222 void ChromeBookmarkClient::BookmarkModelLoaded(BookmarkModel* model, | 276 void ChromeBookmarkClient::BookmarkModelLoaded(BookmarkModel* model, |
| 223 bool ids_reassigned) { | 277 bool ids_reassigned) { |
| 224 // Start tracking the managed bookmarks. This will detect any changes that | 278 // Start tracking the managed bookmarks. This will detect any changes that |
|
Pam (message me for reviews)
2015/01/14 14:03:37
"managed and supervised" x 2
Marc Treib
2015/01/14 16:40:50
Done.
| |
| 225 // may have occurred while the initial managed bookmarks were being loaded | 279 // may have occurred while the initial managed bookmarks were being loaded |
| 226 // on the background. | 280 // on the background. |
| 227 managed_bookmarks_tracker_->Init(managed_node_); | 281 managed_bookmarks_tracker_->Init(managed_node_); |
| 282 supervised_bookmarks_tracker_->Init(supervised_node_); | |
| 228 } | 283 } |
| 229 | 284 |
| 230 // static | 285 // static |
| 231 bookmarks::BookmarkPermanentNodeList ChromeBookmarkClient::LoadExtraNodes( | 286 bookmarks::BookmarkPermanentNodeList ChromeBookmarkClient::LoadExtraNodes( |
| 232 scoped_ptr<BookmarkPermanentNode> managed_node, | 287 scoped_ptr<BookmarkPermanentNode> managed_node, |
| 233 scoped_ptr<base::ListValue> initial_managed_bookmarks, | 288 scoped_ptr<base::ListValue> initial_managed_bookmarks, |
| 289 scoped_ptr<BookmarkPermanentNode> supervised_node, | |
| 290 scoped_ptr<base::ListValue> initial_supervised_bookmarks, | |
| 234 int64* next_node_id) { | 291 int64* next_node_id) { |
| 235 // Load the initial contents of the |managed_node| now, and assign it an | 292 LoadInitialContents( |
| 236 // unused ID. | 293 managed_node.get(), initial_managed_bookmarks.get(), next_node_id); |
| 237 int64 managed_id = *next_node_id; | 294 managed_node->SetTitle(l10n_util::GetStringUTF16( |
| 238 managed_node->set_id(managed_id); | 295 IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME)); |
| 239 *next_node_id = policy::ManagedBookmarksTracker::LoadInitial( | 296 |
| 240 managed_node.get(), initial_managed_bookmarks.get(), managed_id + 1); | 297 LoadInitialContents( |
| 241 managed_node->set_visible(!managed_node->empty()); | 298 supervised_node.get(), initial_supervised_bookmarks.get(), next_node_id); |
| 242 managed_node->SetTitle( | 299 supervised_node->SetTitle(l10n_util::GetStringUTF16( |
| 243 l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME)); | 300 IDS_BOOKMARK_BAR_SUPERVISED_FOLDER_DEFAULT_NAME)); |
| 244 | 301 |
| 245 bookmarks::BookmarkPermanentNodeList extra_nodes; | 302 bookmarks::BookmarkPermanentNodeList extra_nodes; |
| 246 // Ownership of the managed node passed to the caller. | 303 // Ownership of the managed and supervised nodes passed to the caller. |
| 247 extra_nodes.push_back(managed_node.release()); | 304 extra_nodes.push_back(managed_node.release()); |
| 305 extra_nodes.push_back(supervised_node.release()); | |
| 248 | 306 |
| 249 return extra_nodes.Pass(); | 307 return extra_nodes.Pass(); |
| 250 } | 308 } |
| 251 | 309 |
| 252 std::string ChromeBookmarkClient::GetManagedBookmarksDomain() { | 310 std::string ChromeBookmarkClient::GetManagedBookmarksDomain() { |
| 253 policy::ProfilePolicyConnector* connector = | 311 policy::ProfilePolicyConnector* connector = |
| 254 policy::ProfilePolicyConnectorFactory::GetForProfile(profile_); | 312 policy::ProfilePolicyConnectorFactory::GetForProfile(profile_); |
| 255 if (connector->IsPolicyFromCloudPolicy(policy::key::kManagedBookmarks)) | 313 if (connector->IsPolicyFromCloudPolicy(policy::key::kManagedBookmarks)) |
| 256 return connector->GetManagementDomain(); | 314 return connector->GetManagementDomain(); |
| 257 return std::string(); | 315 return std::string(); |
| 258 } | 316 } |
| OLD | NEW |