blob: 00b18b791ba99bf4675b9af5e28e3975e293b258 [file] [log] [blame]
// Copyright 2013 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 "chrome/browser/ui/views/app_list/win/app_list_win.h"
#include "chrome/browser/ui/app_list/app_list_positioner.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/display.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
namespace {
const int kScreenWidth = 800;
const int kScreenHeight = 600;
const int kWindowWidth = 100;
const int kWindowHeight = 200;
// Size of the normal (non-hidden) taskbar.
const int kTaskbarSize = 30;
// The distance the taskbar will appear from the edge of the screen.
const int kMinDistanceFromEdge = 3;
// Max distance the mouse can be from taskbar to count as "near" the taskbar.
const int kSnapDistance = 50;
// A cursor position that is within the taskbar. This must be < kTaskbarSize.
const int kCursorOnTaskbar = kTaskbarSize / 2;
// A cursor position that is within 50 pixels of the taskbar.
const int kCursorNearTaskbar = kTaskbarSize + kSnapDistance;
// A cursor position that is more than 50 pixels away from the taskbar.
const int kCursorAwayFromTaskbar = kCursorNearTaskbar + 1;
// A position for the center of the window that causes the window to overlap the
// edge of the screen. This must be < kWindowWidth / 2 and < kWindowHeight / 2.
const int kWindowNearEdge = kWindowWidth / 4;
// A position for the center of the window that places the window away from all
// edges of the screen. This must be > kWindowWidth / 2, > kWindowHeight / 2, <
// kScreenWidth - kWindowWidth / 2 and < kScreenHeight - kWindowHeight / 2.
const int kWindowAwayFromEdge = 158;
// Horizontal offset of the simulated Windows 8 split point.
const int kWin8SplitPoint = 200;
} // namespace
class AppListWinUnitTest : public testing::Test {
public:
void SetUp() override {
display_.set_bounds(gfx::Rect(0, 0, kScreenWidth, kScreenHeight));
display_.set_work_area(gfx::Rect(0, 0, kScreenWidth, kScreenHeight));
cursor_ = gfx::Point();
taskbar_rect_ = gfx::Rect();
center_window_ = false;
}
// Set the display work area.
void SetWorkArea(int x, int y, int width, int height) {
display_.set_work_area(gfx::Rect(x, y, width, height));
}
// Sets up the test environment with the taskbar along a given edge of the
// work area.
void PlaceTaskbar(AppListPositioner::ScreenEdge edge) {
const gfx::Rect& work_area = display_.work_area();
switch (edge) {
case AppListPositioner::SCREEN_EDGE_UNKNOWN:
taskbar_rect_ = gfx::Rect();
break;
case AppListPositioner::SCREEN_EDGE_LEFT:
taskbar_rect_ = gfx::Rect(
work_area.x(), work_area.y(), kTaskbarSize, work_area.height());
break;
case AppListPositioner::SCREEN_EDGE_RIGHT:
taskbar_rect_ =
gfx::Rect(work_area.x() + work_area.width() - kTaskbarSize,
work_area.y(),
kTaskbarSize,
work_area.height());
break;
case AppListPositioner::SCREEN_EDGE_TOP:
taskbar_rect_ = gfx::Rect(
work_area.x(), work_area.y(), work_area.width(), kTaskbarSize);
break;
case AppListPositioner::SCREEN_EDGE_BOTTOM:
taskbar_rect_ =
gfx::Rect(work_area.x(),
work_area.y() + work_area.height() - kTaskbarSize,
work_area.width(),
kTaskbarSize);
break;
}
}
// Set up the test mouse cursor in a given location.
void PlaceCursor(int x, int y) {
cursor_ = gfx::Point(x, y);
}
void EnableWindowCentering() {
center_window_ = true;
}
gfx::Point DoFindAnchorPoint() const {
return AppListWin::FindAnchorPoint(gfx::Size(kWindowWidth, kWindowHeight),
display_,
cursor_,
taskbar_rect_,
center_window_);
}
private:
gfx::Display display_;
gfx::Point cursor_;
gfx::Rect taskbar_rect_;
bool center_window_;
};
TEST_F(AppListWinUnitTest, FindAnchorPointNoTaskbar) {
// Position the app list when there is no taskbar on the display.
PlaceCursor(0, 0);
// Expect the app list to be in the bottom-left corner.
EXPECT_EQ(
gfx::Point(kWindowWidth / 2 + kMinDistanceFromEdge,
kScreenHeight - kWindowHeight / 2 - kMinDistanceFromEdge),
DoFindAnchorPoint());
}
TEST_F(AppListWinUnitTest, FindAnchorPointMouseOffTaskbar) {
// Position the app list when the mouse is away from the taskbar.
// Bottom taskbar. Expect the app list to be in the bottom-left corner.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM);
PlaceCursor(kWindowAwayFromEdge, kScreenHeight - kCursorAwayFromTaskbar);
EXPECT_EQ(gfx::Point(kWindowWidth / 2 + kMinDistanceFromEdge,
kScreenHeight - kTaskbarSize - kWindowHeight / 2 -
kMinDistanceFromEdge),
DoFindAnchorPoint());
// Top taskbar. Expect the app list to be in the top-left corner.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_TOP);
PlaceCursor(kWindowAwayFromEdge, kCursorAwayFromTaskbar);
EXPECT_EQ(gfx::Point(kWindowWidth / 2 + kMinDistanceFromEdge,
kTaskbarSize + kWindowHeight / 2 + kMinDistanceFromEdge),
DoFindAnchorPoint());
// Left taskbar. Expect the app list to be in the top-left corner.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_LEFT);
PlaceCursor(kCursorAwayFromTaskbar, kWindowAwayFromEdge);
EXPECT_EQ(gfx::Point(kTaskbarSize + kWindowWidth / 2 + kMinDistanceFromEdge,
kWindowHeight / 2 + kMinDistanceFromEdge),
DoFindAnchorPoint());
// Right taskbar. Expect the app list to be in the top-right corner.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_RIGHT);
PlaceCursor(kScreenWidth - kCursorAwayFromTaskbar, kWindowAwayFromEdge);
EXPECT_EQ(gfx::Point(kScreenWidth - kTaskbarSize - kWindowWidth / 2 -
kMinDistanceFromEdge,
kWindowHeight / 2 + kMinDistanceFromEdge),
DoFindAnchorPoint());
}
TEST_F(AppListWinUnitTest, FindAnchorPointMouseOnTaskbar) {
// Position the app list when the mouse is over the taskbar.
// Bottom taskbar (mouse well within taskbar). Expect the app list to be at
// the bottom centered on the mouse X coordinate.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM);
PlaceCursor(kWindowAwayFromEdge, kScreenHeight - kCursorOnTaskbar);
EXPECT_EQ(gfx::Point(kWindowAwayFromEdge,
kScreenHeight - kTaskbarSize - kWindowHeight / 2 -
kMinDistanceFromEdge),
DoFindAnchorPoint());
// Bottom taskbar (outside the taskbar but still close enough).
// Expect the app list to be at the bottom centered on the mouse X coordinate.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM);
PlaceCursor(kWindowAwayFromEdge, kScreenHeight - kCursorNearTaskbar);
EXPECT_EQ(gfx::Point(kWindowAwayFromEdge,
kScreenHeight - kTaskbarSize - kWindowHeight / 2 -
kMinDistanceFromEdge),
DoFindAnchorPoint());
// Top taskbar. Expect the app list to be at the top centered on the
// mouse X coordinate.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_TOP);
PlaceCursor(kWindowAwayFromEdge, kCursorNearTaskbar);
EXPECT_EQ(gfx::Point(kWindowAwayFromEdge,
kTaskbarSize + kWindowHeight / 2 + kMinDistanceFromEdge),
DoFindAnchorPoint());
// Left taskbar. Expect the app list to be at the left centered on the
// mouse Y coordinate.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_LEFT);
PlaceCursor(kCursorNearTaskbar, kWindowAwayFromEdge);
EXPECT_EQ(gfx::Point(kTaskbarSize + kWindowWidth / 2 + kMinDistanceFromEdge,
kWindowAwayFromEdge),
DoFindAnchorPoint());
// Right taskbar. Expect the app list to be at the right centered on the
// mouse Y coordinate.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_RIGHT);
PlaceCursor(kScreenWidth - kCursorNearTaskbar, kWindowAwayFromEdge);
EXPECT_EQ(gfx::Point(kScreenWidth - kTaskbarSize - kWindowWidth / 2 -
kMinDistanceFromEdge,
kWindowAwayFromEdge),
DoFindAnchorPoint());
// Bottom taskbar. Mouse near left edge. App list must not go off screen.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM);
PlaceCursor(kWindowNearEdge, kScreenHeight - kCursorOnTaskbar);
EXPECT_EQ(gfx::Point(kWindowWidth / 2 + kMinDistanceFromEdge,
kScreenHeight - kTaskbarSize - kWindowHeight / 2 -
kMinDistanceFromEdge),
DoFindAnchorPoint());
// Bottom taskbar. Mouse near right edge. App list must not go off screen.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM);
PlaceCursor(kScreenWidth - kWindowNearEdge, kScreenHeight - kCursorOnTaskbar);
EXPECT_EQ(gfx::Point(kScreenWidth - kWindowWidth / 2 - kMinDistanceFromEdge,
kScreenHeight - kTaskbarSize - kWindowHeight / 2 -
kMinDistanceFromEdge),
DoFindAnchorPoint());
}
TEST_F(AppListWinUnitTest, FindAnchorPointWin8SplitScreen) {
// Make the work area smaller than the screen, as you would get in Windows 8
// when there is a split screen and the Desktop is in one side of the screen.
SetWorkArea(
kWin8SplitPoint, 0, kScreenWidth - kWin8SplitPoint, kScreenHeight);
// No taskbar. Expect the app list to be in the bottom-left corner of the work
// area.
EXPECT_EQ(
gfx::Point(kWin8SplitPoint + kWindowWidth / 2 + kMinDistanceFromEdge,
kScreenHeight - kWindowHeight / 2 - kMinDistanceFromEdge),
DoFindAnchorPoint());
// Bottom taskbar (mouse off-screen to the left). Expect the app list to be
// in the bottom-left corner of the work area.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM);
PlaceCursor(kWindowAwayFromEdge, kScreenHeight - kCursorOnTaskbar);
EXPECT_EQ(
gfx::Point(kWin8SplitPoint + kWindowWidth / 2 + kMinDistanceFromEdge,
kScreenHeight - kTaskbarSize - kWindowHeight / 2 -
kMinDistanceFromEdge),
DoFindAnchorPoint());
}
TEST_F(AppListWinUnitTest, FindAnchorPointCentered) {
// Cursor on the top taskbar; enable centered app list mode.
PlaceTaskbar(AppListPositioner::SCREEN_EDGE_TOP);
PlaceCursor(0, 0);
EnableWindowCentering();
// Expect the app list to be in the center of the screen (ignore the cursor).
EXPECT_EQ(gfx::Point(kScreenWidth / 2, kScreenHeight / 2),
DoFindAnchorPoint());
}