Chromium Code Reviews| Index: ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc |
| diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc |
| index f471b3254bf1825823c32f48e1c72e1105b0d757..fc581e201d781c71844f10973ed056e015a68bad 100644 |
| --- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc |
| +++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc |
| @@ -17,11 +17,13 @@ DesktopDragDropClientWin::DesktopDragDropClientWin( |
| aura::Window* root_window, |
| HWND window) |
| : drag_drop_in_progress_(false), |
| - drag_operation_(0) { |
| + drag_operation_(0), |
| + weak_factory_(this) { |
| drop_target_ = new DesktopDropTargetWin(root_window, window); |
| } |
| DesktopDragDropClientWin::~DesktopDragDropClientWin() { |
| + DragCancel(); |
| } |
| int DesktopDragDropClientWin::StartDragAndDrop( |
| @@ -34,13 +36,18 @@ int DesktopDragDropClientWin::StartDragAndDrop( |
| drag_drop_in_progress_ = true; |
| drag_operation_ = operation; |
| + base::WeakPtr<DesktopDragDropClientWin> alive(weak_factory_.GetWeakPtr()); |
| + |
| drag_source_ = new ui::DragSourceWin; |
| + scoped_refptr<ui::DragSourceWin> drag_source_copy = drag_source_; |
| + |
| DWORD effect; |
| HRESULT result = DoDragDrop( |
| ui::OSExchangeDataProviderWin::GetIDataObject(data), drag_source_.get(), |
| ui::DragDropTypes::DragOperationToDropEffect(operation), &effect); |
| - drag_drop_in_progress_ = false; |
| + if (alive) |
| + drag_drop_in_progress_ = false; |
| if (result != DRAGDROP_S_DROP) |
| effect = DROPEFFECT_NONE; |
| @@ -57,7 +64,8 @@ void DesktopDragDropClientWin::Drop(aura::Window* target, |
| } |
| void DesktopDragDropClientWin::DragCancel() { |
| - drag_source_->CancelDrag(); |
| + if (drag_drop_in_progress_) |
|
sky
2014/12/15 20:44:13
Should this be a DCHECK?
pkotwicz
2014/12/15 21:54:11
In patch set #2, I moved the check to the destruct
|
| + drag_source_->CancelDrag(); |
| drag_operation_ = 0; |
| } |