Index: ui/app_list/views/apps_grid_view_unittest.cc |
diff --git a/ui/app_list/views/apps_grid_view_unittest.cc b/ui/app_list/views/apps_grid_view_unittest.cc |
index e7edc45a51cc7dcf32d3b9dbe1b0116772153f64..41bf0944d475426f68e45287a0a6b0cb92a41ba2 100644 |
--- a/ui/app_list/views/apps_grid_view_unittest.cc |
+++ b/ui/app_list/views/apps_grid_view_unittest.cc |
@@ -140,6 +140,19 @@ class AppsGridViewTest : public views::ViewsTestBase { |
return apps_grid_view_->pagination_model(); |
} |
+ // Point is in |apps_grid_view_|'s coordinates. |
+ void SimulateContinueDrag(AppsGridView::Pointer pointer, |
+ const AppListItemView* view, |
+ const gfx::Point& to) { |
+ DCHECK(view); |
+ |
+ gfx::Point translated_to = |
+ gfx::PointAtOffsetFromOrigin(to - view->bounds().origin()); |
+ |
+ ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, translated_to, to, 0, 0); |
+ apps_grid_view_->UpdateDragFromItem(pointer, drag_event); |
+ } |
+ |
// Points are in |apps_grid_view_|'s coordinates. |
AppListItemView* SimulateDrag(AppsGridView::Pointer pointer, |
const gfx::Point& from, |
@@ -149,16 +162,12 @@ class AppsGridViewTest : public views::ViewsTestBase { |
gfx::Point translated_from = gfx::PointAtOffsetFromOrigin( |
from - view->bounds().origin()); |
- gfx::Point translated_to = gfx::PointAtOffsetFromOrigin( |
- to - view->bounds().origin()); |
ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, |
translated_from, from, 0, 0); |
apps_grid_view_->InitiateDrag(view, pointer, pressed_event); |
- ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, |
- translated_to, to, 0, 0); |
- apps_grid_view_->UpdateDragFromItem(pointer, drag_event); |
+ SimulateContinueDrag(pointer, view, to); |
return view; |
} |
@@ -446,10 +455,7 @@ TEST_F(AppsGridViewTest, MouseDragMaxItemsInFolderWithMovement) { |
// Move onto the folder and end the drag. |
to = GetItemTileRectAt(0, 1).CenterPoint(); |
- gfx::Point translated_to = |
- gfx::PointAtOffsetFromOrigin(to - dragged_view->bounds().origin()); |
- ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, translated_to, to, 0, 0); |
- apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, drag_event); |
+ SimulateContinueDrag(AppsGridView::MOUSE, dragged_view, to); |
apps_grid_view_->EndDrag(false); |
// The item should not have moved into the folder. |
@@ -458,6 +464,62 @@ TEST_F(AppsGridViewTest, MouseDragMaxItemsInFolderWithMovement) { |
test_api_->LayoutToIdealBounds(); |
} |
+// Drag item into solitary folder on 2nd page. This fails to test Issue 439055, |
+// because there's no |drag_and_drop_host_| to enter the offending code block in |
+// AppsGridView::EndDrag(), but we'll keep it as a useful edge case test. |
+TEST_F(AppsGridViewTest, MouseDragItemIntoLonelyFolder) { |
+ EnsureFoldersEnabled(); |
+ |
+ size_t kTotalItems = kTilesPerPage + 1; |
+ model_->PopulateApps(kTilesPerPage); |
+ model_->CreateAndPopulateFolderWithApps(2); |
+ EXPECT_EQ(kTotalItems, model_->top_level_item_list()->item_count()); |
+ EXPECT_EQ(2, GetPaginationModel()->total_pages()); |
+ EXPECT_EQ( |
+ AppListFolderItem::kItemType, |
+ model_->top_level_item_list()->item_at(kTilesPerPage)->GetItemType()); |
+ EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
+ |
+ // Set up page switching |
+ test_api_->SetPageFlipDelay(10); |
+ // NOTE: We lower |duration_ms| arg to 0. During slow valgrind tests, the |
+ // drag-and-hover would push the target folder into the empty space on the |
+ // first page, leaving nothing to drop the item on, and foiling the test. |
+ GetPaginationModel()->SetTransitionDurations(0, 10); |
+ PageFlipWaiter page_flip_waiter(message_loop(), GetPaginationModel()); |
+ |
+ gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint(); |
+ gfx::Point to = |
+ gfx::Point(apps_grid_view_->width(), apps_grid_view_->height() / 2); |
+ |
+ // Drag to right edge, page should flip |
+ page_flip_waiter.Reset(); |
+ AppListItemView* view = SimulateDrag(AppsGridView::MOUSE, from, to); |
+ while (test_api_->HasPendingPageFlip()) { |
+ page_flip_waiter.Wait(); |
+ } |
+ EXPECT_EQ(1, GetPaginationModel()->selected_page()); |
+ |
+ // Continue drag to lonely folder, then drop |
+ to = GetItemTileRectAt(0, 0).CenterPoint(); |
+ AppListItemView* folder = GetItemViewForPoint(to); |
+ EXPECT_NE(nullptr, folder); |
+ if (folder) { |
+ EXPECT_EQ(AppListFolderItem::kItemType, folder->item()->GetItemType()); |
+ SimulateContinueDrag(AppsGridView::MOUSE, view, to); |
+ } |
+ apps_grid_view_->EndDrag(false); |
+ |
+ // Moving item from first page to folder should shift folder to first page |
+ EXPECT_EQ(1, GetPaginationModel()->total_pages()); |
+ EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
+ EXPECT_EQ(kTotalItems - 1, model_->top_level_item_list()->item_count()); |
+ EXPECT_EQ( |
+ AppListFolderItem::kItemType, |
+ model_->top_level_item_list()->item_at(kTilesPerPage - 1)->GetItemType()); |
+ test_api_->LayoutToIdealBounds(); |
+} |
+ |
TEST_F(AppsGridViewTest, MouseDragItemReorder) { |
// This test assumes Folders are enabled. |
EnsureFoldersEnabled(); |