tab_contents_drag_win.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_DRAG_WIN_H_ 6#define CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_DRAG_WIN_H_ 7#pragma once 8 9#include "base/ref_counted.h" 10#include "base/scoped_ptr.h" 11#include "base/threading/platform_thread.h" 12#include "third_party/skia/include/core/SkBitmap.h" 13#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" 14#include "ui/base/dragdrop/os_exchange_data_provider_win.h" 15#include "ui/gfx/point.h" 16 17class DragDropThread; 18class TabContentsViewWin; 19class WebDragSource; 20struct WebDropData; 21 22// Windows-specific drag-and-drop handling in TabContentsView. 23// If we are dragging a virtual file out of the browser, we use a background 24// thread to do the drag-and-drop because we do not want to run nested 25// message loop in the UI thread. For all other cases, the drag-and-drop happens 26// in the UI thread. 27class TabContentsDragWin 28 : public ui::DataObjectImpl::Observer, 29 public base::RefCountedThreadSafe<TabContentsDragWin> { 30 public: 31 explicit TabContentsDragWin(TabContentsViewWin* view); 32 virtual ~TabContentsDragWin(); 33 34 // Called on UI thread. 35 void StartDragging(const WebDropData& drop_data, 36 WebKit::WebDragOperationsMask ops, 37 const SkBitmap& image, 38 const gfx::Point& image_offset); 39 void CancelDrag(); 40 41 // DataObjectImpl::Observer implementation. 42 // Called on drag-and-drop thread. 43 virtual void OnWaitForData(); 44 virtual void OnDataObjectDisposed(); 45 46 private: 47 // Called on either UI thread or drag-and-drop thread. 48 void PrepareDragForDownload(const WebDropData& drop_data, 49 ui::OSExchangeData* data, 50 const GURL& page_url, 51 const std::string& page_encoding); 52 void PrepareDragForFileContents(const WebDropData& drop_data, 53 ui::OSExchangeData* data); 54 void PrepareDragForUrl(const WebDropData& drop_data, 55 ui::OSExchangeData* data); 56 void DoDragging(const WebDropData& drop_data, 57 WebKit::WebDragOperationsMask ops, 58 const GURL& page_url, 59 const std::string& page_encoding, 60 const SkBitmap& image, 61 const gfx::Point& image_offset); 62 63 // Called on drag-and-drop thread. 64 void StartBackgroundDragging(const WebDropData& drop_data, 65 WebKit::WebDragOperationsMask ops, 66 const GURL& page_url, 67 const std::string& page_encoding, 68 const SkBitmap& image, 69 const gfx::Point& image_offset); 70 // Called on UI thread. 71 void EndDragging(bool restore_suspended_state); 72 void CloseThread(); 73 74 // For debug check only. Access only on drag-and-drop thread. 75 base::PlatformThreadId drag_drop_thread_id_; 76 77 // All the member variables below are accessed on UI thread. 78 79 // Keep track of the TabContentsViewWin it is associated with. 80 TabContentsViewWin* view_; 81 82 // |drag_source_| is our callback interface passed to the system when we 83 // want to initiate a drag and drop operation. We use it to tell if a 84 // drag operation is happening. 85 scoped_refptr<WebDragSource> drag_source_; 86 87 // The thread used by the drag-out download. This is because we want to avoid 88 // running nested message loop in main UI thread. 89 scoped_ptr<DragDropThread> drag_drop_thread_; 90 91 // The flag to guard that EndDragging is not called twice. 92 bool drag_ended_; 93 94 // Keep track of the old suspended state of the drop target. 95 bool old_drop_target_suspended_state_; 96 97 DISALLOW_COPY_AND_ASSIGN(TabContentsDragWin); 98}; 99 100 101#endif // CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_DRAG_WIN_H_ 102