| 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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 | 99 |
| 100 class AppsGridViewTest : public views::ViewsTestBase { | 100 class AppsGridViewTest : public views::ViewsTestBase { |
| 101 public: | 101 public: |
| 102 AppsGridViewTest() {} | 102 AppsGridViewTest() {} |
| 103 virtual ~AppsGridViewTest() {} | 103 virtual ~AppsGridViewTest() {} |
| 104 | 104 |
| 105 // testing::Test overrides: | 105 // testing::Test overrides: |
| 106 virtual void SetUp() OVERRIDE { | 106 virtual void SetUp() OVERRIDE { |
| 107 views::ViewsTestBase::SetUp(); | 107 views::ViewsTestBase::SetUp(); |
| 108 model_.reset(new AppListTestModel); | 108 model_.reset(new AppListTestModel); |
| 109 pagination_model_.reset(new PaginationModel); | |
| 110 | 109 |
| 111 apps_grid_view_.reset(new AppsGridView(NULL, pagination_model_.get())); | 110 apps_grid_view_.reset(new AppsGridView(NULL)); |
| 112 apps_grid_view_->SetLayout(kIconDimension, kCols, kRows); | 111 apps_grid_view_->SetLayout(kIconDimension, kCols, kRows); |
| 113 apps_grid_view_->SetBoundsRect(gfx::Rect(gfx::Size(kWidth, kHeight))); | 112 apps_grid_view_->SetBoundsRect(gfx::Rect(gfx::Size(kWidth, kHeight))); |
| 114 apps_grid_view_->SetModel(model_.get()); | 113 apps_grid_view_->SetModel(model_.get()); |
| 115 apps_grid_view_->SetItemList(model_->top_level_item_list()); | 114 apps_grid_view_->SetItemList(model_->top_level_item_list()); |
| 116 | 115 |
| 117 test_api_.reset(new AppsGridViewTestApi(apps_grid_view_.get())); | 116 test_api_.reset(new AppsGridViewTestApi(apps_grid_view_.get())); |
| 118 } | 117 } |
| 119 virtual void TearDown() OVERRIDE { | 118 virtual void TearDown() OVERRIDE { |
| 120 apps_grid_view_.reset(); // Release apps grid view before models. | 119 apps_grid_view_.reset(); // Release apps grid view before models. |
| 121 views::ViewsTestBase::TearDown(); | 120 views::ViewsTestBase::TearDown(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 145 gfx::Rect GetItemTileRectAt(int row, int col) { | 144 gfx::Rect GetItemTileRectAt(int row, int col) { |
| 146 DCHECK_GT(model_->top_level_item_list()->item_count(), 0u); | 145 DCHECK_GT(model_->top_level_item_list()->item_count(), 0u); |
| 147 | 146 |
| 148 gfx::Insets insets(apps_grid_view_->GetInsets()); | 147 gfx::Insets insets(apps_grid_view_->GetInsets()); |
| 149 gfx::Rect rect(gfx::Point(insets.left(), insets.top()), | 148 gfx::Rect rect(gfx::Point(insets.left(), insets.top()), |
| 150 GetItemViewAt(0)->bounds().size()); | 149 GetItemViewAt(0)->bounds().size()); |
| 151 rect.Offset(col * rect.width(), row * rect.height()); | 150 rect.Offset(col * rect.width(), row * rect.height()); |
| 152 return rect; | 151 return rect; |
| 153 } | 152 } |
| 154 | 153 |
| 154 PaginationModel* GetPaginationModel() { |
| 155 return apps_grid_view_->pagination_model(); |
| 156 } |
| 157 |
| 155 // Points are in |apps_grid_view_|'s coordinates. | 158 // Points are in |apps_grid_view_|'s coordinates. |
| 156 void SimulateDrag(AppsGridView::Pointer pointer, | 159 void SimulateDrag(AppsGridView::Pointer pointer, |
| 157 const gfx::Point& from, | 160 const gfx::Point& from, |
| 158 const gfx::Point& to) { | 161 const gfx::Point& to) { |
| 159 AppListItemView* view = GetItemViewForPoint(from); | 162 AppListItemView* view = GetItemViewForPoint(from); |
| 160 DCHECK(view); | 163 DCHECK(view); |
| 161 | 164 |
| 162 gfx::Point translated_from = gfx::PointAtOffsetFromOrigin( | 165 gfx::Point translated_from = gfx::PointAtOffsetFromOrigin( |
| 163 from - view->bounds().origin()); | 166 from - view->bounds().origin()); |
| 164 gfx::Point translated_to = gfx::PointAtOffsetFromOrigin( | 167 gfx::Point translated_to = gfx::PointAtOffsetFromOrigin( |
| 165 to - view->bounds().origin()); | 168 to - view->bounds().origin()); |
| 166 | 169 |
| 167 ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, | 170 ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, |
| 168 translated_from, from, 0, 0); | 171 translated_from, from, 0, 0); |
| 169 apps_grid_view_->InitiateDrag(view, pointer, pressed_event); | 172 apps_grid_view_->InitiateDrag(view, pointer, pressed_event); |
| 170 | 173 |
| 171 ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, | 174 ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, |
| 172 translated_to, to, 0, 0); | 175 translated_to, to, 0, 0); |
| 173 apps_grid_view_->UpdateDragFromItem(pointer, drag_event); | 176 apps_grid_view_->UpdateDragFromItem(pointer, drag_event); |
| 174 } | 177 } |
| 175 | 178 |
| 176 void SimulateKeyPress(ui::KeyboardCode key_code) { | 179 void SimulateKeyPress(ui::KeyboardCode key_code) { |
| 177 ui::KeyEvent key_event(ui::ET_KEY_PRESSED, key_code, 0, false); | 180 ui::KeyEvent key_event(ui::ET_KEY_PRESSED, key_code, 0, false); |
| 178 apps_grid_view_->OnKeyPressed(key_event); | 181 apps_grid_view_->OnKeyPressed(key_event); |
| 179 } | 182 } |
| 180 | 183 |
| 181 scoped_ptr<AppListTestModel> model_; | 184 scoped_ptr<AppListTestModel> model_; |
| 182 scoped_ptr<PaginationModel> pagination_model_; | |
| 183 scoped_ptr<AppsGridView> apps_grid_view_; | 185 scoped_ptr<AppsGridView> apps_grid_view_; |
| 184 scoped_ptr<AppsGridViewTestApi> test_api_; | 186 scoped_ptr<AppsGridViewTestApi> test_api_; |
| 185 | 187 |
| 186 private: | 188 private: |
| 187 DISALLOW_COPY_AND_ASSIGN(AppsGridViewTest); | 189 DISALLOW_COPY_AND_ASSIGN(AppsGridViewTest); |
| 188 }; | 190 }; |
| 189 | 191 |
| 190 class TestAppsGridViewFolderDelegate : public AppsGridViewFolderDelegate { | 192 class TestAppsGridViewFolderDelegate : public AppsGridViewFolderDelegate { |
| 191 public: | 193 public: |
| 192 TestAppsGridViewFolderDelegate() : show_bubble_(false) {} | 194 TestAppsGridViewFolderDelegate() : show_bubble_(false) {} |
| (...skipping 30 matching lines...) Expand all Loading... |
| 223 private: | 225 private: |
| 224 bool show_bubble_; | 226 bool show_bubble_; |
| 225 | 227 |
| 226 DISALLOW_COPY_AND_ASSIGN(TestAppsGridViewFolderDelegate); | 228 DISALLOW_COPY_AND_ASSIGN(TestAppsGridViewFolderDelegate); |
| 227 }; | 229 }; |
| 228 | 230 |
| 229 TEST_F(AppsGridViewTest, CreatePage) { | 231 TEST_F(AppsGridViewTest, CreatePage) { |
| 230 // Fully populates a page. | 232 // Fully populates a page. |
| 231 const int kPages = 1; | 233 const int kPages = 1; |
| 232 model_->PopulateApps(kPages * kTilesPerPage); | 234 model_->PopulateApps(kPages * kTilesPerPage); |
| 233 EXPECT_EQ(kPages, pagination_model_->total_pages()); | 235 EXPECT_EQ(kPages, GetPaginationModel()->total_pages()); |
| 234 | 236 |
| 235 // Adds one more and gets a new page created. | 237 // Adds one more and gets a new page created. |
| 236 model_->CreateAndAddItem("Extra"); | 238 model_->CreateAndAddItem("Extra"); |
| 237 EXPECT_EQ(kPages + 1, pagination_model_->total_pages()); | 239 EXPECT_EQ(kPages + 1, GetPaginationModel()->total_pages()); |
| 238 } | 240 } |
| 239 | 241 |
| 240 TEST_F(AppsGridViewTest, EnsureHighlightedVisible) { | 242 TEST_F(AppsGridViewTest, EnsureHighlightedVisible) { |
| 241 const int kPages = 3; | 243 const int kPages = 3; |
| 242 model_->PopulateApps(kPages * kTilesPerPage); | 244 model_->PopulateApps(kPages * kTilesPerPage); |
| 243 EXPECT_EQ(kPages, pagination_model_->total_pages()); | 245 EXPECT_EQ(kPages, GetPaginationModel()->total_pages()); |
| 244 EXPECT_EQ(0, pagination_model_->selected_page()); | 246 EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
| 245 | 247 |
| 246 // Highlight first one and last one one first page and first page should be | 248 // Highlight first one and last one one first page and first page should be |
| 247 // selected. | 249 // selected. |
| 248 model_->HighlightItemAt(0); | 250 model_->HighlightItemAt(0); |
| 249 EXPECT_EQ(0, pagination_model_->selected_page()); | 251 EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
| 250 model_->HighlightItemAt(kTilesPerPage - 1); | 252 model_->HighlightItemAt(kTilesPerPage - 1); |
| 251 EXPECT_EQ(0, pagination_model_->selected_page()); | 253 EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
| 252 | 254 |
| 253 // Highlight first one on 2nd page and 2nd page should be selected. | 255 // Highlight first one on 2nd page and 2nd page should be selected. |
| 254 model_->HighlightItemAt(kTilesPerPage + 1); | 256 model_->HighlightItemAt(kTilesPerPage + 1); |
| 255 EXPECT_EQ(1, pagination_model_->selected_page()); | 257 EXPECT_EQ(1, GetPaginationModel()->selected_page()); |
| 256 | 258 |
| 257 // Highlight last one in the model and last page should be selected. | 259 // Highlight last one in the model and last page should be selected. |
| 258 model_->HighlightItemAt(model_->top_level_item_list()->item_count() - 1); | 260 model_->HighlightItemAt(model_->top_level_item_list()->item_count() - 1); |
| 259 EXPECT_EQ(kPages - 1, pagination_model_->selected_page()); | 261 EXPECT_EQ(kPages - 1, GetPaginationModel()->selected_page()); |
| 260 } | 262 } |
| 261 | 263 |
| 262 TEST_F(AppsGridViewTest, RemoveSelectedLastApp) { | 264 TEST_F(AppsGridViewTest, RemoveSelectedLastApp) { |
| 263 const int kTotalItems = 2; | 265 const int kTotalItems = 2; |
| 264 const int kLastItemIndex = kTotalItems - 1; | 266 const int kLastItemIndex = kTotalItems - 1; |
| 265 | 267 |
| 266 model_->PopulateApps(kTotalItems); | 268 model_->PopulateApps(kTotalItems); |
| 267 | 269 |
| 268 AppListItemView* last_view = GetItemViewAt(kLastItemIndex); | 270 AppListItemView* last_view = GetItemViewAt(kLastItemIndex); |
| 269 apps_grid_view_->SetSelectedView(last_view); | 271 apps_grid_view_->SetSelectedView(last_view); |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 SimulateDrag(AppsGridView::MOUSE, from, to); | 496 SimulateDrag(AppsGridView::MOUSE, from, to); |
| 495 model_->CreateAndAddItem("Extra"); | 497 model_->CreateAndAddItem("Extra"); |
| 496 apps_grid_view_->EndDrag(false); | 498 apps_grid_view_->EndDrag(false); |
| 497 EXPECT_EQ(std::string("Item 0,Item 1,Item 3,Extra"), | 499 EXPECT_EQ(std::string("Item 0,Item 1,Item 3,Extra"), |
| 498 model_->GetModelContent()); | 500 model_->GetModelContent()); |
| 499 test_api_->LayoutToIdealBounds(); | 501 test_api_->LayoutToIdealBounds(); |
| 500 } | 502 } |
| 501 | 503 |
| 502 TEST_F(AppsGridViewTest, MouseDragFlipPage) { | 504 TEST_F(AppsGridViewTest, MouseDragFlipPage) { |
| 503 test_api_->SetPageFlipDelay(10); | 505 test_api_->SetPageFlipDelay(10); |
| 504 pagination_model_->SetTransitionDurations(10, 10); | 506 GetPaginationModel()->SetTransitionDurations(10, 10); |
| 505 | 507 |
| 506 PageFlipWaiter page_flip_waiter(message_loop(), | 508 PageFlipWaiter page_flip_waiter(message_loop(), GetPaginationModel()); |
| 507 pagination_model_.get()); | |
| 508 | 509 |
| 509 const int kPages = 3; | 510 const int kPages = 3; |
| 510 model_->PopulateApps(kPages * kTilesPerPage); | 511 model_->PopulateApps(kPages * kTilesPerPage); |
| 511 EXPECT_EQ(kPages, pagination_model_->total_pages()); | 512 EXPECT_EQ(kPages, GetPaginationModel()->total_pages()); |
| 512 EXPECT_EQ(0, pagination_model_->selected_page()); | 513 EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
| 513 | 514 |
| 514 gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint(); | 515 gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint(); |
| 515 gfx::Point to = gfx::Point(apps_grid_view_->width(), | 516 gfx::Point to = gfx::Point(apps_grid_view_->width(), |
| 516 apps_grid_view_->height() / 2); | 517 apps_grid_view_->height() / 2); |
| 517 | 518 |
| 518 // Drag to right edge. | 519 // Drag to right edge. |
| 519 SimulateDrag(AppsGridView::MOUSE, from, to); | 520 SimulateDrag(AppsGridView::MOUSE, from, to); |
| 520 | 521 |
| 521 // Page should be flipped after sometime. | 522 // Page should be flipped after sometime. |
| 522 EXPECT_TRUE(page_flip_waiter.Wait(0)); | 523 EXPECT_TRUE(page_flip_waiter.Wait(0)); |
| 523 EXPECT_EQ(1, pagination_model_->selected_page()); | 524 EXPECT_EQ(1, GetPaginationModel()->selected_page()); |
| 524 | 525 |
| 525 // Stay there and page should be flipped again. | 526 // Stay there and page should be flipped again. |
| 526 EXPECT_TRUE(page_flip_waiter.Wait(0)); | 527 EXPECT_TRUE(page_flip_waiter.Wait(0)); |
| 527 EXPECT_EQ(2, pagination_model_->selected_page()); | 528 EXPECT_EQ(2, GetPaginationModel()->selected_page()); |
| 528 | 529 |
| 529 // Stay there longer and no page flip happen since we are at the last page. | 530 // Stay there longer and no page flip happen since we are at the last page. |
| 530 EXPECT_FALSE(page_flip_waiter.Wait(100)); | 531 EXPECT_FALSE(page_flip_waiter.Wait(100)); |
| 531 EXPECT_EQ(2, pagination_model_->selected_page()); | 532 EXPECT_EQ(2, GetPaginationModel()->selected_page()); |
| 532 | 533 |
| 533 apps_grid_view_->EndDrag(true); | 534 apps_grid_view_->EndDrag(true); |
| 534 | 535 |
| 535 // Now drag to the left edge and test the other direction. | 536 // Now drag to the left edge and test the other direction. |
| 536 to.set_x(0); | 537 to.set_x(0); |
| 537 | 538 |
| 538 SimulateDrag(AppsGridView::MOUSE, from, to); | 539 SimulateDrag(AppsGridView::MOUSE, from, to); |
| 539 | 540 |
| 540 EXPECT_TRUE(page_flip_waiter.Wait(0)); | 541 EXPECT_TRUE(page_flip_waiter.Wait(0)); |
| 541 EXPECT_EQ(1, pagination_model_->selected_page()); | 542 EXPECT_EQ(1, GetPaginationModel()->selected_page()); |
| 542 | 543 |
| 543 EXPECT_TRUE(page_flip_waiter.Wait(0)); | 544 EXPECT_TRUE(page_flip_waiter.Wait(0)); |
| 544 EXPECT_EQ(0, pagination_model_->selected_page()); | 545 EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
| 545 | 546 |
| 546 EXPECT_FALSE(page_flip_waiter.Wait(100)); | 547 EXPECT_FALSE(page_flip_waiter.Wait(100)); |
| 547 EXPECT_EQ(0, pagination_model_->selected_page()); | 548 EXPECT_EQ(0, GetPaginationModel()->selected_page()); |
| 548 apps_grid_view_->EndDrag(true); | 549 apps_grid_view_->EndDrag(true); |
| 549 } | 550 } |
| 550 | 551 |
| 551 TEST_F(AppsGridViewTest, SimultaneousDragWithFolderDisabled) { | 552 TEST_F(AppsGridViewTest, SimultaneousDragWithFolderDisabled) { |
| 552 CommandLine::ForCurrentProcess()->AppendSwitch(switches::kDisableSyncAppList); | 553 CommandLine::ForCurrentProcess()->AppendSwitch(switches::kDisableSyncAppList); |
| 553 const int kTotalItems = 4; | 554 const int kTotalItems = 4; |
| 554 model_->PopulateApps(kTotalItems); | 555 model_->PopulateApps(kTotalItems); |
| 555 EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), | 556 EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), |
| 556 model_->GetModelContent()); | 557 model_->GetModelContent()); |
| 557 | 558 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 last_index))); | 670 last_index))); |
| 670 apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page2_last_row)); | 671 apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page2_last_row)); |
| 671 SimulateKeyPress(ui::VKEY_NEXT); | 672 SimulateKeyPress(ui::VKEY_NEXT); |
| 672 EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( | 673 EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( |
| 673 last_index))); | 674 last_index))); |
| 674 | 675 |
| 675 | 676 |
| 676 | 677 |
| 677 // After page switch, arrow keys select first item on current page. | 678 // After page switch, arrow keys select first item on current page. |
| 678 apps_grid_view_->SetSelectedView(GetItemViewAt(first_index)); | 679 apps_grid_view_->SetSelectedView(GetItemViewAt(first_index)); |
| 679 pagination_model_->SelectPage(1, false); | 680 GetPaginationModel()->SelectPage(1, false); |
| 680 SimulateKeyPress(ui::VKEY_UP); | 681 SimulateKeyPress(ui::VKEY_UP); |
| 681 EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( | 682 EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( |
| 682 first_index_on_page2))); | 683 first_index_on_page2))); |
| 683 } | 684 } |
| 684 | 685 |
| 685 TEST_F(AppsGridViewTest, ItemLabelShortNameOverride) { | 686 TEST_F(AppsGridViewTest, ItemLabelShortNameOverride) { |
| 686 // If the app's full name and short name differ, the title label's tooltip | 687 // If the app's full name and short name differ, the title label's tooltip |
| 687 // should always be the full name of the app. | 688 // should always be the full name of the app. |
| 688 std::string expected_text("xyz"); | 689 std::string expected_text("xyz"); |
| 689 std::string expected_tooltip("tooltip"); | 690 std::string expected_tooltip("tooltip"); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 711 AppListItemView* item_view = GetItemViewAt(0); | 712 AppListItemView* item_view = GetItemViewAt(0); |
| 712 ASSERT_TRUE(item_view); | 713 ASSERT_TRUE(item_view); |
| 713 const views::Label* title_label = item_view->title(); | 714 const views::Label* title_label = item_view->title(); |
| 714 EXPECT_FALSE(title_label->GetTooltipText( | 715 EXPECT_FALSE(title_label->GetTooltipText( |
| 715 title_label->bounds().CenterPoint(), &actual_tooltip)); | 716 title_label->bounds().CenterPoint(), &actual_tooltip)); |
| 716 EXPECT_EQ(title, base::UTF16ToUTF8(title_label->text())); | 717 EXPECT_EQ(title, base::UTF16ToUTF8(title_label->text())); |
| 717 } | 718 } |
| 718 | 719 |
| 719 } // namespace test | 720 } // namespace test |
| 720 } // namespace app_list | 721 } // namespace app_list |
| OLD | NEW |