Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(995)

Side by Side Diff: content/browser/web_contents/web_contents_drag_win.cc

Issue 13979012: Fix deadlock between UI thread and drag and drop thread on Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add initializer Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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_contents_drag_win.h" 5 #include "content/browser/web_contents/web_contents_drag_win.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 8
9 #include <string> 9 #include <string>
10 10
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 HWND native_window = web_contents_->GetView()->GetNativeView(); 354 HWND native_window = web_contents_->GetView()->GetNativeView();
355 355
356 // We need to enable recursive tasks on the message loop so we can get 356 // We need to enable recursive tasks on the message loop so we can get
357 // updates while in the system DoDragDrop loop. 357 // updates while in the system DoDragDrop loop.
358 DWORD effect = DROPEFFECT_NONE; 358 DWORD effect = DROPEFFECT_NONE;
359 if (run_do_drag_drop) { 359 if (run_do_drag_drop) {
360 // Keep a reference count such that |drag_source_| will not get deleted 360 // Keep a reference count such that |drag_source_| will not get deleted
361 // if the contents view window is gone in the nested message loop invoked 361 // if the contents view window is gone in the nested message loop invoked
362 // from DoDragDrop. 362 // from DoDragDrop.
363 scoped_refptr<WebDragSource> retain_this(drag_source_); 363 scoped_refptr<WebDragSource> retain_this(drag_source_);
364 drag_source_->set_data(&data);
365 data.SetInDragLoop(true);
364 366
365 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); 367 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
366 DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data), 368 DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data),
367 drag_source_, 369 drag_source_,
368 WebDragOpMaskToWinDragOpMask(ops), 370 WebDragOpMaskToWinDragOpMask(ops),
369 &effect); 371 &effect);
372 drag_source_->set_data(NULL);
sky 2013/04/26 22:10:22 How do we know 'this' has been destroyed once the
dcheng 2013/04/26 22:20:10 Updated to the retained scoped_refptr on the stack
370 } 373 }
371 374
372 // Bail out immediately if the contents view window is gone. 375 // Bail out immediately if the contents view window is gone.
373 if (!IsWindow(native_window)) 376 if (!IsWindow(native_window))
374 return false; 377 return false;
375 378
376 // Normally, the drop and dragend events get dispatched in the system 379 // Normally, the drop and dragend events get dispatched in the system
377 // DoDragDrop message loop so it'd be too late to set the effect to send back 380 // DoDragDrop message loop so it'd be too late to set the effect to send back
378 // to the renderer here. However, we use PostTask to delay the execution of 381 // to the renderer here. However, we use PostTask to delay the execution of
379 // WebDragSource::OnDragSourceDrop, which means that the delayed dragend 382 // WebDragSource::OnDragSourceDrop, which means that the delayed dragend
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 FROM_HERE, 434 FROM_HERE,
432 base::Bind(&WebContentsDragWin::CloseThread, this)); 435 base::Bind(&WebContentsDragWin::CloseThread, this));
433 } 436 }
434 437
435 // static 438 // static
436 void WebContentsDragWin::DisableDragDropForTesting() { 439 void WebContentsDragWin::DisableDragDropForTesting() {
437 run_do_drag_drop = false; 440 run_do_drag_drop = false;
438 } 441 }
439 442
440 } // namespace content 443 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/web_contents/web_drag_source_win.h » ('j') | content/browser/web_contents/web_drag_source_win.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698