OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <map> | 5 #include <map> |
6 #include <memory> | 6 #include <memory> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 // Include views_test_base.h first because the definition of None in X.h | 9 // Include views_test_base.h first because the definition of None in X.h |
10 // conflicts with the definition of None in gtest-type-util.h | 10 // conflicts with the definition of None in gtest-type-util.h |
11 #include "ui/views/test/views_test_base.h" | 11 #include "ui/views/test/views_test_base.h" |
12 | 12 |
13 #include "base/location.h" | 13 #include "base/location.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
16 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
17 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
18 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
19 #include "base/threading/thread_task_runner_handle.h" | 19 #include "base/threading/thread_task_runner_handle.h" |
20 #include "ui/aura/client/drag_drop_delegate.h" | 20 #include "ui/aura/client/drag_drop_delegate.h" |
21 #include "ui/aura/test/test_screen.h" | 21 #include "ui/aura/test/test_screen.h" |
22 #include "ui/aura/window.h" | 22 #include "ui/aura/window.h" |
23 #include "ui/aura/window_tree_host.h" | 23 #include "ui/aura/window_tree_host.h" |
24 #include "ui/base/dragdrop/os_exchange_data.h" | 24 #include "ui/base/dragdrop/os_exchange_data.h" |
25 #include "ui/base/x/x11_util.h" | 25 #include "ui/base/x/x11_util.h" |
26 #include "ui/events/event_utils.h" | 26 #include "ui/events/event_utils.h" |
27 #include "ui/gfx/x/x11_atom_cache.h" | |
28 #include "ui/gfx/x/x11_types.h" | 27 #include "ui/gfx/x/x11_types.h" |
29 #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h" | 28 #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h" |
30 #include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h" | 29 #include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h" |
31 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" | 30 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" |
32 #include "ui/views/widget/desktop_aura/x11_move_loop.h" | 31 #include "ui/views/widget/desktop_aura/x11_move_loop.h" |
33 #include "ui/views/widget/widget.h" | 32 #include "ui/views/widget/widget.h" |
34 | 33 |
35 #include <X11/Xlib.h> | 34 #include <X11/Xlib.h> |
36 | 35 |
37 namespace views { | 36 namespace views { |
38 | 37 |
39 namespace { | 38 namespace { |
40 | 39 |
41 const char* kAtomsToCache[] = { | |
42 "XdndActionCopy", | |
43 "XdndDrop", | |
44 "XdndEnter", | |
45 "XdndFinished", | |
46 "XdndLeave", | |
47 "XdndPosition", | |
48 "XdndStatus", | |
49 "XdndTypeList", | |
50 NULL | |
51 }; | |
52 | |
53 class TestDragDropClient; | 40 class TestDragDropClient; |
54 | 41 |
55 // Collects messages which would otherwise be sent to |xid_| via | 42 // Collects messages which would otherwise be sent to |xid_| via |
56 // SendXClientEvent(). | 43 // SendXClientEvent(). |
57 class ClientMessageEventCollector { | 44 class ClientMessageEventCollector { |
58 public: | 45 public: |
59 ClientMessageEventCollector(::Window xid, TestDragDropClient* client); | 46 ClientMessageEventCollector(::Window xid, TestDragDropClient* client); |
60 virtual ~ClientMessageEventCollector(); | 47 virtual ~ClientMessageEventCollector(); |
61 | 48 |
62 // Returns true if |events_| is non-empty. | 49 // Returns true if |events_| is non-empty. |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 // DesktopDragDropClientAuraX11: | 175 // DesktopDragDropClientAuraX11: |
189 void SendXClientEvent(::Window xid, XEvent* event) override; | 176 void SendXClientEvent(::Window xid, XEvent* event) override; |
190 | 177 |
191 // The XID of the window which initiated the drag. | 178 // The XID of the window which initiated the drag. |
192 ::Window source_xid_; | 179 ::Window source_xid_; |
193 | 180 |
194 // Map of ::Windows to the collector which intercepts XClientMessageEvents | 181 // Map of ::Windows to the collector which intercepts XClientMessageEvents |
195 // for that window. | 182 // for that window. |
196 std::map< ::Window, ClientMessageEventCollector*> collectors_; | 183 std::map< ::Window, ClientMessageEventCollector*> collectors_; |
197 | 184 |
198 ui::X11AtomCache atom_cache_; | |
199 | |
200 DISALLOW_COPY_AND_ASSIGN(TestDragDropClient); | 185 DISALLOW_COPY_AND_ASSIGN(TestDragDropClient); |
201 }; | 186 }; |
202 | 187 |
203 /////////////////////////////////////////////////////////////////////////////// | 188 /////////////////////////////////////////////////////////////////////////////// |
204 // ClientMessageEventCollector | 189 // ClientMessageEventCollector |
205 | 190 |
206 ClientMessageEventCollector::ClientMessageEventCollector( | 191 ClientMessageEventCollector::ClientMessageEventCollector( |
207 ::Window xid, | 192 ::Window xid, |
208 TestDragDropClient* client) | 193 TestDragDropClient* client) |
209 : xid_(xid), | 194 : xid_(xid), |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 // static | 288 // static |
304 const int TestDragDropClient::kMouseMoveX = 100; | 289 const int TestDragDropClient::kMouseMoveX = 100; |
305 | 290 |
306 // static | 291 // static |
307 const int TestDragDropClient::kMouseMoveY = 200; | 292 const int TestDragDropClient::kMouseMoveY = 200; |
308 | 293 |
309 TestDragDropClient::TestDragDropClient( | 294 TestDragDropClient::TestDragDropClient( |
310 aura::Window* window, | 295 aura::Window* window, |
311 DesktopNativeCursorManager* cursor_manager) | 296 DesktopNativeCursorManager* cursor_manager) |
312 : SimpleTestDragDropClient(window, cursor_manager), | 297 : SimpleTestDragDropClient(window, cursor_manager), |
313 source_xid_(window->GetHost()->GetAcceleratedWidget()), | 298 source_xid_(window->GetHost()->GetAcceleratedWidget()) {} |
314 atom_cache_(gfx::GetXDisplay(), kAtomsToCache) { | |
315 } | |
316 | 299 |
317 TestDragDropClient::~TestDragDropClient() { | 300 TestDragDropClient::~TestDragDropClient() { |
318 } | 301 } |
319 | 302 |
320 Atom TestDragDropClient::GetAtom(const char* name) { | 303 Atom TestDragDropClient::GetAtom(const char* name) { |
321 return atom_cache_.GetAtom(name); | 304 return ui::GetAtom(name); |
322 } | 305 } |
323 | 306 |
324 bool TestDragDropClient::MessageHasType(const XClientMessageEvent& event, | 307 bool TestDragDropClient::MessageHasType(const XClientMessageEvent& event, |
325 const char* type) { | 308 const char* type) { |
326 return event.message_type == atom_cache_.GetAtom(type); | 309 return event.message_type == GetAtom(type); |
327 } | 310 } |
328 | 311 |
329 void TestDragDropClient::SetEventCollectorFor( | 312 void TestDragDropClient::SetEventCollectorFor( |
330 ::Window xid, | 313 ::Window xid, |
331 ClientMessageEventCollector* collector) { | 314 ClientMessageEventCollector* collector) { |
332 if (collector) | 315 if (collector) |
333 collectors_[xid] = collector; | 316 collectors_[xid] = collector; |
334 else | 317 else |
335 collectors_.erase(xid); | 318 collectors_.erase(xid); |
336 } | 319 } |
337 | 320 |
338 void TestDragDropClient::OnStatus(XID target_window, | 321 void TestDragDropClient::OnStatus(XID target_window, |
339 bool will_accept_drop, | 322 bool will_accept_drop, |
340 ::Atom accepted_action) { | 323 ::Atom accepted_action) { |
341 XClientMessageEvent event; | 324 XClientMessageEvent event; |
342 event.message_type = atom_cache_.GetAtom("XdndStatus"); | 325 event.message_type = GetAtom("XdndStatus"); |
343 event.format = 32; | 326 event.format = 32; |
344 event.window = source_xid_; | 327 event.window = source_xid_; |
345 event.data.l[0] = target_window; | 328 event.data.l[0] = target_window; |
346 event.data.l[1] = will_accept_drop ? 1 : 0; | 329 event.data.l[1] = will_accept_drop ? 1 : 0; |
347 event.data.l[2] = 0; | 330 event.data.l[2] = 0; |
348 event.data.l[3] = 0; | 331 event.data.l[3] = 0; |
349 event.data.l[4] = accepted_action; | 332 event.data.l[4] = accepted_action; |
350 OnXdndStatus(event); | 333 OnXdndStatus(event); |
351 } | 334 } |
352 | 335 |
353 void TestDragDropClient::OnFinished(XID target_window, | 336 void TestDragDropClient::OnFinished(XID target_window, |
354 bool accepted_drop, | 337 bool accepted_drop, |
355 ::Atom performed_action) { | 338 ::Atom performed_action) { |
356 XClientMessageEvent event; | 339 XClientMessageEvent event; |
357 event.message_type = atom_cache_.GetAtom("XdndFinished"); | 340 event.message_type = GetAtom("XdndFinished"); |
358 event.format = 32; | 341 event.format = 32; |
359 event.window = source_xid_; | 342 event.window = source_xid_; |
360 event.data.l[0] = target_window; | 343 event.data.l[0] = target_window; |
361 event.data.l[1] = accepted_drop ? 1 : 0; | 344 event.data.l[1] = accepted_drop ? 1 : 0; |
362 event.data.l[2] = performed_action; | 345 event.data.l[2] = performed_action; |
363 event.data.l[3] = 0; | 346 event.data.l[3] = 0; |
364 event.data.l[4] = 0; | 347 event.data.l[4] = 0; |
365 OnXdndFinished(event); | 348 OnXdndFinished(event); |
366 } | 349 } |
367 | 350 |
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
999 // the aura::client::DragDropDelegate is properly notified. | 982 // the aura::client::DragDropDelegate is properly notified. |
1000 TEST_F(DesktopDragDropClientAuraX11ChromeSourceTargetTest, CtrlPressed) { | 983 TEST_F(DesktopDragDropClientAuraX11ChromeSourceTargetTest, CtrlPressed) { |
1001 base::ThreadTaskRunnerHandle::Get()->PostTask( | 984 base::ThreadTaskRunnerHandle::Get()->PostTask( |
1002 FROM_HERE, | 985 FROM_HERE, |
1003 base::Bind(&ChromeSourceTargetStep2, client(), ui::EF_CONTROL_DOWN)); | 986 base::Bind(&ChromeSourceTargetStep2, client(), ui::EF_CONTROL_DOWN)); |
1004 int result = StartDragAndDrop(); | 987 int result = StartDragAndDrop(); |
1005 EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result); | 988 EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, result); |
1006 } | 989 } |
1007 | 990 |
1008 } // namespace views | 991 } // namespace views |
OLD | NEW |