| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/app_list/views/apps_grid_view.h" | 5 #include "ui/app_list/views/apps_grid_view.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 gfx::Rect rect(gfx::Point(insets.left(), insets.top()), | 133 gfx::Rect rect(gfx::Point(insets.left(), insets.top()), |
| 134 AppsGridView::GetTotalTileSize()); | 134 AppsGridView::GetTotalTileSize()); |
| 135 rect.Offset(col * rect.width(), row * rect.height()); | 135 rect.Offset(col * rect.width(), row * rect.height()); |
| 136 return rect; | 136 return rect; |
| 137 } | 137 } |
| 138 | 138 |
| 139 PaginationModel* GetPaginationModel() { | 139 PaginationModel* GetPaginationModel() { |
| 140 return apps_grid_view_->pagination_model(); | 140 return apps_grid_view_->pagination_model(); |
| 141 } | 141 } |
| 142 | 142 |
| 143 // Point is in |apps_grid_view_|'s coordinates. |
| 144 void SimulateContinueDrag(AppsGridView::Pointer pointer, |
| 145 const AppListItemView* view, |
| 146 const gfx::Point& to) { |
| 147 DCHECK(view); |
| 148 |
| 149 gfx::Point translated_to = |
| 150 gfx::PointAtOffsetFromOrigin(to - view->bounds().origin()); |
| 151 |
| 152 ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, translated_to, to, 0, 0); |
| 153 apps_grid_view_->UpdateDragFromItem(pointer, drag_event); |
| 154 } |
| 155 |
| 143 // Points are in |apps_grid_view_|'s coordinates. | 156 // Points are in |apps_grid_view_|'s coordinates. |
| 144 AppListItemView* SimulateDrag(AppsGridView::Pointer pointer, | 157 AppListItemView* SimulateDrag(AppsGridView::Pointer pointer, |
| 145 const gfx::Point& from, | 158 const gfx::Point& from, |
| 146 const gfx::Point& to) { | 159 const gfx::Point& to) { |
| 147 AppListItemView* view = GetItemViewForPoint(from); | 160 AppListItemView* view = GetItemViewForPoint(from); |
| 148 DCHECK(view); | 161 DCHECK(view); |
| 149 | 162 |
| 150 gfx::Point translated_from = gfx::PointAtOffsetFromOrigin( | 163 gfx::Point translated_from = gfx::PointAtOffsetFromOrigin( |
| 151 from - view->bounds().origin()); | 164 from - view->bounds().origin()); |
| 152 gfx::Point translated_to = gfx::PointAtOffsetFromOrigin( | |
| 153 to - view->bounds().origin()); | |
| 154 | 165 |
| 155 ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, | 166 ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, |
| 156 translated_from, from, 0, 0); | 167 translated_from, from, 0, 0); |
| 157 apps_grid_view_->InitiateDrag(view, pointer, pressed_event); | 168 apps_grid_view_->InitiateDrag(view, pointer, pressed_event); |
| 158 | 169 |
| 159 ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, | 170 SimulateContinueDrag(pointer, view, to); |
| 160 translated_to, to, 0, 0); | |
| 161 apps_grid_view_->UpdateDragFromItem(pointer, drag_event); | |
| 162 return view; | 171 return view; |
| 163 } | 172 } |
| 164 | 173 |
| 165 void SimulateKeyPress(ui::KeyboardCode key_code) { | 174 void SimulateKeyPress(ui::KeyboardCode key_code) { |
| 166 ui::KeyEvent key_event(ui::ET_KEY_PRESSED, key_code, ui::EF_NONE); | 175 ui::KeyEvent key_event(ui::ET_KEY_PRESSED, key_code, ui::EF_NONE); |
| 167 apps_grid_view_->OnKeyPressed(key_event); | 176 apps_grid_view_->OnKeyPressed(key_event); |
| 168 } | 177 } |
| 169 | 178 |
| 170 scoped_ptr<AppListTestModel> model_; | 179 scoped_ptr<AppListTestModel> model_; |
| 171 scoped_ptr<AppsGridView> apps_grid_view_; | 180 scoped_ptr<AppsGridView> apps_grid_view_; |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 AppListItemView* dragged_view = SimulateDrag(AppsGridView::MOUSE, from, to); | 448 AppListItemView* dragged_view = SimulateDrag(AppsGridView::MOUSE, from, to); |
| 440 test_api_->LayoutToIdealBounds(); | 449 test_api_->LayoutToIdealBounds(); |
| 441 | 450 |
| 442 // The grid now looks like | blank | folder |. | 451 // The grid now looks like | blank | folder |. |
| 443 EXPECT_EQ(NULL, GetItemViewForPoint(GetItemTileRectAt(0, 0).CenterPoint())); | 452 EXPECT_EQ(NULL, GetItemViewForPoint(GetItemTileRectAt(0, 0).CenterPoint())); |
| 444 EXPECT_EQ(folder_view, | 453 EXPECT_EQ(folder_view, |
| 445 GetItemViewForPoint(GetItemTileRectAt(0, 1).CenterPoint())); | 454 GetItemViewForPoint(GetItemTileRectAt(0, 1).CenterPoint())); |
| 446 | 455 |
| 447 // Move onto the folder and end the drag. | 456 // Move onto the folder and end the drag. |
| 448 to = GetItemTileRectAt(0, 1).CenterPoint(); | 457 to = GetItemTileRectAt(0, 1).CenterPoint(); |
| 449 gfx::Point translated_to = | 458 SimulateContinueDrag(AppsGridView::MOUSE, dragged_view, to); |
| 450 gfx::PointAtOffsetFromOrigin(to - dragged_view->bounds().origin()); | |
| 451 ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, translated_to, to, 0, 0); | |
| 452 apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, drag_event); | |
| 453 apps_grid_view_->EndDrag(false); | 459 apps_grid_view_->EndDrag(false); |
| 454 | 460 |
| 455 // The item should not have moved into the folder. | 461 // The item should not have moved into the folder. |
| 456 EXPECT_EQ(2u, model_->top_level_item_list()->item_count()); | 462 EXPECT_EQ(2u, model_->top_level_item_list()->item_count()); |
| 457 EXPECT_EQ(kMaxFolderItems, folder_item->ChildItemCount()); | 463 EXPECT_EQ(kMaxFolderItems, folder_item->ChildItemCount()); |
| 458 test_api_->LayoutToIdealBounds(); | 464 test_api_->LayoutToIdealBounds(); |
| 459 } | 465 } |
| 460 | 466 |
| 467 // Drag item into solitary folder on 2nd page. This fails to test Issue 439055, |
| 468 // because there's no |drag_and_drop_host_| to enter the offending code block in |
| 469 // AppsGridView::EndDrag(), but we'll keep it as a useful edge case test. |
| 470 TEST_F(AppsGridViewTest, MouseDragItemIntoLonelyFolder) { |
| 471 EnsureFoldersEnabled(); |
| 472 |
| 473 size_t kTotalItems = kTilesPerPage + 1; |
| 474 model_->PopulateApps(kTilesPerPage); |
| 475 model_->CreateAndPopulateFolderWithApps(2); |
| 476 EXPECT_EQ(kTotalItems, model_->top_level_item_list()->item_count()); |
| 477 EXPECT_EQ(2, GetPaginationModel()->total_pages()); |
| 478 EXPECT_EQ( |
| 479 AppListFolderItem::kItemType, |
| 480 model_->top_level_item_list()->item_at(kTilesPerPage)->GetItemType()); |
| 481 EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
| 482 |
| 483 // Set up page switching |
| 484 test_api_->SetPageFlipDelay(10); |
| 485 // NOTE: We lower |duration_ms| arg to 0. During slow valgrind tests, the |
| 486 // drag-and-hover would push the target folder into the empty space on the |
| 487 // first page, leaving nothing to drop the item on, and foiling the test. |
| 488 GetPaginationModel()->SetTransitionDurations(0, 10); |
| 489 PageFlipWaiter page_flip_waiter(message_loop(), GetPaginationModel()); |
| 490 |
| 491 gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint(); |
| 492 gfx::Point to = |
| 493 gfx::Point(apps_grid_view_->width(), apps_grid_view_->height() / 2); |
| 494 |
| 495 // Drag to right edge, page should flip |
| 496 page_flip_waiter.Reset(); |
| 497 AppListItemView* view = SimulateDrag(AppsGridView::MOUSE, from, to); |
| 498 while (test_api_->HasPendingPageFlip()) { |
| 499 page_flip_waiter.Wait(); |
| 500 } |
| 501 EXPECT_EQ(1, GetPaginationModel()->selected_page()); |
| 502 |
| 503 // Continue drag to lonely folder, then drop |
| 504 to = GetItemTileRectAt(0, 0).CenterPoint(); |
| 505 AppListItemView* folder = GetItemViewForPoint(to); |
| 506 EXPECT_NE(nullptr, folder); |
| 507 if (folder) { |
| 508 EXPECT_EQ(AppListFolderItem::kItemType, folder->item()->GetItemType()); |
| 509 SimulateContinueDrag(AppsGridView::MOUSE, view, to); |
| 510 } |
| 511 apps_grid_view_->EndDrag(false); |
| 512 |
| 513 // Moving item from first page to folder should shift folder to first page |
| 514 EXPECT_EQ(1, GetPaginationModel()->total_pages()); |
| 515 EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
| 516 EXPECT_EQ(kTotalItems - 1, model_->top_level_item_list()->item_count()); |
| 517 EXPECT_EQ( |
| 518 AppListFolderItem::kItemType, |
| 519 model_->top_level_item_list()->item_at(kTilesPerPage - 1)->GetItemType()); |
| 520 test_api_->LayoutToIdealBounds(); |
| 521 } |
| 522 |
| 461 TEST_F(AppsGridViewTest, MouseDragItemReorder) { | 523 TEST_F(AppsGridViewTest, MouseDragItemReorder) { |
| 462 // This test assumes Folders are enabled. | 524 // This test assumes Folders are enabled. |
| 463 EnsureFoldersEnabled(); | 525 EnsureFoldersEnabled(); |
| 464 | 526 |
| 465 model_->PopulateApps(4); | 527 model_->PopulateApps(4); |
| 466 EXPECT_EQ(4u, model_->top_level_item_list()->item_count()); | 528 EXPECT_EQ(4u, model_->top_level_item_list()->item_count()); |
| 467 EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), | 529 EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), |
| 468 model_->GetModelContent()); | 530 model_->GetModelContent()); |
| 469 | 531 |
| 470 // Dragging an item towards its neighbours should not reorder until the drag | 532 // Dragging an item towards its neighbours should not reorder until the drag |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 782 AppListItemView* item_view = GetItemViewAt(0); | 844 AppListItemView* item_view = GetItemViewAt(0); |
| 783 ASSERT_TRUE(item_view); | 845 ASSERT_TRUE(item_view); |
| 784 const views::Label* title_label = item_view->title(); | 846 const views::Label* title_label = item_view->title(); |
| 785 EXPECT_FALSE(title_label->GetTooltipText( | 847 EXPECT_FALSE(title_label->GetTooltipText( |
| 786 title_label->bounds().CenterPoint(), &actual_tooltip)); | 848 title_label->bounds().CenterPoint(), &actual_tooltip)); |
| 787 EXPECT_EQ(title, base::UTF16ToUTF8(title_label->text())); | 849 EXPECT_EQ(title, base::UTF16ToUTF8(title_label->text())); |
| 788 } | 850 } |
| 789 | 851 |
| 790 } // namespace test | 852 } // namespace test |
| 791 } // namespace app_list | 853 } // namespace app_list |
| OLD | NEW |