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