Index: content/browser/web_contents/web_drag_dest_win.cc |
diff --git a/content/browser/web_contents/web_drag_dest_win.cc b/content/browser/web_contents/web_drag_dest_win.cc |
index 8a3142d388caf1865150217fde715e6cbfd0c4dd..ab0a69b2b87846e8d8fb7f6db085b7de883d4852 100644 |
--- a/content/browser/web_contents/web_drag_dest_win.cc |
+++ b/content/browser/web_contents/web_drag_dest_win.cc |
@@ -13,6 +13,7 @@ |
#include "content/public/browser/web_drag_dest_delegate.h" |
#include "googleurl/src/gurl.h" |
#include "net/base/net_util.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
#include "ui/base/clipboard/clipboard_util_win.h" |
#include "ui/base/dragdrop/os_exchange_data.h" |
#include "ui/base/dragdrop/os_exchange_data_provider_win.h" |
@@ -31,6 +32,8 @@ using content::WebContents; |
namespace { |
+const unsigned short kHighBitMaskShort = 0x8000; |
+ |
// A helper method for getting the preferred drop effect. |
DWORD GetPreferredDropEffect(DWORD effect) { |
if (effect & DROPEFFECT_COPY) |
@@ -42,6 +45,21 @@ DWORD GetPreferredDropEffect(DWORD effect) { |
return DROPEFFECT_NONE; |
} |
+int GetModifierFlags() { |
+ int modifier_state = 0; |
+ if (::GetKeyState(VK_SHIFT) & kHighBitMaskShort) |
+ modifier_state |= WebKit::WebInputEvent::ShiftKey; |
+ if (::GetKeyState(VK_CONTROL) & kHighBitMaskShort) |
+ modifier_state |= WebKit::WebInputEvent::ControlKey; |
+ if (::GetKeyState(VK_MENU) & kHighBitMaskShort) |
+ modifier_state |= WebKit::WebInputEvent::AltKey; |
+ if (::GetKeyState(VK_LWIN) & kHighBitMaskShort) |
+ modifier_state |= WebKit::WebInputEvent::MetaKey; |
+ if (::GetKeyState(VK_RWIN) & kHighBitMaskShort) |
+ modifier_state |= WebKit::WebInputEvent::MetaKey; |
+ return modifier_state; |
+} |
+ |
} // namespace |
// InterstitialDropTarget is like a ui::DropTarget implementation that |
@@ -129,7 +147,8 @@ DWORD WebDragDest::OnDragEnter(IDataObject* data_object, |
web_contents_->GetRenderViewHost()->DragTargetDragEnter(*drop_data_, |
gfx::Point(client_pt.x, client_pt.y), |
gfx::Point(cursor_position.x, cursor_position.y), |
- web_drag_utils_win::WinDragOpMaskToWebDragOpMask(effects)); |
+ web_drag_utils_win::WinDragOpMaskToWebDragOpMask(effects), |
+ GetModifierFlags()); |
if (delegate_) |
delegate_->OnDragEnter(data_object); |
@@ -155,7 +174,8 @@ DWORD WebDragDest::OnDragOver(IDataObject* data_object, |
web_contents_->GetRenderViewHost()->DragTargetDragOver( |
gfx::Point(client_pt.x, client_pt.y), |
gfx::Point(cursor_position.x, cursor_position.y), |
- web_drag_utils_win::WinDragOpMaskToWebDragOpMask(effects)); |
+ web_drag_utils_win::WinDragOpMaskToWebDragOpMask(effects), |
+ GetModifierFlags()); |
if (delegate_) |
delegate_->OnDragOver(data_object); |
@@ -198,7 +218,8 @@ DWORD WebDragDest::OnDrop(IDataObject* data_object, |
ScreenToClient(GetHWND(), &client_pt); |
web_contents_->GetRenderViewHost()->DragTargetDrop( |
gfx::Point(client_pt.x, client_pt.y), |
- gfx::Point(cursor_position.x, cursor_position.y)); |
+ gfx::Point(cursor_position.x, cursor_position.y), |
+ GetModifierFlags()); |
if (delegate_) |
delegate_->OnDrop(data_object); |