| Index: content/browser/web_contents/web_drag_source_win.cc | 
| diff --git a/content/browser/web_contents/web_drag_source_win.cc b/content/browser/web_contents/web_drag_source_win.cc | 
| index 53df4e81725e0984a3f09e7ec496eb022174095f..22f86abd50d779a55a10cbc5dc28593e754bb1f8 100644 | 
| --- a/content/browser/web_contents/web_drag_source_win.cc | 
| +++ b/content/browser/web_contents/web_drag_source_win.cc | 
| @@ -7,6 +7,7 @@ | 
| #include "base/bind.h" | 
| #include "content/browser/renderer_host/render_view_host_impl.h" | 
| #include "content/browser/web_contents/web_contents_impl.h" | 
| +#include "content/browser/renderer_host/render_widget_host_view_win.h" | 
| #include "content/browser/web_contents/web_drag_utils_win.h" | 
| #include "content/public/browser/browser_thread.h" | 
| #include "content/public/browser/notification_source.h" | 
| @@ -66,6 +67,7 @@ void WebDragSource::OnDragSourceCancel() { | 
| web_contents_->DragSourceEndedAt(client.x(), client.y(), | 
| screen.x(), screen.y(), | 
| WebDragOperationNone); | 
| +  OnDragSourceEnded(); | 
| } | 
|  | 
| void WebDragSource::OnDragSourceDrop() { | 
| @@ -84,12 +86,23 @@ void WebDragSource::OnDragSourceDrop() { | 
| void WebDragSource::DelayedOnDragSourceDrop() { | 
| if (!web_contents_) | 
| return; | 
| - | 
| gfx::Point client; | 
| gfx::Point screen; | 
| GetCursorPositions(source_wnd_, &client, &screen); | 
| web_contents_->DragSourceEndedAt(client.x(), client.y(), screen.x(), | 
| screen.y(), WinDragOpToWebDragOp(effect_)); | 
| +  OnDragSourceEnded(); | 
| +} | 
| + | 
| +void WebDragSource::OnDragSourceEnded() { | 
| +  RenderViewHost* render_view_host = web_contents_->GetRenderViewHost(); | 
| +  if (!render_view_host) | 
| +    return; | 
| + | 
| +  RenderWidgetHostViewWin* rwhv = | 
| +      static_cast<RenderWidgetHostViewWin*>(render_view_host->GetView()); | 
| +  if (rwhv->in_long_press_gesture()) | 
| +    rwhv->CancelLongPressGesture(); | 
| } | 
|  | 
| void WebDragSource::OnDragSourceMove() { | 
| @@ -103,7 +116,6 @@ void WebDragSource::OnDragSourceMove() { | 
|  | 
| if (!web_contents_) | 
| return; | 
| - | 
| gfx::Point client; | 
| gfx::Point screen; | 
| GetCursorPositions(source_wnd_, &client, &screen); | 
| @@ -111,6 +123,16 @@ void WebDragSource::OnDragSourceMove() { | 
| screen.x(), screen.y()); | 
| } | 
|  | 
| +bool WebDragSource::ShouldDropDragSource( | 
| +    BOOL escape_pressed, DWORD key_state) { | 
| +  // We also care about right mouse button state since long press gesture is | 
| +  // simulated as right mouse button down/up. | 
| +  LOG(INFO) << "call WebDragSource::ShouldDropDragSource: key_state: " | 
| +            << key_state; | 
| + | 
| +  return !(key_state & MK_LBUTTON) && !(key_state & MK_RBUTTON); | 
| +} | 
| + | 
| void WebDragSource::Observe(int type, | 
| const NotificationSource& source, | 
| const NotificationDetails& details) { | 
|  |