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

Unified Diff: ash/wm/workspace/multi_window_resize_controller_unittest.cc

Issue 771543002: Improve the logic for hiding the multi-window resize handle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@fix_multi_window
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/wm/workspace/multi_window_resize_controller.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/workspace/multi_window_resize_controller_unittest.cc
diff --git a/ash/wm/workspace/multi_window_resize_controller_unittest.cc b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
index ada064f721eb8af6dae02b2c24f53ed5021888e1..f4875ee6c7105271aeb47cb02eafeb20c2fbbdc6 100644
--- a/ash/wm/workspace/multi_window_resize_controller_unittest.cc
+++ b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
@@ -4,6 +4,8 @@
#include "ash/wm/workspace/multi_window_resize_controller.h"
+#include "ash/ash_constants.h"
+#include "ash/frame/custom_frame_view_ash.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "ash/test/shell_test_api.h"
@@ -17,9 +19,34 @@
#include "ui/events/test/event_generator.h"
#include "ui/gfx/screen.h"
#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_delegate.h"
namespace ash {
+namespace {
+
+// WidgetDelegate for a resizable widget which creates a NonClientFrameView
+// which is actually used in Ash.
+class TestWidgetDelegate : public views::WidgetDelegateView {
+ public:
+ TestWidgetDelegate() {}
+ ~TestWidgetDelegate() override {}
+
+ bool CanResize() const override {
+ return true;
+ }
+
+ views::NonClientFrameView* CreateNonClientFrameView(
+ views::Widget* widget) override {
+ return new CustomFrameViewAsh(widget);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestWidgetDelegate);
+};
+
+} // namespace
+
class MultiWindowResizeControllerTest : public test::AshTestBase {
public:
MultiWindowResizeControllerTest() : resize_controller_(NULL) {}
@@ -59,10 +86,6 @@ class MultiWindowResizeControllerTest : public test::AshTestBase {
return resize_controller_->show_timer_.IsRunning();
}
- bool HasPendingHide() {
- return resize_controller_->hide_timer_.IsRunning();
- }
-
void Hide() {
resize_controller_->Hide();
}
@@ -109,13 +132,11 @@ TEST_F(MultiWindowResizeControllerTest, BasicTests) {
generator.MoveMouseTo(w1->bounds().CenterPoint());
EXPECT_TRUE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
// Force a show now.
ShowNow();
EXPECT_FALSE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
EXPECT_FALSE(IsOverWindows(gfx::Point(200, 200)));
@@ -123,7 +144,79 @@ TEST_F(MultiWindowResizeControllerTest, BasicTests) {
resize_controller_->MouseMovedOutOfHost();
EXPECT_FALSE(HasPendingShow());
EXPECT_FALSE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
+}
+
+// Test the behavior of IsOverWindows().
+TEST_F(MultiWindowResizeControllerTest, IsOverWindows) {
+ // Create the following layout:
+ // __________________
+ // | w1 | w2 |
+ // | |________|
+ // | | w3 |
+ // |________|________|
+ scoped_ptr<views::Widget> w1(new views::Widget);
+ views::Widget::InitParams params1;
+ params1.delegate = new TestWidgetDelegate;
+ params1.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params1.bounds = gfx::Rect(100, 200);
+ params1.context = CurrentContext();
+ w1->Init(params1);
+ w1->Show();
+
+ scoped_ptr<views::Widget> w2(new views::Widget);
+ views::Widget::InitParams params2;
+ params2.delegate = new TestWidgetDelegate;
+ params2.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params2.bounds = gfx::Rect(100, 0, 100, 100);
+ params2.context = CurrentContext();
+ w2->Init(params2);
+ w2->Show();
+
+ scoped_ptr<views::Widget> w3(new views::Widget);
+ views::Widget::InitParams params3;
+ params3.delegate = new TestWidgetDelegate;
+ params3.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params3.bounds = gfx::Rect(100, 100, 100, 100);
+ params3.context = CurrentContext();
+ w3->Init(params3);
+ w3->Show();
+
+ ui::test::EventGenerator& generator = GetEventGenerator();
+ generator.MoveMouseTo(gfx::Point(100, 150));
+ EXPECT_TRUE(HasPendingShow());
+ EXPECT_TRUE(IsShowing());
+ ShowNow();
+ EXPECT_TRUE(IsShowing());
+
+ // Check that the multi-window resize handle does not hide while the mouse is
+ // over a window's resize area. A window's resize area extends outside the
+ // window's bounds.
+ EXPECT_TRUE(w3->IsActive());
+ ASSERT_LT(kResizeInsideBoundsSize, kResizeOutsideBoundsSize);
+
+ EXPECT_TRUE(IsOverWindows(gfx::Point(100, 150)));
+ EXPECT_TRUE(IsOverWindows(gfx::Point(100 - kResizeOutsideBoundsSize, 150)));
+ EXPECT_FALSE(
+ IsOverWindows(gfx::Point(100 - kResizeOutsideBoundsSize - 1, 150)));
+ EXPECT_TRUE(
+ IsOverWindows(gfx::Point(100 + kResizeInsideBoundsSize - 1, 150)));
+ EXPECT_FALSE(IsOverWindows(gfx::Point(100 + kResizeInsideBoundsSize, 150)));
+ EXPECT_FALSE(
+ IsOverWindows(gfx::Point(100 + kResizeOutsideBoundsSize - 1, 150)));
+
+ w1->Activate();
+ EXPECT_TRUE(IsOverWindows(gfx::Point(100, 150)));
+ EXPECT_TRUE(IsOverWindows(gfx::Point(100 - kResizeInsideBoundsSize, 150)));
+ EXPECT_FALSE(
+ IsOverWindows(gfx::Point(100 - kResizeInsideBoundsSize - 1, 150)));
+ EXPECT_FALSE(IsOverWindows(gfx::Point(100 - kResizeOutsideBoundsSize, 150)));
+ EXPECT_TRUE(
+ IsOverWindows(gfx::Point(100 + kResizeOutsideBoundsSize - 1, 150)));
+ EXPECT_FALSE(IsOverWindows(gfx::Point(100 + kResizeOutsideBoundsSize, 150)));
+
+ // Check that the multi-window resize handles eventually hide if the mouse
+ // moves between |w1| and |w2|.
+ EXPECT_FALSE(IsOverWindows(gfx::Point(100, 50)));
}
// Makes sure deleting a window hides.
@@ -140,13 +233,11 @@ TEST_F(MultiWindowResizeControllerTest, DeleteWindow) {
generator.MoveMouseTo(w1->bounds().CenterPoint());
EXPECT_TRUE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
// Force a show now.
ShowNow();
EXPECT_FALSE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
// Move the mouse over the resize widget.
ASSERT_TRUE(resize_widget());
@@ -154,7 +245,6 @@ TEST_F(MultiWindowResizeControllerTest, DeleteWindow) {
generator.MoveMouseTo(bounds.x() + 1, bounds.y() + 1);
EXPECT_FALSE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
// Move the resize widget
generator.PressLeftButton();
@@ -165,7 +255,6 @@ TEST_F(MultiWindowResizeControllerTest, DeleteWindow) {
EXPECT_TRUE(resize_widget() == NULL);
EXPECT_FALSE(HasPendingShow());
EXPECT_FALSE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
EXPECT_FALSE(HasTarget(w1.get()));
}
@@ -183,13 +272,11 @@ TEST_F(MultiWindowResizeControllerTest, Drag) {
generator.MoveMouseTo(w1->bounds().CenterPoint());
EXPECT_TRUE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
// Force a show now.
ShowNow();
EXPECT_FALSE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
// Move the mouse over the resize widget.
ASSERT_TRUE(resize_widget());
@@ -197,7 +284,6 @@ TEST_F(MultiWindowResizeControllerTest, Drag) {
generator.MoveMouseTo(bounds.x() + 1, bounds.y() + 1);
EXPECT_FALSE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
// Move the resize widget
generator.PressLeftButton();
@@ -207,7 +293,6 @@ TEST_F(MultiWindowResizeControllerTest, Drag) {
EXPECT_TRUE(resize_widget());
EXPECT_FALSE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
EXPECT_EQ("0,0 110x100", w1->bounds().ToString());
EXPECT_EQ("110,0 100x100", w2->bounds().ToString());
}
@@ -231,13 +316,11 @@ TEST_F(MultiWindowResizeControllerTest, Three) {
generator.MoveMouseTo(w1->bounds().CenterPoint());
EXPECT_TRUE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
EXPECT_FALSE(HasTarget(w3.get()));
ShowNow();
EXPECT_FALSE(HasPendingShow());
EXPECT_TRUE(IsShowing());
- EXPECT_FALSE(HasPendingHide());
// w3 should be picked up when resize is started.
gfx::Rect bounds(resize_widget()->GetWindowBoundsInScreen());
« no previous file with comments | « ash/wm/workspace/multi_window_resize_controller.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698