Commit 823f71e6 authored by edchin's avatar edchin Committed by Commit Bot

[ios] Add managed bookmarks to bookmarks UI

This CL allows managed bookmarks to be shown if:
1) There are managed bookmarks from the ManagedBookmarkService,
2) The ManagedBookmarks feature flag is enabled. This flag allows
for a server-side kill switch.

Managed bookmarks are bookmarks that are set by an enterprise policy
and are available in every device managed by that policy.
This folder is a sibling of the Bookmarks Bar, Mobile bookmarks,
and Other bookmarks. The managed bookmarks folder is not editable,
nor any item within it.

This CL disables swiping to delete and long press gesture for any item
or folder that is not user-editable (which includes all descendants of
the managed bookmarks folder). The edit/new folder toolbar is also
hidden for folders that are not user-editable.

Bug: 1065187
Change-Id: If63ee2673576dc8a838f05beb8b81fa301f22a16
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2140953
Commit-Queue: edchin <edchin@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#758467}
parent 2cc88bf0
......@@ -57,6 +57,7 @@ source_set("bookmarks") {
"//base",
"//base:i18n",
"//components/bookmarks/browser",
"//components/bookmarks/managed",
"//components/browser_sync",
"//components/pref_registry",
"//components/prefs",
......@@ -66,7 +67,6 @@ source_set("bookmarks") {
"//components/strings",
"//components/undo",
"//components/url_formatter",
"//google_apis",
"//ios/chrome/app/strings",
"//ios/chrome/app/theme",
"//ios/chrome/browser",
......@@ -76,6 +76,7 @@ source_set("bookmarks") {
"//ios/chrome/browser/favicon",
"//ios/chrome/browser/main:public",
"//ios/chrome/browser/metrics:metrics_internal",
"//ios/chrome/browser/policy:feature_flags",
"//ios/chrome/browser/signin",
"//ios/chrome/browser/sync",
"//ios/chrome/browser/tabs",
......
......@@ -10,7 +10,10 @@
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/bookmarks/browser/bookmark_utils.h"
#include "components/bookmarks/browser/titled_url_match.h"
#include "components/bookmarks/managed/managed_bookmark_service.h"
#import "ios/chrome/browser/bookmarks/managed_bookmark_service_factory.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/policy/policy_features.h"
#import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h"
#import "ios/chrome/browser/ui/bookmarks/bookmark_home_consumer.h"
#import "ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h"
......@@ -180,6 +183,21 @@ const int kMaxBookmarksSearchResults = 50;
addItem:otherItem
toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
}
if (IsManagedBookmarksEnabled()) {
// Add "Managed Bookmarks" to the table if it exists.
bookmarks::ManagedBookmarkService* managedBookmarkService =
ManagedBookmarkServiceFactory::GetForBrowserState(self.browserState);
const BookmarkNode* managedNode = managedBookmarkService->managed_node();
if (managedNode && managedNode->IsVisible()) {
BookmarkHomeNodeItem* managedItem = [[BookmarkHomeNodeItem alloc]
initWithType:BookmarkHomeItemTypeBookmark
bookmarkNode:managedNode];
[self.sharedState.tableViewModel
addItem:managedItem
toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
}
}
}
- (void)computeBookmarkTableViewDataMatching:(NSString*)searchText
......
......@@ -8,9 +8,11 @@
#include "base/metrics/user_metrics.h"
#include "base/strings/sys_string_conversions.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/bookmarks/managed/managed_bookmark_service.h"
#include "components/strings/grit/components_strings.h"
#include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
#include "ios/chrome/browser/bookmarks/bookmarks_utils.h"
#import "ios/chrome/browser/bookmarks/managed_bookmark_service_factory.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/favicon/favicon_loader.h"
#include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h"
......@@ -1170,8 +1172,14 @@ std::vector<GURL> GetUrlsToOpen(const std::vector<const BookmarkNode*>& nodes) {
- (BOOL)allowsNewFolder {
// When the current root node has been removed remotely (becomes NULL),
// or when displaying search results, creating new folder is forbidden.
// The root folder displayed by the table view must also be editable to allow
// creation of new folders. Note that Bookmarks Bar, Mobile Bookmarks, and
// Other Bookmarks return as "editable" since the user can edit the contents
// of those folders.
return self.sharedState.tableViewDisplayedRootNode != NULL &&
!self.sharedState.currentlyShowingSearchResults;
!self.sharedState.currentlyShowingSearchResults &&
[self
isNodeEditableByUser:self.sharedState.tableViewDisplayedRootNode];
}
- (int)topMostVisibleIndexPathRow {
......@@ -1213,6 +1221,19 @@ std::vector<GURL> GetUrlsToOpen(const std::vector<const BookmarkNode*>& nodes) {
node->type() == BookmarkNode::FOLDER;
}
// Returns YES if the given node can be edited by user.
- (BOOL)isNodeEditableByUser:(const BookmarkNode*)node {
// Note that CanBeEditedByUser() below returns true for Bookmarks Bar, Mobile
// Bookmarks, and Other Bookmarks since the user can add, delete, and edit
// items within those folders. CanBeEditedByUser() returns false for the
// managed_node and all nodes that are descendants of managed_node.
bookmarks::ManagedBookmarkService* managedBookmarkService =
ManagedBookmarkServiceFactory::GetForBrowserState(self.browserState);
return managedBookmarkService
? managedBookmarkService->CanBeEditedByUser(node)
: YES;
}
// Returns the bookmark node associated with |indexPath|.
- (const BookmarkNode*)nodeAtIndexPath:(NSIndexPath*)indexPath {
TableViewItem* item =
......@@ -1512,7 +1533,12 @@ std::vector<GURL> GetUrlsToOpen(const std::vector<const BookmarkNode*>& nodes) {
target:self
action:@selector(trailingButtonClicked)];
editButton.accessibilityIdentifier = kBookmarkHomeTrailingButtonIdentifier;
editButton.enabled = [self hasBookmarksOrFolders];
// The edit button is only enabled if the displayed root folder is editable
// and has items. Note that Bookmarks Bar, Mobile Bookmarks, and Other
// Bookmarks return as "editable" since their contents can be edited.
editButton.enabled =
[self hasBookmarksOrFolders] &&
[self isNodeEditableByUser:self.sharedState.tableViewDisplayedRootNode];
[self setToolbarItems:@[ newFolderButton, spaceButton, editButton ]
animated:NO];
......@@ -1731,8 +1757,9 @@ std::vector<GURL> GetUrlsToOpen(const std::vector<const BookmarkNode*>& nodes) {
const BookmarkNode* node = [self nodeAtIndexPath:indexPath];
// Disable the long press gesture if it is a permanent node (not an URL or
// Folder).
if (!node || ![self isUrlOrFolder:node]) {
// Folder) or if the node is not editable.
if (!node || ![self isUrlOrFolder:node] ||
![self isNodeEditableByUser:node]) {
return;
}
......@@ -1873,12 +1900,12 @@ std::vector<GURL> GetUrlsToOpen(const std::vector<const BookmarkNode*>& nodes) {
return NO;
}
// Enable the swipe-to-delete gesture and reordering control for nodes of
// type URL or Folder, but not the permanent ones.
// Enable the swipe-to-delete gesture and reordering control for editable
// nodes of type URL or Folder, but not the permanent ones.
BookmarkHomeNodeItem* nodeItem =
base::mac::ObjCCastStrict<BookmarkHomeNodeItem>(item);
const BookmarkNode* node = nodeItem.bookmarkNode;
return [self isUrlOrFolder:node];
return [self isUrlOrFolder:node] && [self isNodeEditableByUser:node];
}
- (void)tableView:(UITableView*)tableView
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment