| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/web_contents/web_drag_dest_win.h" | 5 #include "content/browser/web_contents/web_drag_dest_win.h" | 
| 6 | 6 | 
| 7 #include <windows.h> | 7 #include <windows.h> | 
| 8 #include <shlobj.h> | 8 #include <shlobj.h> | 
| 9 | 9 | 
| 10 #include "content/browser/renderer_host/render_view_host_impl.h" | 10 #include "content/browser/renderer_host/render_view_host_impl.h" | 
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 108     delegate_->DragInitialize(web_contents_); | 108     delegate_->DragInitialize(web_contents_); | 
| 109 | 109 | 
| 110   // Don't pass messages to the renderer if an interstitial page is showing | 110   // Don't pass messages to the renderer if an interstitial page is showing | 
| 111   // because we don't want the interstitial page to navigate.  Instead, | 111   // because we don't want the interstitial page to navigate.  Instead, | 
| 112   // pass the messages on to a separate interstitial DropTarget handler. | 112   // pass the messages on to a separate interstitial DropTarget handler. | 
| 113   if (web_contents_->ShowingInterstitialPage()) | 113   if (web_contents_->ShowingInterstitialPage()) | 
| 114     return interstitial_drop_target_->OnDragEnter(data_object, effects); | 114     return interstitial_drop_target_->OnDragEnter(data_object, effects); | 
| 115 | 115 | 
| 116   // TODO(tc): PopulateWebDropData can be slow depending on what is in the | 116   // TODO(tc): PopulateWebDropData can be slow depending on what is in the | 
| 117   // IDataObject.  Maybe we can do this in a background thread. | 117   // IDataObject.  Maybe we can do this in a background thread. | 
| 118   WebDropData drop_data; | 118   drop_data_.reset(new WebDropData()); | 
| 119   WebDropData::PopulateWebDropData(data_object, &drop_data); | 119   WebDropData::PopulateWebDropData(data_object, drop_data_.get()); | 
| 120 | 120 | 
| 121   if (drop_data.url.is_empty()) | 121   if (drop_data_->url.is_empty()) | 
| 122     ui::OSExchangeDataProviderWin::GetPlainTextURL(data_object, &drop_data.url); | 122     ui::OSExchangeDataProviderWin::GetPlainTextURL(data_object, | 
|  | 123                                                    &drop_data_->url); | 
| 123 | 124 | 
| 124   drag_cursor_ = WebDragOperationNone; | 125   drag_cursor_ = WebDragOperationNone; | 
| 125 | 126 | 
| 126   POINT client_pt = cursor_position; | 127   POINT client_pt = cursor_position; | 
| 127   ScreenToClient(GetHWND(), &client_pt); | 128   ScreenToClient(GetHWND(), &client_pt); | 
| 128   web_contents_->GetRenderViewHost()->DragTargetDragEnter(drop_data, | 129   web_contents_->GetRenderViewHost()->DragTargetDragEnter(*drop_data_, | 
| 129       gfx::Point(client_pt.x, client_pt.y), | 130       gfx::Point(client_pt.x, client_pt.y), | 
| 130       gfx::Point(cursor_position.x, cursor_position.y), | 131       gfx::Point(cursor_position.x, cursor_position.y), | 
| 131       web_drag_utils_win::WinDragOpMaskToWebDragOpMask(effects)); | 132       web_drag_utils_win::WinDragOpMaskToWebDragOpMask(effects)); | 
| 132 | 133 | 
| 133   if (delegate_) | 134   if (delegate_) | 
| 134       delegate_->OnDragEnter(data_object); | 135       delegate_->OnDragEnter(data_object); | 
| 135 | 136 | 
| 136   // We lie here and always return a DROPEFFECT because we don't want to | 137   // We lie here and always return a DROPEFFECT because we don't want to | 
| 137   // wait for the IPC call to return. | 138   // wait for the IPC call to return. | 
| 138   return web_drag_utils_win::WebDragOpToWinDragOp(drag_cursor_); | 139   return web_drag_utils_win::WebDragOpToWinDragOp(drag_cursor_); | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 168     return; | 169     return; | 
| 169 | 170 | 
| 170   if (web_contents_->ShowingInterstitialPage()) { | 171   if (web_contents_->ShowingInterstitialPage()) { | 
| 171     interstitial_drop_target_->OnDragLeave(data_object); | 172     interstitial_drop_target_->OnDragLeave(data_object); | 
| 172   } else { | 173   } else { | 
| 173     web_contents_->GetRenderViewHost()->DragTargetDragLeave(); | 174     web_contents_->GetRenderViewHost()->DragTargetDragLeave(); | 
| 174   } | 175   } | 
| 175 | 176 | 
| 176   if (delegate_) | 177   if (delegate_) | 
| 177     delegate_->OnDragLeave(data_object); | 178     delegate_->OnDragLeave(data_object); | 
|  | 179 | 
|  | 180   drop_data_.reset(); | 
| 178 } | 181 } | 
| 179 | 182 | 
| 180 DWORD WebDragDest::OnDrop(IDataObject* data_object, | 183 DWORD WebDragDest::OnDrop(IDataObject* data_object, | 
| 181                           DWORD key_state, | 184                           DWORD key_state, | 
| 182                           POINT cursor_position, | 185                           POINT cursor_position, | 
| 183                           DWORD effect) { | 186                           DWORD effect) { | 
| 184   DCHECK(current_rvh_); | 187   DCHECK(current_rvh_); | 
| 185   if (current_rvh_ != web_contents_->GetRenderViewHost()) | 188   if (current_rvh_ != web_contents_->GetRenderViewHost()) | 
| 186     OnDragEnter(data_object, key_state, cursor_position, effect); | 189     OnDragEnter(data_object, key_state, cursor_position, effect); | 
| 187 | 190 | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 198       gfx::Point(cursor_position.x, cursor_position.y)); | 201       gfx::Point(cursor_position.x, cursor_position.y)); | 
| 199 | 202 | 
| 200   if (delegate_) | 203   if (delegate_) | 
| 201     delegate_->OnDrop(data_object); | 204     delegate_->OnDrop(data_object); | 
| 202 | 205 | 
| 203   current_rvh_ = NULL; | 206   current_rvh_ = NULL; | 
| 204 | 207 | 
| 205   // This isn't always correct, but at least it's a close approximation. | 208   // This isn't always correct, but at least it's a close approximation. | 
| 206   // For now, we always map a move to a copy to prevent potential data loss. | 209   // For now, we always map a move to a copy to prevent potential data loss. | 
| 207   DWORD drop_effect = web_drag_utils_win::WebDragOpToWinDragOp(drag_cursor_); | 210   DWORD drop_effect = web_drag_utils_win::WebDragOpToWinDragOp(drag_cursor_); | 
| 208   return drop_effect != DROPEFFECT_MOVE ? drop_effect : DROPEFFECT_COPY; | 211   DWORD result = drop_effect != DROPEFFECT_MOVE ? | 
|  | 212       drop_effect : DROPEFFECT_COPY; | 
|  | 213 | 
|  | 214   drop_data_.reset(); | 
|  | 215   return result; | 
| 209 } | 216 } | 
| OLD | NEW | 
|---|