Index: ui/views/mus/drag_interactive_uitest.cc |
diff --git a/ui/views/mus/drag_interactive_uitest.cc b/ui/views/mus/drag_interactive_uitest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dc272c449ad93d264cc6d1f0fad26a02cb45e399 |
--- /dev/null |
+++ b/ui/views/mus/drag_interactive_uitest.cc |
@@ -0,0 +1,201 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/strings/utf_string_conversions.h" |
+#include "services/ui/public/interfaces/window_server_test.mojom.h" |
+#include "services/ui/public/interfaces/window_tree_constants.mojom.h" |
+#include "ui/aura/mus/in_flight_change.h" |
+#include "ui/aura/mus/window_tree_host_mus.h" |
+#include "ui/aura/test/mus/change_completion_waiter.h" |
+#include "ui/events/event.h" |
+#include "ui/events/event_utils.h" |
+#include "ui/views/mus/mus_client.h" |
+#include "ui/views/test/widget_test.h" |
+#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" |
+#include "ui/views/widget/widget.h" |
+ |
+namespace views { |
+namespace test { |
+namespace { |
+ |
+// A view used in DragTestInteractive.DragTest as a drag source. |
+class DraggableView : public views::View { |
+ public: |
+ DraggableView() {} |
+ ~DraggableView() override {} |
+ |
+ // views::View overrides: |
+ int GetDragOperations(const gfx::Point& press_pt) override { |
+ return ui::DragDropTypes::DRAG_MOVE; |
+ } |
+ void WriteDragData(const gfx::Point& press_pt, |
+ OSExchangeData* data) override { |
+ data->SetString(base::UTF8ToUTF16("test")); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(DraggableView); |
+}; |
+ |
+// A view used in DragTestInteractive.DragTest as a drop target. |
+class TargetView : public views::View { |
+ public: |
+ TargetView() : dropped_(false) {} |
+ ~TargetView() override {} |
+ |
+ void WaitForDropped(base::Closure quit_closure) { |
+ if (dropped_) { |
+ quit_closure.Run(); |
+ return; |
+ } |
+ |
+ quit_closure_ = quit_closure; |
+ } |
+ |
+ // views::View overrides: |
+ bool GetDropFormats( |
+ int* formats, |
+ std::set<ui::Clipboard::FormatType>* format_types) override { |
+ *formats = ui::OSExchangeData::STRING; |
+ return true; |
+ } |
+ bool AreDropTypesRequired() override { return false; } |
+ bool CanDrop(const OSExchangeData& data) override { return true; } |
+ int OnDragUpdated(const ui::DropTargetEvent& event) override { |
+ return ui::DragDropTypes::DRAG_MOVE; |
+ } |
+ int OnPerformDrop(const ui::DropTargetEvent& event) override { |
+ dropped_ = true; |
+ if (quit_closure_) |
+ quit_closure_.Run(); |
+ return ui::DragDropTypes::DRAG_MOVE; |
+ } |
+ |
+ bool dropped() const { return dropped_; } |
+ |
+ private: |
+ bool dropped_; |
+ |
+ base::Closure quit_closure_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TargetView); |
+}; |
+ |
+std::unique_ptr<ui::PointerEvent> CreateMouseMoveEvent(int x, int y) { |
+ return base::MakeUnique<ui::PointerEvent>(ui::MouseEvent( |
+ ui::ET_MOUSE_MOVED, gfx::Point(x, y), gfx::Point(x, y), |
+ ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_NONE)); |
+} |
+ |
+std::unique_ptr<ui::PointerEvent> CreateMouseDownEvent(int x, int y) { |
+ return base::MakeUnique<ui::PointerEvent>( |
+ ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(x, y), gfx::Point(x, y), |
+ ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, |
+ ui::EF_LEFT_MOUSE_BUTTON)); |
+} |
+ |
+std::unique_ptr<ui::PointerEvent> CreateMouseUpEvent(int x, int y) { |
+ return base::MakeUnique<ui::PointerEvent>( |
+ ui::MouseEvent(ui::ET_MOUSE_RELEASED, gfx::Point(x, y), gfx::Point(x, y), |
+ ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, |
+ ui::EF_LEFT_MOUSE_BUTTON)); |
+} |
+ |
+} // namespace |
+ |
+using DragTestInteractive = WidgetTest; |
+ |
+// Dispatch of events is asynchronous so most of DragTestInteractive.DragTest |
+// consists of callback functions which will perform an action after the |
+// previous action has completed. |
+void DragTest_Part3(int64_t display_id, |
+ const base::Closure& quit_closure, |
+ bool result) { |
+ EXPECT_TRUE(result); |
+ quit_closure.Run(); |
+} |
+ |
+void DragTest_Part2(int64_t display_id, |
+ const base::Closure& quit_closure, |
+ bool result) { |
+ EXPECT_TRUE(result); |
+ if (!result) |
+ quit_closure.Run(); |
+ |
+ ui::mojom::WindowServerTest* server_test = |
+ MusClient::Get()->GetTestingInterface(); |
+ server_test->DispatchEvent( |
+ display_id, CreateMouseUpEvent(30, 30), |
+ base::Bind(&DragTest_Part3, display_id, quit_closure)); |
+} |
+ |
+void DragTest_Part1(int64_t display_id, |
+ const base::Closure& quit_closure, |
+ bool result) { |
+ EXPECT_TRUE(result); |
+ if (!result) |
+ quit_closure.Run(); |
+ |
+ ui::mojom::WindowServerTest* server_test = |
+ MusClient::Get()->GetTestingInterface(); |
+ server_test->DispatchEvent( |
+ display_id, CreateMouseMoveEvent(30, 30), |
+ base::Bind(&DragTest_Part2, display_id, quit_closure)); |
+} |
+ |
+TEST_F(DragTestInteractive, DragTest) { |
+ Widget* source_widget = CreateTopLevelFramelessPlatformWidget(); |
+ View* source_view = new DraggableView; |
+ source_widget->SetContentsView(source_view); |
+ source_widget->Show(); |
+ |
+ aura::test::ChangeCompletionWaiter source_waiter( |
+ MusClient::Get()->window_tree_client(), aura::ChangeType::BOUNDS, true); |
+ source_widget->SetBounds(gfx::Rect(0, 0, 20, 20)); |
+ source_waiter.Wait(); |
+ |
+ Widget* target_widget = CreateTopLevelFramelessPlatformWidget(); |
+ TargetView* target_view = new TargetView; |
+ target_widget->SetContentsView(target_view); |
+ target_widget->Show(); |
+ |
+ aura::test::ChangeCompletionWaiter target_waiter( |
+ MusClient::Get()->window_tree_client(), aura::ChangeType::BOUNDS, true); |
+ target_widget->SetBounds(gfx::Rect(20, 20, 20, 20)); |
+ target_waiter.Wait(); |
+ |
+ auto* dnwa = |
+ static_cast<DesktopNativeWidgetAura*>(source_widget->native_widget()); |
+ ASSERT_TRUE(dnwa); |
+ auto* wth = static_cast<aura::WindowTreeHostMus*>(dnwa->host()); |
+ ASSERT_TRUE(wth); |
+ int64_t display_id = wth->display_id(); |
+ |
+ { |
+ base::RunLoop run_loop; |
+ ui::mojom::WindowServerTest* server_test = |
+ MusClient::Get()->GetTestingInterface(); |
+ server_test->DispatchEvent( |
+ display_id, CreateMouseDownEvent(10, 10), |
+ base::Bind(&DragTest_Part1, display_id, run_loop.QuitClosure())); |
+ |
+ run_loop.Run(); |
+ } |
+ |
+ // Wait for the event dispatch to cause the final drop signal. |
+ { |
+ base::RunLoop run_loop; |
+ target_view->WaitForDropped(run_loop.QuitClosure()); |
+ run_loop.Run(); |
+ } |
+ |
+ EXPECT_TRUE(target_view->dropped()); |
+ |
+ target_widget->Close(); |
+ source_widget->Close(); |
+ RunPendingMessages(); |
+} |
+ |
+} // namespace test |
+} // namespace views |