OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <windows.h> | 5 #include <windows.h> |
6 #include <shlobj.h> | 6 #include <shlobj.h> |
7 | 7 |
8 #include "chrome/browser/tab_contents/web_drop_target_win.h" | 8 #include "chrome/browser/tab_contents/web_drop_target_win.h" |
9 | 9 |
10 #include "app/clipboard/clipboard_util_win.h" | 10 #include "app/clipboard/clipboard_util_win.h" |
11 #include "app/os_exchange_data.h" | 11 #include "app/os_exchange_data.h" |
12 #include "app/os_exchange_data_provider_win.h" | 12 #include "app/os_exchange_data_provider_win.h" |
13 #include "chrome/browser/bookmarks/bookmark_drag_data.h" | 13 #include "chrome/browser/bookmarks/bookmark_drag_data.h" |
14 #include "chrome/browser/renderer_host/render_view_host.h" | 14 #include "chrome/browser/renderer_host/render_view_host.h" |
15 #include "chrome/browser/tab_contents/tab_contents.h" | 15 #include "chrome/browser/tab_contents/tab_contents.h" |
16 #include "gfx/point.h" | 16 #include "gfx/point.h" |
17 #include "googleurl/src/gurl.h" | 17 #include "googleurl/src/gurl.h" |
18 #include "net/base/net_util.h" | 18 #include "net/base/net_util.h" |
19 #include "webkit/glue/webdropdata.h" | 19 #include "webkit/glue/webdropdata.h" |
20 #include "webkit/glue/window_open_disposition.h" | 20 #include "webkit/glue/window_open_disposition.h" |
21 | 21 |
| 22 using WebKit::WebDragOperationsMask; |
| 23 using WebKit::WebDragOperationNone; |
22 using WebKit::WebDragOperationCopy; | 24 using WebKit::WebDragOperationCopy; |
| 25 using WebKit::WebDragOperationLink; |
23 using WebKit::WebDragOperationMove; | 26 using WebKit::WebDragOperationMove; |
24 using WebKit::WebDragOperationsMask; | |
25 | 27 |
26 namespace { | 28 namespace { |
27 | 29 |
28 // A helper method for getting the preferred drop effect. | 30 // A helper method for getting the preferred drop effect. |
29 DWORD GetPreferredDropEffect(DWORD effect) { | 31 DWORD GetPreferredDropEffect(DWORD effect) { |
30 if (effect & DROPEFFECT_COPY) | 32 if (effect & DROPEFFECT_COPY) |
31 return DROPEFFECT_COPY; | 33 return DROPEFFECT_COPY; |
32 if (effect & DROPEFFECT_LINK) | 34 if (effect & DROPEFFECT_LINK) |
33 return DROPEFFECT_LINK; | 35 return DROPEFFECT_LINK; |
34 if (effect & DROPEFFECT_MOVE) | 36 if (effect & DROPEFFECT_MOVE) |
35 return DROPEFFECT_MOVE; | 37 return DROPEFFECT_MOVE; |
36 return DROPEFFECT_NONE; | 38 return DROPEFFECT_NONE; |
37 } | 39 } |
38 | 40 |
| 41 DWORD GetPreferredDragCursor(WebDragOperationsMask op) { |
| 42 if (op & WebDragOperationCopy) |
| 43 return DROPEFFECT_COPY; |
| 44 if (op & WebDragOperationLink) |
| 45 return DROPEFFECT_LINK; |
| 46 if (op & WebDragOperationMove) |
| 47 return DROPEFFECT_MOVE; |
| 48 return DROPEFFECT_NONE; |
| 49 } |
| 50 |
| 51 WebDragOperationsMask WinDragOpToWebDragOp(DWORD effect) { |
| 52 WebDragOperationsMask op = WebDragOperationNone; |
| 53 if (effect & DROPEFFECT_COPY) |
| 54 op = static_cast<WebDragOperationsMask>(op | WebDragOperationCopy); |
| 55 if (effect & DROPEFFECT_LINK) |
| 56 op = static_cast<WebDragOperationsMask>(op | WebDragOperationLink); |
| 57 if (effect & DROPEFFECT_MOVE) |
| 58 op = static_cast<WebDragOperationsMask>(op | WebDragOperationMove); |
| 59 return op; |
| 60 } |
| 61 |
39 } // anonymous namespace | 62 } // anonymous namespace |
40 | 63 |
41 // InterstitialDropTarget is like a BaseDropTarget implementation that | 64 // InterstitialDropTarget is like a BaseDropTarget implementation that |
42 // WebDropTarget passes through to if an interstitial is showing. Rather than | 65 // WebDropTarget passes through to if an interstitial is showing. Rather than |
43 // passing messages on to the renderer, we just check to see if there's a link | 66 // passing messages on to the renderer, we just check to see if there's a link |
44 // in the drop data and handle links as navigations. | 67 // in the drop data and handle links as navigations. |
45 class InterstitialDropTarget { | 68 class InterstitialDropTarget { |
46 public: | 69 public: |
47 explicit InterstitialDropTarget(TabContents* tab_contents) | 70 explicit InterstitialDropTarget(TabContents* tab_contents) |
48 : tab_contents_(tab_contents) {} | 71 : tab_contents_(tab_contents) {} |
(...skipping 29 matching lines...) Expand all Loading... |
78 DISALLOW_EVIL_CONSTRUCTORS(InterstitialDropTarget); | 101 DISALLOW_EVIL_CONSTRUCTORS(InterstitialDropTarget); |
79 }; | 102 }; |
80 | 103 |
81 /////////////////////////////////////////////////////////////////////////////// | 104 /////////////////////////////////////////////////////////////////////////////// |
82 // WebDropTarget, public: | 105 // WebDropTarget, public: |
83 | 106 |
84 WebDropTarget::WebDropTarget(HWND source_hwnd, TabContents* tab_contents) | 107 WebDropTarget::WebDropTarget(HWND source_hwnd, TabContents* tab_contents) |
85 : BaseDropTarget(source_hwnd), | 108 : BaseDropTarget(source_hwnd), |
86 tab_contents_(tab_contents), | 109 tab_contents_(tab_contents), |
87 current_rvh_(NULL), | 110 current_rvh_(NULL), |
88 is_drop_target_(false), | 111 drag_cursor_(WebDragOperationNone), |
89 interstitial_drop_target_(new InterstitialDropTarget(tab_contents)) { | 112 interstitial_drop_target_(new InterstitialDropTarget(tab_contents)) { |
90 } | 113 } |
91 | 114 |
92 WebDropTarget::~WebDropTarget() { | 115 WebDropTarget::~WebDropTarget() { |
93 } | 116 } |
94 | 117 |
95 DWORD WebDropTarget::OnDragEnter(IDataObject* data_object, | 118 DWORD WebDropTarget::OnDragEnter(IDataObject* data_object, |
96 DWORD key_state, | 119 DWORD key_state, |
97 POINT cursor_position, | 120 POINT cursor_position, |
98 DWORD effect) { | 121 DWORD effect) { |
99 current_rvh_ = tab_contents_->render_view_host(); | 122 current_rvh_ = tab_contents_->render_view_host(); |
100 | 123 |
101 // Don't pass messages to the renderer if an interstitial page is showing | 124 // Don't pass messages to the renderer if an interstitial page is showing |
102 // because we don't want the interstitial page to navigate. Instead, | 125 // because we don't want the interstitial page to navigate. Instead, |
103 // pass the messages on to a separate interstitial DropTarget handler. | 126 // pass the messages on to a separate interstitial DropTarget handler. |
104 if (tab_contents_->showing_interstitial_page()) | 127 if (tab_contents_->showing_interstitial_page()) |
105 return interstitial_drop_target_->OnDragEnter(data_object, effect); | 128 return interstitial_drop_target_->OnDragEnter(data_object, effect); |
106 | 129 |
107 // TODO(tc): PopulateWebDropData can be slow depending on what is in the | 130 // TODO(tc): PopulateWebDropData can be slow depending on what is in the |
108 // IDataObject. Maybe we can do this in a background thread. | 131 // IDataObject. Maybe we can do this in a background thread. |
109 WebDropData drop_data(GetDragIdentity()); | 132 WebDropData drop_data(GetDragIdentity()); |
110 WebDropData::PopulateWebDropData(data_object, &drop_data); | 133 WebDropData::PopulateWebDropData(data_object, &drop_data); |
111 | 134 |
112 if (drop_data.url.is_empty()) | 135 if (drop_data.url.is_empty()) |
113 OSExchangeDataProviderWin::GetPlainTextURL(data_object, &drop_data.url); | 136 OSExchangeDataProviderWin::GetPlainTextURL(data_object, &drop_data.url); |
114 | 137 |
115 is_drop_target_ = true; | 138 drag_cursor_ = WebDragOperationNone; |
116 | 139 |
117 POINT client_pt = cursor_position; | 140 POINT client_pt = cursor_position; |
118 ScreenToClient(GetHWND(), &client_pt); | 141 ScreenToClient(GetHWND(), &client_pt); |
119 tab_contents_->render_view_host()->DragTargetDragEnter(drop_data, | 142 tab_contents_->render_view_host()->DragTargetDragEnter(drop_data, |
120 gfx::Point(client_pt.x, client_pt.y), | 143 gfx::Point(client_pt.x, client_pt.y), |
121 gfx::Point(cursor_position.x, cursor_position.y), | 144 gfx::Point(cursor_position.x, cursor_position.y), |
122 static_cast<WebDragOperationsMask>(WebDragOperationCopy | | 145 WinDragOpToWebDragOp(effect)); |
123 WebDragOperationMove)); | |
124 // FIXME(snej): Send actual operation | |
125 | 146 |
126 // This is non-null if tab_contents_ is showing an ExtensionDOMUI with | 147 // This is non-null if tab_contents_ is showing an ExtensionDOMUI with |
127 // support for (at the moment experimental) drag and drop extensions. | 148 // support for (at the moment experimental) drag and drop extensions. |
128 if (tab_contents_->GetBookmarkDragDelegate()) { | 149 if (tab_contents_->GetBookmarkDragDelegate()) { |
129 OSExchangeData os_exchange_data(new OSExchangeDataProviderWin(data_object)); | 150 OSExchangeData os_exchange_data(new OSExchangeDataProviderWin(data_object)); |
130 BookmarkDragData bookmark_drag_data; | 151 BookmarkDragData bookmark_drag_data; |
131 if (bookmark_drag_data.Read(os_exchange_data)) | 152 if (bookmark_drag_data.Read(os_exchange_data)) |
132 tab_contents_->GetBookmarkDragDelegate()->OnDragEnter(bookmark_drag_data); | 153 tab_contents_->GetBookmarkDragDelegate()->OnDragEnter(bookmark_drag_data); |
133 } | 154 } |
134 | 155 |
(...skipping 11 matching lines...) Expand all Loading... |
146 OnDragEnter(data_object, key_state, cursor_position, effect); | 167 OnDragEnter(data_object, key_state, cursor_position, effect); |
147 | 168 |
148 if (tab_contents_->showing_interstitial_page()) | 169 if (tab_contents_->showing_interstitial_page()) |
149 return interstitial_drop_target_->OnDragOver(data_object, effect); | 170 return interstitial_drop_target_->OnDragOver(data_object, effect); |
150 | 171 |
151 POINT client_pt = cursor_position; | 172 POINT client_pt = cursor_position; |
152 ScreenToClient(GetHWND(), &client_pt); | 173 ScreenToClient(GetHWND(), &client_pt); |
153 tab_contents_->render_view_host()->DragTargetDragOver( | 174 tab_contents_->render_view_host()->DragTargetDragOver( |
154 gfx::Point(client_pt.x, client_pt.y), | 175 gfx::Point(client_pt.x, client_pt.y), |
155 gfx::Point(cursor_position.x, cursor_position.y), | 176 gfx::Point(cursor_position.x, cursor_position.y), |
156 static_cast<WebDragOperationsMask>(WebDragOperationCopy | | 177 WinDragOpToWebDragOp(effect)); |
157 WebDragOperationMove)); | |
158 // FIXME(snej): Send actual operation | |
159 | 178 |
160 if (tab_contents_->GetBookmarkDragDelegate()) { | 179 if (tab_contents_->GetBookmarkDragDelegate()) { |
161 OSExchangeData os_exchange_data(new OSExchangeDataProviderWin(data_object)); | 180 OSExchangeData os_exchange_data(new OSExchangeDataProviderWin(data_object)); |
162 BookmarkDragData bookmark_drag_data; | 181 BookmarkDragData bookmark_drag_data; |
163 if (bookmark_drag_data.Read(os_exchange_data)) | 182 if (bookmark_drag_data.Read(os_exchange_data)) |
164 tab_contents_->GetBookmarkDragDelegate()->OnDragOver(bookmark_drag_data); | 183 tab_contents_->GetBookmarkDragDelegate()->OnDragOver(bookmark_drag_data); |
165 } | 184 } |
166 | 185 |
167 if (!is_drop_target_) | 186 return GetPreferredDragCursor(drag_cursor_); |
168 return DROPEFFECT_NONE; | |
169 | |
170 return GetPreferredDropEffect(effect); | |
171 } | 187 } |
172 | 188 |
173 void WebDropTarget::OnDragLeave(IDataObject* data_object) { | 189 void WebDropTarget::OnDragLeave(IDataObject* data_object) { |
174 DCHECK(current_rvh_); | 190 DCHECK(current_rvh_); |
175 if (current_rvh_ != tab_contents_->render_view_host()) | 191 if (current_rvh_ != tab_contents_->render_view_host()) |
176 return; | 192 return; |
177 | 193 |
178 if (tab_contents_->showing_interstitial_page()) { | 194 if (tab_contents_->showing_interstitial_page()) { |
179 interstitial_drop_target_->OnDragLeave(data_object); | 195 interstitial_drop_target_->OnDragLeave(data_object); |
180 } else { | 196 } else { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 if (bookmark_drag_data.Read(os_exchange_data)) | 231 if (bookmark_drag_data.Read(os_exchange_data)) |
216 tab_contents_->GetBookmarkDragDelegate()->OnDrop(bookmark_drag_data); | 232 tab_contents_->GetBookmarkDragDelegate()->OnDrop(bookmark_drag_data); |
217 } | 233 } |
218 | 234 |
219 current_rvh_ = NULL; | 235 current_rvh_ = NULL; |
220 | 236 |
221 // We lie and always claim that the drop operation didn't happen because we | 237 // We lie and always claim that the drop operation didn't happen because we |
222 // don't want to wait for the renderer to respond. | 238 // don't want to wait for the renderer to respond. |
223 return DROPEFFECT_NONE; | 239 return DROPEFFECT_NONE; |
224 } | 240 } |
OLD | NEW |