Index: ui/app_list/views/app_list_main_view_unittest.cc |
diff --git a/ui/app_list/views/app_list_main_view_unittest.cc b/ui/app_list/views/app_list_main_view_unittest.cc |
index 625a86c2519336f12215bae39906d495be1d1937..d59e45f2097ed0b131da950f8c0417a908b33b99 100644 |
--- a/ui/app_list/views/app_list_main_view_unittest.cc |
+++ b/ui/app_list/views/app_list_main_view_unittest.cc |
@@ -169,6 +169,60 @@ class AppListMainViewTest : public views::ViewsTestBase { |
return FolderGridView()->view_model_for_test(); |
} |
+ AppListItemView* CreateAndOpenSingleItemFolder() { |
+ // Prepare single folder with a single item in it. |
+ AppListFolderItem* folder_item = |
+ delegate_->GetTestModel()->CreateSingleItemFolder("single_item_folder", |
+ "single"); |
+ EXPECT_EQ(folder_item, |
+ delegate_->GetTestModel()->FindFolderItem("single_item_folder")); |
+ EXPECT_EQ(AppListFolderItem::kItemType, folder_item->GetItemType()); |
+ |
+ EXPECT_EQ(1, RootViewModel()->view_size()); |
+ AppListItemView* folder_item_view = |
+ static_cast<AppListItemView*>(RootViewModel()->view_at(0)); |
+ EXPECT_EQ(folder_item_view->item(), folder_item); |
+ |
+ // Click on the folder to open it. |
+ EXPECT_FALSE(FolderView()->visible()); |
+ SimulateClick(folder_item_view); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_TRUE(FolderView()->visible()); |
+ |
+#if defined(OS_WIN) |
+ AppsGridViewTestApi folder_grid_view_test_api(FolderGridView()); |
+ folder_grid_view_test_api.DisableSynchronousDrag(); |
+#endif |
+ return folder_item_view; |
+ } |
+ |
+ AppListItemView* StartDragForReparent(int index_in_folder) { |
+ // Start to drag the item in folder. |
+ views::View* item_view = FolderViewModel()->view_at(index_in_folder); |
+ gfx::Point point = item_view->bounds().CenterPoint(); |
+ AppListItemView* dragged = |
+ SimulateInitiateDrag(FolderGridView(), AppsGridView::MOUSE, point); |
+ EXPECT_EQ(item_view, dragged); |
+ EXPECT_FALSE(RootGridView()->visible()); |
+ EXPECT_TRUE(FolderView()->visible()); |
+ |
+ // Drag it to top left corner. |
+ point = gfx::Point(0, 0); |
+ // Two update drags needed to actually drag the view. The first changes |
+ // state and the 2nd one actually moves the view. The 2nd call can be |
+ // removed when UpdateDrag is fixed. |
+ SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point); |
+ SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // Wait until the folder view is invisible and root grid view shows up. |
+ GridViewVisibleWaiter(RootGridView()).Wait(); |
+ EXPECT_TRUE(RootGridView()->visible()); |
+ EXPECT_EQ(0, FolderView()->layer()->opacity()); |
+ |
+ return dragged; |
+ } |
+ |
protected: |
views::Widget* widget_; // Owned by native window. |
AppListMainView* main_view_; // Owned by |widget_|. |
@@ -198,59 +252,17 @@ TEST_F(AppListMainViewTest, ModelChanged) { |
// Tests dragging an item out of a single item folder and drop it at the last |
// slot. |
TEST_F(AppListMainViewTest, DragLastItemFromFolderAndDropAtLastSlot) { |
- // Prepare single folder with a single item in it. |
- AppListFolderItem* folder_item = |
- delegate_->GetTestModel()->CreateSingleItemFolder("single_item_folder", |
- "single"); |
- EXPECT_EQ(folder_item, |
- delegate_->GetTestModel()->FindFolderItem("single_item_folder")); |
- EXPECT_EQ(AppListFolderItem::kItemType, folder_item->GetItemType()); |
- |
- EXPECT_EQ(1, RootViewModel()->view_size()); |
- AppListItemView* folder_item_view = |
- static_cast<AppListItemView*>(RootViewModel()->view_at(0)); |
- EXPECT_EQ(folder_item_view->item(), folder_item); |
+ AppListItemView* folder_item_view = CreateAndOpenSingleItemFolder(); |
const gfx::Rect first_slot_tile = folder_item_view->bounds(); |
- // Click on the folder to open it. |
- EXPECT_FALSE(FolderView()->visible()); |
- SimulateClick(folder_item_view); |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_TRUE(FolderView()->visible()); |
- |
-#if defined(OS_WIN) |
- AppsGridViewTestApi folder_grid_view_test_api(FolderGridView()); |
- folder_grid_view_test_api.DisableSynchronousDrag(); |
-#endif |
- |
- // Start to drag the item in folder. |
EXPECT_EQ(1, FolderViewModel()->view_size()); |
- views::View* item_view = FolderViewModel()->view_at(0); |
- gfx::Point point = item_view->bounds().CenterPoint(); |
- AppListItemView* dragged = |
- SimulateInitiateDrag(FolderGridView(), AppsGridView::MOUSE, point); |
- EXPECT_EQ(item_view, dragged); |
- EXPECT_FALSE(RootGridView()->visible()); |
- EXPECT_TRUE(FolderView()->visible()); |
- |
- // Drag it to top left corner. |
- point = gfx::Point(0, 0); |
- // Two update drags needed to actually drag the view. The first changes state |
- // and the 2nd one actually moves the view. The 2nd call can be removed when |
- // UpdateDrag is fixed. |
- SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point); |
- SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point); |
- base::RunLoop().RunUntilIdle(); |
- // Wait until the folder view is invisible and root grid view shows up. |
- GridViewVisibleWaiter(RootGridView()).Wait(); |
- EXPECT_TRUE(RootGridView()->visible()); |
- EXPECT_EQ(0, FolderView()->layer()->opacity()); |
+ AppListItemView* dragged = StartDragForReparent(0); |
// Drop it to the slot on the right of first slot. |
gfx::Rect drop_target_tile(first_slot_tile); |
drop_target_tile.Offset(first_slot_tile.width(), 0); |
- point = drop_target_tile.CenterPoint(); |
+ gfx::Point point = drop_target_tile.CenterPoint(); |
SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point); |
SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point); |
base::RunLoop().RunUntilIdle(); |
@@ -274,5 +286,28 @@ TEST_F(AppListMainViewTest, DragLastItemFromFolderAndDropAtLastSlot) { |
delegate_->GetTestModel()->FindFolderItem("single_item_folder")); |
} |
+// Test that an interrupted drag while reparenting an item from a folder, when |
+// canceled via the root grid, correctly forwards the cancelation to the drag |
+// ocurring from the folder. |
+TEST_F(AppListMainViewTest, MouseDragItemOutOfFolderWithCancel) { |
+ CreateAndOpenSingleItemFolder(); |
+ AppListItemView* dragged = StartDragForReparent(0); |
+ |
+ // Now add an item to the model, not in any folder, e.g., as if by Sync. |
+ EXPECT_TRUE(RootGridView()->has_dragged_view()); |
+ EXPECT_TRUE(FolderGridView()->has_dragged_view()); |
+ delegate_->GetTestModel()->CreateAndAddItem("Extra"); |
+ |
+ // The drag operation should get canceled. |
+ EXPECT_FALSE(RootGridView()->has_dragged_view()); |
+ EXPECT_FALSE(FolderGridView()->has_dragged_view()); |
+ |
+ // Additional mouse move operations should be ignored. |
+ gfx::Point point(1, 1); |
+ SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point); |
+ EXPECT_FALSE(RootGridView()->has_dragged_view()); |
+ EXPECT_FALSE(FolderGridView()->has_dragged_view()); |
+} |
+ |
} // namespace test |
} // namespace app_list |