Chromium Code Reviews| Index: chrome/browser/ui/views/bookmarks/bookmark_drag_drop_views.cc |
| diff --git a/chrome/browser/ui/views/bookmarks/bookmark_drag_drop_views.cc b/chrome/browser/ui/views/bookmarks/bookmark_drag_drop_views.cc |
| index 5c1c3ed311cc8244f3fe728ef93dd0c6b372ab0a..afbd564179d71024bf960e839c02b996f7bdc4d4 100644 |
| --- a/chrome/browser/ui/views/bookmarks/bookmark_drag_drop_views.cc |
| +++ b/chrome/browser/ui/views/bookmarks/bookmark_drag_drop_views.cc |
| @@ -12,6 +12,7 @@ |
| #include "chrome/common/pref_names.h" |
| #include "components/bookmarks/browser/bookmark_model.h" |
| #include "components/bookmarks/browser/bookmark_node_data.h" |
| +#include "components/bookmarks/browser/bookmark_utils.h" |
| #include "components/user_prefs/user_prefs.h" |
| #include "ui/base/dragdrop/drag_drop_types.h" |
| #include "ui/base/dragdrop/os_exchange_data.h" |
| @@ -27,7 +28,7 @@ void DragBookmarks(Profile* profile, |
| ui::DragDropTypes::DragEventSource source) { |
| DCHECK(!nodes.empty()); |
| - // Set up our OLE machinery |
| + // Set up our OLE machinery. |
| ui::OSExchangeData data; |
| BookmarkNodeData drag_data(nodes); |
| drag_data.Write(profile->GetPath(), &data); |
| @@ -36,9 +37,11 @@ void DragBookmarks(Profile* profile, |
| bool was_nested = base::MessageLoop::current()->IsNested(); |
| base::MessageLoop::current()->SetNestableTasksAllowed(true); |
| - int operation = ui::DragDropTypes::DRAG_COPY | |
| - ui::DragDropTypes::DRAG_MOVE | |
| - ui::DragDropTypes::DRAG_LINK; |
| + int operation = ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK; |
| + BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile); |
| + if (model->client()->AllCanBeEditedByUser(nodes)) |
| + operation |= ui::DragDropTypes::DRAG_MOVE; |
| + |
| views::Widget* widget = views::Widget::GetWidgetForNativeView(view); |
| if (widget) { |
| @@ -55,10 +58,14 @@ void DragBookmarks(Profile* profile, |
| int GetBookmarkDragOperation(content::BrowserContext* browser_context, |
| const BookmarkNode* node) { |
| PrefService* prefs = user_prefs::UserPrefs::Get(browser_context); |
| + Profile* profile = Profile::FromBrowserContext(browser_context); |
| + BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile); |
| int move = ui::DragDropTypes::DRAG_MOVE; |
| - if (!prefs->GetBoolean(prefs::kEditBookmarksEnabled)) |
| + if (!prefs->GetBoolean(prefs::kEditBookmarksEnabled) || |
| + !model->client()->CanBeEditedByUser(node)) { |
|
sky
2014/06/05 23:58:48
Can we fold the pref into CanBeEditedByUser?
Joao da Silva
2014/06/06 15:41:03
At first glance I think so, yes. If you agree I'd
|
| move = ui::DragDropTypes::DRAG_NONE; |
| + } |
| if (node->is_url()) |
| return ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK | move; |
| return ui::DragDropTypes::DRAG_COPY | move; |
| @@ -91,10 +98,21 @@ int GetBookmarkDropOperation(Profile* profile, |
| if (!IsValidBookmarkDropLocation(profile, data, parent, index)) |
| return ui::DragDropTypes::DRAG_NONE; |
| - if (data.GetFirstNode(BookmarkModelFactory::GetForProfile(profile), |
| - profile_path)) |
| - // User is dragging from this profile: move. |
| + BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile); |
| + if (!model->client()->CanBeEditedByUser(parent)) |
| + return ui::DragDropTypes::DRAG_NONE; |
| + |
| + const BookmarkNode* dragged_node = |
| + data.GetFirstNode(model, profile->GetPath()); |
| + if (dragged_node) { |
| + // User is dragging from this profile. |
| + if (!model->client()->CanBeEditedByUser(dragged_node)) { |
| + // Do a copy instead of a move when dragging bookmarks that the user can't |
| + // modify. |
| + return ui::DragDropTypes::DRAG_COPY; |
| + } |
| return ui::DragDropTypes::DRAG_MOVE; |
| + } |
| // User is dragging from another app, copy. |
| return GetPreferredBookmarkDropOperation(event.source_operations(), |
| @@ -113,10 +131,13 @@ bool IsValidBookmarkDropLocation(Profile* profile, |
| if (!data.is_valid()) |
| return false; |
| + BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile); |
| + if (!model->client()->CanBeEditedByUser(drop_parent)) |
| + return false; |
| + |
| const base::FilePath& profile_path = profile->GetPath(); |
| if (data.IsFromProfilePath(profile_path)) { |
| - std::vector<const BookmarkNode*> nodes = data.GetNodes( |
| - BookmarkModelFactory::GetForProfile(profile), profile_path); |
| + std::vector<const BookmarkNode*> nodes = data.GetNodes(model, profile_path); |
| for (size_t i = 0; i < nodes.size(); ++i) { |
| // Don't allow the drop if the user is attempting to drop on one of the |
| // nodes being dragged. |
| @@ -132,7 +153,7 @@ bool IsValidBookmarkDropLocation(Profile* profile, |
| } |
| return true; |
| } |
| - // From the same profile, always accept. |
| + // From another profile, always accept. |
| return true; |
| } |