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

Side by Side Diff: chrome/browser/ui/views/tab_contents/native_tab_contents_view_aura.cc

Issue 8682029: Make drag and drop work on webpage. Also slightly modify drag drop workflow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merged with upstream Created 9 years 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/ui/views/tab_contents/native_tab_contents_view_aura.h" 5 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_view_aura.h"
6 6
7 #include "base/event_types.h"
8 #include "base/message_loop.h"
7 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_view_delegate .h" 9 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_view_delegate .h"
10 #include "content/browser/renderer_host/render_view_host.h"
8 #include "content/browser/renderer_host/render_widget_host_view_aura.h" 11 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
9 #include "content/browser/tab_contents/tab_contents.h" 12 #include "content/browser/tab_contents/tab_contents.h"
10 #include "content/browser/tab_contents/tab_contents_view.h" 13 #include "content/browser/tab_contents/tab_contents_view.h"
14 #include "ui/aura/client/aura_constants.h"
15 #include "ui/aura/client/drag_drop_client.h"
16 #include "ui/aura/desktop.h"
11 #include "ui/aura/event.h" 17 #include "ui/aura/event.h"
12 #include "ui/aura/window.h" 18 #include "ui/aura/window.h"
19 #include "ui/base/dragdrop/drag_drop_types.h"
20 #include "ui/base/dragdrop/os_exchange_data.h"
21 #include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
13 #include "ui/views/widget/widget.h" 22 #include "ui/views/widget/widget.h"
14 #include "views/views_delegate.h" 23 #include "views/views_delegate.h"
24 #include "webkit/glue/webdropdata.h"
25
26 namespace {
27
28 // Listens to all mouse drag events during a drag and drop and sends them to
29 // the renderer.
30 class WebDragSourceAura : public MessageLoopForUI::Observer {
31 public:
32 explicit WebDragSourceAura(NativeTabContentsViewAura* view)
33 : view_(view) {
34 MessageLoopForUI::current()->AddObserver(this);
35 }
36
37 virtual ~WebDragSourceAura() {
38 MessageLoopForUI::current()->RemoveObserver(this);
39 }
40
41 // MessageLoop::Observer implementation:
42 virtual base::EventStatus WillProcessEvent(
43 const base::NativeEvent& event) OVERRIDE {
44 return base::EVENT_CONTINUE;
45 }
46 virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE {
47 ui::EventType type = ui::EventTypeFromNative(event);
48 RenderViewHost* rvh = NULL;
49 switch (type) {
50 case ui::ET_MOUSE_DRAGGED:
51 rvh = view_->GetTabContents()->render_view_host();
52 if (rvh) {
53 gfx::Point screen_loc = ui::EventLocationFromNative(event);
54 gfx::Point client_loc = screen_loc;
55 aura::Window* window = static_cast<aura::Window*>(
Ben Goodger (Google) 2011/11/28 17:07:44 Cast unnecessary.
varunjain 2011/11/28 17:32:29 Done.
56 rvh->view()->GetNativeView());
57 aura::Window::ConvertPointToWindow(aura::Desktop::GetInstance(),
58 window, &client_loc);
59 rvh->DragSourceMovedTo(client_loc.x(), client_loc.y(),
60 screen_loc.x(), screen_loc.y());
61 }
62 break;
63 default:
64 break;
65 }
66 }
67
68 private:
69 NativeTabContentsViewAura* view_;
70
71 DISALLOW_COPY_AND_ASSIGN(WebDragSourceAura);
72 };
73
74 } // namespace
15 75
16 //////////////////////////////////////////////////////////////////////////////// 76 ////////////////////////////////////////////////////////////////////////////////
17 // NativeTabContentsViewAura, public: 77 // NativeTabContentsViewAura, public:
18 78
19 NativeTabContentsViewAura::NativeTabContentsViewAura( 79 NativeTabContentsViewAura::NativeTabContentsViewAura(
20 internal::NativeTabContentsViewDelegate* delegate) 80 internal::NativeTabContentsViewDelegate* delegate)
21 : views::NativeWidgetAura(delegate->AsNativeWidgetDelegate()), 81 : views::NativeWidgetAura(delegate->AsNativeWidgetDelegate()),
22 delegate_(delegate) { 82 delegate_(delegate),
83 current_drag_op_(WebKit::WebDragOperationNone) {
23 } 84 }
24 85
25 NativeTabContentsViewAura::~NativeTabContentsViewAura() { 86 NativeTabContentsViewAura::~NativeTabContentsViewAura() {
26 } 87 }
27 88
28 TabContents* NativeTabContentsViewAura::GetTabContents() const { 89 TabContents* NativeTabContentsViewAura::GetTabContents() const {
29 return delegate_->GetTabContents(); 90 return delegate_->GetTabContents();
30 } 91 }
31 92
32 void NativeTabContentsViewAura::EndDragging() {
33 delegate_->OnNativeTabContentsViewDraggingEnded();
34 // TODO(beng):
35 NOTIMPLEMENTED();
36 }
37
38 //////////////////////////////////////////////////////////////////////////////// 93 ////////////////////////////////////////////////////////////////////////////////
39 // NativeTabContentsViewAura, NativeTabContentsView implementation: 94 // NativeTabContentsViewAura, NativeTabContentsView implementation:
40 95
41 void NativeTabContentsViewAura::InitNativeTabContentsView() { 96 void NativeTabContentsViewAura::InitNativeTabContentsView() {
42 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); 97 views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
43 params.native_widget = this; 98 params.native_widget = this;
44 // We don't draw anything so we don't need a texture. 99 // We don't draw anything so we don't need a texture.
45 params.create_texture_for_layer = false; 100 params.create_texture_for_layer = false;
46 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 101 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
47 params.parent = NULL; 102 params.parent = NULL;
(...skipping 12 matching lines...) Expand all
60 // Nothing to do. 115 // Nothing to do.
61 } 116 }
62 117
63 RenderWidgetHostView* NativeTabContentsViewAura::CreateRenderWidgetHostView( 118 RenderWidgetHostView* NativeTabContentsViewAura::CreateRenderWidgetHostView(
64 RenderWidgetHost* render_widget_host) { 119 RenderWidgetHost* render_widget_host) {
65 RenderWidgetHostViewAura* view = 120 RenderWidgetHostViewAura* view =
66 new RenderWidgetHostViewAura(render_widget_host); 121 new RenderWidgetHostViewAura(render_widget_host);
67 view->InitAsChild(); 122 view->InitAsChild();
68 GetNativeView()->AddChild(view->GetNativeView()); 123 GetNativeView()->AddChild(view->GetNativeView());
69 view->Show(); 124 view->Show();
125
126 // We listen to drag drop events in the newly created view's window.
127 aura::Window* window = static_cast<aura::Window*>(view->GetNativeView());
128 DCHECK(window);
129 window->SetProperty(aura::kDragDropDelegateKey,
130 static_cast<aura::WindowDragDropDelegate*>(this));
70 return view; 131 return view;
71 } 132 }
72 133
73 gfx::NativeWindow NativeTabContentsViewAura::GetTopLevelNativeWindow() const { 134 gfx::NativeWindow NativeTabContentsViewAura::GetTopLevelNativeWindow() const {
74 // TODO(beng): 135 // TODO(beng):
75 NOTIMPLEMENTED(); 136 NOTIMPLEMENTED();
76 return NULL; 137 return NULL;
77 } 138 }
78 139
79 void NativeTabContentsViewAura::SetPageTitle(const string16& title) { 140 void NativeTabContentsViewAura::SetPageTitle(const string16& title) {
80 GetNativeView()->set_title(title); 141 GetNativeView()->set_title(title);
81 } 142 }
82 143
83 void NativeTabContentsViewAura::StartDragging(const WebDropData& drop_data, 144 void NativeTabContentsViewAura::StartDragging(const WebDropData& drop_data,
84 WebKit::WebDragOperationsMask ops, 145 WebKit::WebDragOperationsMask ops,
85 const SkBitmap& image, 146 const SkBitmap& image,
86 const gfx::Point& image_offset) { 147 const gfx::Point& image_offset) {
87 // TODO(beng): 148 aura::DragDropClient* client = static_cast<aura::DragDropClient*>(
88 NOTIMPLEMENTED(); 149 aura::Desktop::GetInstance()->GetProperty(
150 aura::kDesktopDragDropClientKey));
151 if (!client)
152 return;
153
154 ui::OSExchangeDataProviderAura* provider = new ui::OSExchangeDataProviderAura;
155 PrepareDragData(drop_data, provider);
156 if (!image.isNull())
157 provider->set_drag_image(image);
158 ui::OSExchangeData data(provider); // takes ownership of |provider|.
159
160 scoped_ptr<WebDragSourceAura> drag_source(new WebDragSourceAura(this));
161
162 // We need to enable recursive tasks on the message loop so we can get
163 // updates while in the system DoDragDrop loop.
164 bool old_state = MessageLoop::current()->NestableTasksAllowed();
165 MessageLoop::current()->SetNestableTasksAllowed(true);
166 int result_op = client->StartDragAndDrop(data, ConvertFromWeb(ops));
167 MessageLoop::current()->SetNestableTasksAllowed(old_state);
168
169 EndDrag(ConvertToWeb(result_op));
170 GetTabContents()->render_view_host()->DragSourceSystemDragEnded();
89 } 171 }
90 172
91 void NativeTabContentsViewAura::CancelDrag() { 173 void NativeTabContentsViewAura::CancelDrag() {
92 // TODO(beng): 174 aura::DragDropClient* client = static_cast<aura::DragDropClient*>(
93 NOTIMPLEMENTED(); 175 aura::Desktop::GetInstance()->GetProperty(
176 aura::kDesktopDragDropClientKey));
177 if (client)
178 client->DragCancel();
94 } 179 }
95 180
96 bool NativeTabContentsViewAura::IsDoingDrag() const { 181 bool NativeTabContentsViewAura::IsDoingDrag() const {
97 // TODO(beng): 182 aura::DragDropClient* client = static_cast<aura::DragDropClient*>(
98 NOTIMPLEMENTED(); 183 aura::Desktop::GetInstance()->GetProperty(
184 aura::kDesktopDragDropClientKey));
185 if (client)
186 return client->IsDragDropInProgress();
99 return false; 187 return false;
100 } 188 }
101 189
102 void NativeTabContentsViewAura::SetDragCursor( 190 void NativeTabContentsViewAura::SetDragCursor(
103 WebKit::WebDragOperation operation) { 191 WebKit::WebDragOperation operation) {
104 // TODO(beng): 192 current_drag_op_ = operation;
105 NOTIMPLEMENTED();
106 } 193 }
107 194
108 views::NativeWidget* NativeTabContentsViewAura::AsNativeWidget() { 195 views::NativeWidget* NativeTabContentsViewAura::AsNativeWidget() {
109 return this; 196 return this;
110 } 197 }
111 198
112 //////////////////////////////////////////////////////////////////////////////// 199 ////////////////////////////////////////////////////////////////////////////////
113 // NativeTabContentsViewAura, views::NativeWidgetAura overrides: 200 // NativeTabContentsViewAura, views::NativeWidgetAura overrides:
114 201
115 void NativeTabContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds, 202 void NativeTabContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds,
(...skipping 13 matching lines...) Expand all
129 break; 216 break;
130 default: 217 default:
131 // TODO(oshima): mouse wheel 218 // TODO(oshima): mouse wheel
132 break; 219 break;
133 } 220 }
134 } 221 }
135 // Pass all mouse event to renderer. 222 // Pass all mouse event to renderer.
136 return views::NativeWidgetAura::OnMouseEvent(event); 223 return views::NativeWidgetAura::OnMouseEvent(event);
137 } 224 }
138 225
226 void NativeTabContentsViewAura::OnDragEntered(
227 const aura::DropTargetEvent& event) {
228 WebDropData drop_data;
229 PrepareWebDropData(&drop_data, event.data());
230 WebKit::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
231
232 gfx::Point screen_pt = aura::Desktop::GetInstance()->last_mouse_location();
233 GetTabContents()->render_view_host()->DragTargetDragEnter(
234 drop_data, event.location(), screen_pt, op);
235 }
236
237 int NativeTabContentsViewAura::OnDragUpdated(
238 const aura::DropTargetEvent& event) {
239 WebKit::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
240 gfx::Point screen_pt = aura::Desktop::GetInstance()->last_mouse_location();
241 GetTabContents()->render_view_host()->DragTargetDragOver(
242 event.location(), screen_pt, op);
243 return ConvertFromWeb(current_drag_op_);
244 }
245
246 void NativeTabContentsViewAura::OnDragExited() {
247 GetTabContents()->render_view_host()->DragTargetDragLeave();
248 }
249
250 int NativeTabContentsViewAura::OnPerformDrop(
251 const aura::DropTargetEvent& event) {
252 GetTabContents()->render_view_host()->DragTargetDrop(
253 event.location(), aura::Desktop::GetInstance()->last_mouse_location());
254 return current_drag_op_;
255 }
256
Ben Goodger (Google) 2011/11/28 17:07:44 Can we add a section marker here: /////...etc //
varunjain 2011/11/28 17:32:29 Done.
257 void NativeTabContentsViewAura::PrepareDragData(
Ben Goodger (Google) 2011/11/28 17:07:44 Any of these functions that don't work with local
varunjain 2011/11/28 17:32:29 Done.
258 const WebDropData& drop_data,
259 ui::OSExchangeDataProviderAura* provider) {
260 if (!drop_data.plain_text.empty())
261 provider->SetString(drop_data.plain_text);
262 if (drop_data.url.is_valid())
263 provider->SetURL(drop_data.url, drop_data.url_title);
264 // TODO(varunjain): support other formats.
265 }
266
267 void NativeTabContentsViewAura::PrepareWebDropData(
268 WebDropData* drop_data,
269 const ui::OSExchangeData& data) {
Ben Goodger (Google) 2011/11/28 17:07:44 ditto
varunjain 2011/11/28 17:32:29 Done.
270 string16 plain_text, url_title;
271 GURL url;
272 data.GetString(&plain_text);
273 if (!plain_text.empty())
274 drop_data->plain_text = plain_text;
275 data.GetURLAndTitle(&url, &url_title);
276 if (url.is_valid()) {
277 drop_data->url = url;
278 drop_data->url_title = url_title;
279 }
280 // TODO(varunjain): support other formats.
281 }
282
283 int NativeTabContentsViewAura::ConvertFromWeb(
Ben Goodger (Google) 2011/11/28 17:07:44 ditto
varunjain 2011/11/28 17:32:29 Done.
284 WebKit::WebDragOperationsMask ops) {
285 int drag_op = ui::DragDropTypes::DRAG_NONE;
286 if (ops & WebKit::WebDragOperationCopy)
287 drag_op |= ui::DragDropTypes::DRAG_COPY;
288 if (ops & WebKit::WebDragOperationMove)
289 drag_op |= ui::DragDropTypes::DRAG_MOVE;
290 if (ops & WebKit::WebDragOperationLink)
291 drag_op |= ui::DragDropTypes::DRAG_LINK;
292 return drag_op;
293 }
294
295 WebKit::WebDragOperationsMask NativeTabContentsViewAura::ConvertToWeb(
296 int drag_op) {
Ben Goodger (Google) 2011/11/28 17:07:44 ditto
varunjain 2011/11/28 17:32:29 Done.
297 int web_drag_op = WebKit::WebDragOperationNone;
298 if (drag_op & ui::DragDropTypes::DRAG_COPY)
299 web_drag_op |= WebKit::WebDragOperationCopy;
300 if (drag_op & ui::DragDropTypes::DRAG_MOVE)
301 web_drag_op |= WebKit::WebDragOperationMove;
302 if (drag_op & ui::DragDropTypes::DRAG_LINK)
303 web_drag_op |= WebKit::WebDragOperationLink;
304 return (WebKit::WebDragOperationsMask) web_drag_op;
305 }
306
307 void NativeTabContentsViewAura::EndDrag(WebKit::WebDragOperationsMask ops) {
308 gfx::Point screen_loc = aura::Desktop::GetInstance()->last_mouse_location();
309 gfx::Point client_loc = screen_loc;
310 RenderViewHost* rvh = GetTabContents()->render_view_host();
311 aura::Window* window = static_cast<aura::Window*>(
Ben Goodger (Google) 2011/11/28 17:07:44 This cast isn't necessary. NativeView typedefs to
varunjain 2011/11/28 17:32:29 Done.
312 rvh->view()->GetNativeView());
313 aura::Window::ConvertPointToWindow(aura::Desktop::GetInstance(),
314 window, &client_loc);
315 rvh->DragSourceEndedAt(client_loc.x(), client_loc.y(), screen_loc.x(),
316 screen_loc.y(), ops);
317 }
318
139 //////////////////////////////////////////////////////////////////////////////// 319 ////////////////////////////////////////////////////////////////////////////////
140 // NativeTabContentsView, public: 320 // NativeTabContentsView, public:
141 321
142 // static 322 // static
143 NativeTabContentsView* NativeTabContentsView::CreateNativeTabContentsView( 323 NativeTabContentsView* NativeTabContentsView::CreateNativeTabContentsView(
144 internal::NativeTabContentsViewDelegate* delegate) { 324 internal::NativeTabContentsViewDelegate* delegate) {
145 return new NativeTabContentsViewAura(delegate); 325 return new NativeTabContentsViewAura(delegate);
146 } 326 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698