| 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 |