| Index: chrome/browser/tab_contents/web_drag_dest_gtk.cc
|
| diff --git a/chrome/browser/tab_contents/web_drag_dest_gtk.cc b/chrome/browser/tab_contents/web_drag_dest_gtk.cc
|
| index d96f6cf7ab13b165b442372ddcf18203aaaa58b7..1d7cd883499a4caa833692b7802739f34c33c20b 100644
|
| --- a/chrome/browser/tab_contents/web_drag_dest_gtk.cc
|
| +++ b/chrome/browser/tab_contents/web_drag_dest_gtk.cc
|
| @@ -16,9 +16,25 @@
|
| #include "net/base/net_util.h"
|
|
|
| using WebKit::WebDragOperation;
|
| +using WebKit::WebDragOperationNone;
|
| using WebKit::WebDragOperationCopy;
|
| +using WebKit::WebDragOperationLink;
|
| using WebKit::WebDragOperationMove;
|
| -using WebKit::WebDragOperationNone;
|
| +
|
| +namespace {
|
| +
|
| +WebDragOperation GdkDragActionToWebDragOp(GdkDragAction action) {
|
| + WebDragOperation op = WebDragOperationNone;
|
| + if (action & GDK_ACTION_COPY)
|
| + op = static_cast<WebDragOperation>(op | WebDragOperationCopy);
|
| + if (action & GDK_ACTION_LINK)
|
| + op = static_cast<WebDragOperation>(op | WebDragOperationLink);
|
| + if (action & GDK_ACTION_MOVE)
|
| + op = static_cast<WebDragOperation>(op | WebDragOperationMove);
|
| + return op;
|
| +}
|
| +
|
| +} // namespace
|
|
|
| WebDragDestGtk::WebDragDestGtk(TabContents* tab_contents, GtkWidget* widget)
|
| : tab_contents_(tab_contents),
|
| @@ -26,7 +42,10 @@ WebDragDestGtk::WebDragDestGtk(TabContents* tab_contents, GtkWidget* widget)
|
| context_(NULL),
|
| method_factory_(this) {
|
| gtk_drag_dest_set(widget, static_cast<GtkDestDefaults>(0),
|
| - NULL, 0, GDK_ACTION_COPY);
|
| + NULL, 0,
|
| + static_cast<GdkDragAction>(GDK_ACTION_COPY |
|
| + GDK_ACTION_LINK |
|
| + GDK_ACTION_MOVE));
|
| g_signal_connect(widget, "drag-motion",
|
| G_CALLBACK(OnDragMotionThunk), this);
|
| g_signal_connect(widget, "drag-leave",
|
| @@ -35,6 +54,8 @@ WebDragDestGtk::WebDragDestGtk(TabContents* tab_contents, GtkWidget* widget)
|
| G_CALLBACK(OnDragDropThunk), this);
|
| g_signal_connect(widget, "drag-data-received",
|
| G_CALLBACK(OnDragDataReceivedThunk), this);
|
| + // TODO(tony): Need a drag-data-delete handler for moving content out of
|
| + // the tab contents. http://crbug.com/38989
|
|
|
| destroy_handler_ = g_signal_connect(
|
| widget, "destroy", G_CALLBACK(gtk_widget_destroyed), &widget_);
|
| @@ -49,12 +70,8 @@ WebDragDestGtk::~WebDragDestGtk() {
|
|
|
| void WebDragDestGtk::UpdateDragStatus(WebDragOperation operation) {
|
| if (context_) {
|
| - // TODO(estade): we might want to support other actions besides copy,
|
| - // but that would increase the cost of getting our drag success guess
|
| - // wrong.
|
| is_drop_target_ = operation != WebDragOperationNone;
|
| - gdk_drag_status(context_, is_drop_target_ ? GDK_ACTION_COPY :
|
| - static_cast<GdkDragAction>(0),
|
| + gdk_drag_status(context_, gtk_dnd_util::WebDragOpToGdkDragAction(operation),
|
| drag_over_time_);
|
| }
|
| }
|
| @@ -97,8 +114,7 @@ gboolean WebDragDestGtk::OnDragMotion(GtkWidget* sender,
|
| tab_contents_->render_view_host()->
|
| DragTargetDragOver(gtk_util::ClientPoint(widget_),
|
| gtk_util::ScreenPoint(widget_),
|
| - static_cast<WebDragOperation>(
|
| - WebDragOperationCopy | WebDragOperationMove));
|
| + GdkDragActionToWebDragOp(context->actions));
|
| if (tab_contents_->GetBookmarkDragDelegate())
|
| tab_contents_->GetBookmarkDragDelegate()->OnDragOver(bookmark_drag_data_);
|
| drag_over_time_ = time;
|
| @@ -186,10 +202,9 @@ void WebDragDestGtk::OnDragDataReceived(
|
| // TODO(snej): Pass appropriate DragOperation instead of hardcoding.
|
| tab_contents_->render_view_host()->
|
| DragTargetDragEnter(*drop_data_.get(),
|
| - gtk_util::ClientPoint(widget_),
|
| - gtk_util::ScreenPoint(widget_),
|
| - static_cast<WebDragOperation>(
|
| - WebDragOperationCopy | WebDragOperationMove));
|
| + gtk_util::ClientPoint(widget_),
|
| + gtk_util::ScreenPoint(widget_),
|
| + GdkDragActionToWebDragOp(context->actions));
|
|
|
| // This is non-null if tab_contents_ is showing an ExtensionDOMUI with
|
| // support for (at the moment experimental) drag and drop extensions.
|
| @@ -232,8 +247,9 @@ gboolean WebDragDestGtk::OnDragDrop(GtkWidget* sender, GdkDragContext* context,
|
| if (tab_contents_->GetBookmarkDragDelegate())
|
| tab_contents_->GetBookmarkDragDelegate()->OnDrop(bookmark_drag_data_);
|
|
|
| - // The second parameter is just an educated guess, but at least we will
|
| - // get the drag-end animation right sometimes.
|
| + // The second parameter is just an educated guess as to whether or not the
|
| + // drag succeeded, but at least we will get the drag-end animation right
|
| + // sometimes.
|
| gtk_drag_finish(context, is_drop_target_, FALSE, time);
|
| return TRUE;
|
| }
|
|
|