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

Side by Side Diff: chrome/browser/views/tab_contents/tab_contents_drag_win.cc

Issue 1619023: Fix 2 drag-out problems:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 10 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
« no previous file with comments | « app/os_exchange_data_provider_win.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "chrome/browser/views/tab_contents/tab_contents_drag_win.h" 5 #include "chrome/browser/views/tab_contents/tab_contents_drag_win.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 8
9 #include "base/file_path.h" 9 #include "base/file_path.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 if (!drop_data.file_contents.empty()) 277 if (!drop_data.file_contents.empty())
278 PrepareDragForFileContents(drop_data, &data); 278 PrepareDragForFileContents(drop_data, &data);
279 if (!drop_data.text_html.empty()) 279 if (!drop_data.text_html.empty())
280 data.SetHtml(drop_data.text_html, drop_data.html_base_url); 280 data.SetHtml(drop_data.text_html, drop_data.html_base_url);
281 if (drop_data.url.is_valid()) 281 if (drop_data.url.is_valid())
282 PrepareDragForUrl(drop_data, &data); 282 PrepareDragForUrl(drop_data, &data);
283 if (!drop_data.plain_text.empty()) 283 if (!drop_data.plain_text.empty())
284 data.SetString(drop_data.plain_text); 284 data.SetString(drop_data.plain_text);
285 } 285 }
286 286
287 // Keep a local reference to drag_source_ in case that EndDragging is called
288 // before DoDragDrop returns.
289 scoped_refptr<WebDragSource> drag_source(drag_source_);
290
287 // We need to enable recursive tasks on the message loop so we can get 291 // We need to enable recursive tasks on the message loop so we can get
288 // updates while in the system DoDragDrop loop. 292 // updates while in the system DoDragDrop loop.
289 bool old_state = MessageLoop::current()->NestableTasksAllowed(); 293 bool old_state = MessageLoop::current()->NestableTasksAllowed();
294 MessageLoop::current()->SetNestableTasksAllowed(true);
290 DWORD effect; 295 DWORD effect;
291 MessageLoop::current()->SetNestableTasksAllowed(true);
292 DoDragDrop(OSExchangeDataProviderWin::GetIDataObject(data), drag_source_, 296 DoDragDrop(OSExchangeDataProviderWin::GetIDataObject(data), drag_source_,
293 web_drag_utils_win::WebDragOpToWinDragOp(ops), &effect); 297 web_drag_utils_win::WebDragOpToWinDragOp(ops), &effect);
298 MessageLoop::current()->SetNestableTasksAllowed(old_state);
299
294 // This works because WebDragSource::OnDragSourceDrop uses PostTask to 300 // This works because WebDragSource::OnDragSourceDrop uses PostTask to
295 // dispatch the actual event. 301 // dispatch the actual event.
296 drag_source_->set_effect(effect); 302 drag_source->set_effect(effect);
297 MessageLoop::current()->SetNestableTasksAllowed(old_state);
298 } 303 }
299 304
300 void TabContentsDragWin::EndDragging(bool restore_suspended_state) { 305 void TabContentsDragWin::EndDragging(bool restore_suspended_state) {
301 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); 306 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
302 307
303 if (drag_ended_) 308 if (drag_ended_)
304 return; 309 return;
305 drag_ended_ = true; 310 drag_ended_ = true;
306 311
307 if (restore_suspended_state) 312 if (restore_suspended_state)
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 348
344 void TabContentsDragWin::OnDataObjectDisposed() { 349 void TabContentsDragWin::OnDataObjectDisposed() {
345 DCHECK(drag_drop_thread_id_ == PlatformThread::CurrentId()); 350 DCHECK(drag_drop_thread_id_ == PlatformThread::CurrentId());
346 351
347 // The drag-and-drop thread is only closed after OLE is done with 352 // The drag-and-drop thread is only closed after OLE is done with
348 // DataObjectImpl. 353 // DataObjectImpl.
349 ChromeThread::PostTask( 354 ChromeThread::PostTask(
350 ChromeThread::UI, FROM_HERE, 355 ChromeThread::UI, FROM_HERE,
351 NewRunnableMethod(this, &TabContentsDragWin::CloseThread)); 356 NewRunnableMethod(this, &TabContentsDragWin::CloseThread));
352 } 357 }
OLDNEW
« no previous file with comments | « app/os_exchange_data_provider_win.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698