15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/apps_grid_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/app_list/app_list_constants.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/app_list/app_list_folder_item.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/app_list_item.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/app_list_model.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/app_list/app_list_switches.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/pagination_model.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/test/app_list_test_model.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/app_list_item_view.h" 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/app_list/views/apps_grid_view_folder_delegate.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/test/apps_grid_view_test_api.h" 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kCols = 2; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRows = 2; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTilesPerPage = kCols * kRows; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kWidth = 320; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kHeight = 240; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageFlipWaiter : public PaginationModelObserver { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PageFlipWaiter(base::MessageLoopForUI* ui_loop, PaginationModel* model) 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : ui_loop_(ui_loop), model_(model), wait_(false) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_->AddObserver(this); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PageFlipWaiter() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_->RemoveObserver(this); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void Wait() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!wait_); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wait_ = true; 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_loop_->Run(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wait_ = false; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void Reset() { selected_pages_.clear(); } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& selected_pages() const { return selected_pages_; } 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PaginationModelObserver overrides: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TotalPagesChanged() OVERRIDE { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SelectedPageChanged(int old_selected, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_selected) OVERRIDE { 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!selected_pages_.empty()) 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) selected_pages_ += ','; 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) selected_pages_ += base::IntToString(new_selected); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (wait_) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_loop_->Quit(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void TransitionStarted() OVERRIDE { 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TransitionChanged() OVERRIDE { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI* ui_loop_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaginationModel* model_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool wait_; 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string selected_pages_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PageFlipWaiter); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class AppsGridViewTest : public views::ViewsTestBase { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppsGridViewTest() {} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AppsGridViewTest() {} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testing::Test overrides: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) views::ViewsTestBase::SetUp(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_.reset(new AppListTestModel); 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->SetFoldersEnabled(true); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) apps_grid_view_.reset(new AppsGridView(NULL)); 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) apps_grid_view_->SetLayout(kCols, kRows); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->SetBoundsRect(gfx::Rect(gfx::Size(kWidth, kHeight))); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->SetModel(model_.get()); 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) apps_grid_view_->SetItemList(model_->top_level_item_list()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_.reset(new AppsGridViewTestApi(apps_grid_view_.get())); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_.reset(); // Release apps grid view before models. 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) views::ViewsTestBase::TearDown(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void EnsureFoldersEnabled() { 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Folders require AppList sync to be enabled. 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CommandLine::ForCurrentProcess()->AppendSwitch( 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch switches::kEnableSyncAppList); 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppListItemView* GetItemViewAt(int index) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<AppListItemView*>( 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_->GetViewAtModelIndex(index)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppListItemView* GetItemViewForPoint(const gfx::Point& point) { 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t i = 0; i < model_->top_level_item_list()->item_count(); ++i) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppListItemView* view = GetItemViewAt(i); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view->bounds().Contains(point)) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect GetItemTileRectAt(int row, int col) { 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_GT(model_->top_level_item_list()->item_count(), 0u); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Insets insets(apps_grid_view_->GetInsets()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect(gfx::Point(insets.left(), insets.top()), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetItemViewAt(0)->bounds().size()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect.Offset(col * rect.width(), row * rect.height()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rect; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PaginationModel* GetPaginationModel() { 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return apps_grid_view_->pagination_model(); 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Points are in |apps_grid_view_|'s coordinates. 15234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) AppListItemView* SimulateDrag(AppsGridView::Pointer pointer, 15334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) const gfx::Point& from, 15434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) const gfx::Point& to) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppListItemView* view = GetItemViewForPoint(from); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(view); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point translated_from = gfx::PointAtOffsetFromOrigin( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from - view->bounds().origin()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point translated_to = gfx::PointAtOffsetFromOrigin( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to - view->bounds().origin()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) translated_from, from, 0, 0); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->InitiateDrag(view, pointer, pressed_event); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) translated_to, to, 0, 0); 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch apps_grid_view_->UpdateDragFromItem(pointer, drag_event); 17034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return view; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SimulateKeyPress(ui::KeyboardCode key_code) { 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent key_event(ui::ET_KEY_PRESSED, key_code, ui::EF_NONE); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_grid_view_->OnKeyPressed(key_event); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<AppListTestModel> model_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AppsGridView> apps_grid_view_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AppsGridViewTestApi> test_api_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AppsGridViewTest); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass TestAppsGridViewFolderDelegate : public AppsGridViewFolderDelegate { 187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestAppsGridViewFolderDelegate() : show_bubble_(false) {} 189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ~TestAppsGridViewFolderDelegate() {} 190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Overridden from AppsGridViewFolderDelegate: 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void UpdateFolderViewBackground(bool show_bubble) OVERRIDE { 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch show_bubble_ = show_bubble; 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void ReparentItem(AppListItemView* original_drag_view, 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::Point& drag_point_in_folder_grid) 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OVERRIDE {} 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch virtual void DispatchDragEventForReparent( 2014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch AppsGridView::Pointer pointer, 2024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch const gfx::Point& drag_point_in_folder_grid) OVERRIDE {} 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void DispatchEndDragEventForReparent( 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool events_forwarded_to_drag_drop_host, 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool cancel_drag) OVERRIDE {} 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool IsPointOutsideOfFolderBoundary(const gfx::Point& point) 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OVERRIDE { 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool IsOEMFolder() const OVERRIDE { return false; } 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetRootLevelDragViewVisible(bool visible) OVERRIDE {} 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool show_bubble() { return show_bubble_; } 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool show_bubble_; 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(TestAppsGridViewFolderDelegate); 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppsGridViewTest, CreatePage) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fully populates a page. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kPages = 1; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->PopulateApps(kPages * kTilesPerPage); 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kPages, GetPaginationModel()->total_pages()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds one more and gets a new page created. 2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) model_->CreateAndAddItem("Extra"); 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kPages + 1, GetPaginationModel()->total_pages()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppsGridViewTest, EnsureHighlightedVisible) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kPages = 3; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->PopulateApps(kPages * kTilesPerPage); 23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kPages, GetPaginationModel()->total_pages()); 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, GetPaginationModel()->selected_page()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Highlight first one and last one one first page and first page should be 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // selected. 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->HighlightItemAt(0); 24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, GetPaginationModel()->selected_page()); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->HighlightItemAt(kTilesPerPage - 1); 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, GetPaginationModel()->selected_page()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Highlight first one on 2nd page and 2nd page should be selected. 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->HighlightItemAt(kTilesPerPage + 1); 25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1, GetPaginationModel()->selected_page()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Highlight last one in the model and last page should be selected. 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model_->HighlightItemAt(model_->top_level_item_list()->item_count() - 1); 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kPages - 1, GetPaginationModel()->selected_page()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppsGridViewTest, RemoveSelectedLastApp) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kTotalItems = 2; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kLastItemIndex = kTotalItems - 1; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->PopulateApps(kTotalItems); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppListItemView* last_view = GetItemViewAt(kLastItemIndex); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->SetSelectedView(last_view); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->DeleteItem(model_->GetItemName(kLastItemIndex)); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(apps_grid_view_->IsSelectedView(last_view)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No crash happens. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppListItemView* view = GetItemViewAt(0); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->SetSelectedView(view); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(view)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AppsGridViewTest, MouseDragWithFolderDisabled) { 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->SetFoldersEnabled(false); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kTotalItems = 4; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->PopulateApps(kTotalItems); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetModelContent()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point to = GetItemTileRectAt(0, 1).CenterPoint(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dragging changes model order. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::MOUSE, from, to); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(false); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"), 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetModelContent()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_->LayoutToIdealBounds(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Canceling drag should keep existing order. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::MOUSE, from, to); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(true); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"), 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetModelContent()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_->LayoutToIdealBounds(); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleting an item keeps remaining intact. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::MOUSE, from, to); 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) model_->DeleteItem(model_->GetItemName(0)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(false); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Item 1,Item 2,Item 3"), 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetModelContent()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_->LayoutToIdealBounds(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding a launcher item cancels the drag and respects the order. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::MOUSE, from, to); 3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(apps_grid_view_->has_dragged_view()); 3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) model_->CreateAndAddItem("Extra"); 3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // No need to EndDrag explicitly - adding an item should do this. 3136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(apps_grid_view_->has_dragged_view()); 3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Even though cancelled, mouse move events can still arrive via the item 3156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // view. Ensure that behaves sanely, and doesn't start a new drag. 3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::MouseEvent drag_event( 3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::ET_MOUSE_DRAGGED, gfx::Point(1, 1), gfx::Point(2, 2), 0, 0); 3186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, drag_event); 3196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(apps_grid_view_->has_dragged_view()); 3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Item 1,Item 2,Item 3,Extra"), 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetModelContent()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_->LayoutToIdealBounds(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 326effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragItemIntoFolder) { 327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EnsureFoldersEnabled(); 328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 329effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t kTotalItems = 3; 330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->PopulateApps(kTotalItems); 331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(model_->top_level_item_list()->item_count(), kTotalItems); 332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(std::string("Item 0,Item 1,Item 2"), model_->GetModelContent()); 333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point from = GetItemTileRectAt(0, 1).CenterPoint(); 335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point to = GetItemTileRectAt(0, 0).CenterPoint(); 336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Dragging item_1 over item_0 creates a folder. 338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, from, to); 339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(false); 340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(kTotalItems - 1, model_->top_level_item_list()->item_count()); 341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(AppListFolderItem::kItemType, 342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(0)->GetItemType()); 343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AppListFolderItem* folder_item = static_cast<AppListFolderItem*>( 344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(0)); 345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(2u, folder_item->ChildItemCount()); 346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AppListItem* item_0 = model_->FindItem("Item 0"); 347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(item_0->IsInFolder()); 348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), item_0->folder_id()); 349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AppListItem* item_1 = model_->FindItem("Item 1"); 350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(item_1->IsInFolder()); 351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), item_1->folder_id()); 352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string expected_items = folder_item->id() + ",Item 2"; 353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(expected_items, model_->GetModelContent()); 354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_api_->LayoutToIdealBounds(); 355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Dragging item_2 to the folder adds item_2 to the folder. 357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, from, to); 358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(false); 359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(kTotalItems - 2, model_->top_level_item_list()->item_count()); 361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), model_->GetModelContent()); 362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(3u, folder_item->ChildItemCount()); 363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch item_0 = model_->FindItem("Item 0"); 364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(item_0->IsInFolder()); 365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), item_0->folder_id()); 366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch item_1 = model_->FindItem("Item 1"); 367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(item_1->IsInFolder()); 368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), item_1->folder_id()); 369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AppListItem* item_2 = model_->FindItem("Item 2"); 370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(item_2->IsInFolder()); 371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), item_2->folder_id()); 372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_api_->LayoutToIdealBounds(); 373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 375effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragMaxItemsInFolder) { 376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EnsureFoldersEnabled(); 377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Create and add a folder with 15 items in it. 379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t kTotalItems = kMaxFolderItems - 1; 380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->CreateAndPopulateFolderWithApps(kTotalItems); 381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1u, model_->top_level_item_list()->item_count()); 382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(AppListFolderItem::kItemType, 383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(0)->GetItemType()); 384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AppListFolderItem* folder_item = static_cast<AppListFolderItem*>( 385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(0)); 386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(kTotalItems, folder_item->ChildItemCount()); 387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Create and add another 2 items. 389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->PopulateAppWithId(kTotalItems); 390effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->PopulateAppWithId(kTotalItems + 1); 391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(3u, model_->top_level_item_list()->item_count()); 392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), model_->top_level_item_list()->item_at(0)->id()); 393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(model_->GetItemName(kMaxFolderItems - 1), 394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(1)->id()); 395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(model_->GetItemName(kMaxFolderItems), 396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(2)->id()); 397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point from = GetItemTileRectAt(0, 1).CenterPoint(); 399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point to = GetItemTileRectAt(0, 0).CenterPoint(); 400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Dragging one item into the folder, the folder should accept the item. 402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, from, to); 403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(false); 404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(2u, model_->top_level_item_list()->item_count()); 405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), model_->top_level_item_list()->item_at(0)->id()); 406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(kMaxFolderItems, folder_item->ChildItemCount()); 407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(model_->GetItemName(kMaxFolderItems), 408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(1)->id()); 409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_api_->LayoutToIdealBounds(); 410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Dragging the last item over the folder, the folder won't accept the new 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // item. 413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, from, to); 414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(false); 415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(2u, model_->top_level_item_list()->item_count()); 416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(kMaxFolderItems, folder_item->ChildItemCount()); 417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_api_->LayoutToIdealBounds(); 41834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 41934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 42034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// Check that moving items around doesn't allow a drop to happen into a full 42134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// folder. 42234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)TEST_F(AppsGridViewTest, MouseDragMaxItemsInFolderWithMovement) { 42334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EnsureFoldersEnabled(); 42434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 42534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) // Create and add a folder with 16 items in it. 42634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) size_t kTotalItems = kMaxFolderItems; 42734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) model_->CreateAndPopulateFolderWithApps(kTotalItems); 42834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(1u, model_->top_level_item_list()->item_count()); 42934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(AppListFolderItem::kItemType, 43034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) model_->top_level_item_list()->item_at(0)->GetItemType()); 43134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) AppListFolderItem* folder_item = static_cast<AppListFolderItem*>( 43234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) model_->top_level_item_list()->item_at(0)); 43334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(kTotalItems, folder_item->ChildItemCount()); 43434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 43534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) // Create and add another item. 43634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) model_->PopulateAppWithId(kTotalItems); 43734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(2u, model_->top_level_item_list()->item_count()); 43834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(folder_item->id(), model_->top_level_item_list()->item_at(0)->id()); 43934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(model_->GetItemName(kMaxFolderItems), 44034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) model_->top_level_item_list()->item_at(1)->id()); 44134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 44234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) AppListItemView* folder_view = 44334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) GetItemViewForPoint(GetItemTileRectAt(0, 0).CenterPoint()); 44434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 44534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) // Drag the new item to the left so that the grid reorders. 44634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) gfx::Point from = GetItemTileRectAt(0, 1).CenterPoint(); 44734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) gfx::Point to = GetItemTileRectAt(0, 0).bottom_left(); 44834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) AppListItemView* dragged_view = SimulateDrag(AppsGridView::MOUSE, from, to); 44934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) test_api_->LayoutToIdealBounds(); 45034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 45134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) // The grid now looks like | blank | folder |. 45234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(NULL, GetItemViewForPoint(GetItemTileRectAt(0, 0).CenterPoint())); 45334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(folder_view, 45434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) GetItemViewForPoint(GetItemTileRectAt(0, 1).CenterPoint())); 45534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 45634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) // Move onto the folder and end the drag. 45734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) to = GetItemTileRectAt(0, 1).CenterPoint(); 45834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) gfx::Point translated_to = 45934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) gfx::PointAtOffsetFromOrigin(to - dragged_view->bounds().origin()); 46034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, translated_to, to, 0, 0); 46134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, drag_event); 46234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) apps_grid_view_->EndDrag(false); 46334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 46434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) // The item should not have moved into the folder. 46534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(2u, model_->top_level_item_list()->item_count()); 46634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ(kMaxFolderItems, folder_item->ChildItemCount()); 46734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) test_api_->LayoutToIdealBounds(); 468effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 469effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 470effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragItemReorder) { 471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This test assumes Folders are enabled. 472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EnsureFoldersEnabled(); 473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_->PopulateApps(4); 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4u, model_->top_level_item_list()->item_count()); 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_->GetModelContent()); 478effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Dragging an item towards its neighbours should not reorder until the drag 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // is past the folder drop point. 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Point top_right = GetItemTileRectAt(0, 1).CenterPoint(); 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Vector2d drag_vector; 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int half_tile_width = 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (GetItemTileRectAt(0, 1).x() - GetItemTileRectAt(0, 0).x()) / 2; 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tile_height = GetItemTileRectAt(1, 0).y() - GetItemTileRectAt(0, 0).y(); 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Drag left but stop before the folder dropping circle. 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drag_vector.set_x(-half_tile_width - 5); 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector); 490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(false); 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_->GetModelContent()); 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Drag left, past the folder dropping circle. 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drag_vector.set_x(-3 * half_tile_width + 5); 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector); 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci apps_grid_view_->EndDrag(false); 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"), 4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_->GetModelContent()); 5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Drag down, between apps 2 and 3. The gap should open up, making space for 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // app 0 in the bottom left. 5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drag_vector.set_x(-half_tile_width); 5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drag_vector.set_y(tile_height); 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector); 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci apps_grid_view_->EndDrag(false); 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(std::string("Item 1,Item 2,Item 0,Item 3"), 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_->GetModelContent()); 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Drag up, between apps 1 and 2. The gap should open up, making space for app 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 0 in the top right. 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Point bottom_left = GetItemTileRectAt(1, 0).CenterPoint(); 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drag_vector.set_x(half_tile_width); 5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drag_vector.set_y(-tile_height); 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SimulateDrag(AppsGridView::MOUSE, bottom_left, bottom_left + drag_vector); 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci apps_grid_view_->EndDrag(false); 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"), 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_->GetModelContent()); 5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Dragging down past the last app should reorder to the last position. 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drag_vector.set_x(half_tile_width); 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drag_vector.set_y(2 * tile_height); 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector); 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci apps_grid_view_->EndDrag(false); 5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(std::string("Item 1,Item 2,Item 3,Item 0"), 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_->GetModelContent()); 527effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 528effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 529effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragFolderReorder) { 530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EnsureFoldersEnabled(); 531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 532effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t kTotalItems = 2; 533effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->CreateAndPopulateFolderWithApps(kTotalItems); 534effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->PopulateAppWithId(kTotalItems); 535effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(2u, model_->top_level_item_list()->item_count()); 536effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(AppListFolderItem::kItemType, 537effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(0)->GetItemType()); 538effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AppListFolderItem* folder_item = static_cast<AppListFolderItem*>( 539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->top_level_item_list()->item_at(0)); 540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("Item 2", model_->top_level_item_list()->item_at(1)->id()); 541effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 542effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint(); 543effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point to = GetItemTileRectAt(0, 1).CenterPoint(); 544effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 545effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Dragging folder over item_1 should leads to re-ordering these two 546effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // items. 547effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, from, to); 548effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(false); 549effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(2u, model_->top_level_item_list()->item_count()); 550effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("Item 2", model_->top_level_item_list()->item_at(0)->id()); 551effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(folder_item->id(), model_->top_level_item_list()->item_at(1)->id()); 552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_api_->LayoutToIdealBounds(); 553effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 555effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragWithCancelDeleteAddItem) { 556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t kTotalItems = 4; 557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->PopulateApps(kTotalItems); 558effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(model_->top_level_item_list()->item_count(), kTotalItems); 559effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), 560effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->GetModelContent()); 561effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 562effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint(); 563effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point to = GetItemTileRectAt(0, 1).CenterPoint(); 564effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 565effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Canceling drag should keep existing order. 566effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, from, to); 567effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(true); 568effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), 569effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->GetModelContent()); 570effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_api_->LayoutToIdealBounds(); 571effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 572effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Deleting an item keeps remaining intact. 573effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, from, to); 574effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->DeleteItem(model_->GetItemName(2)); 575effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(false); 576effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(std::string("Item 0,Item 1,Item 3"), model_->GetModelContent()); 577effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_api_->LayoutToIdealBounds(); 578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 579effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Adding a launcher item cancels the drag and respects the order. 580effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, from, to); 581effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->CreateAndAddItem("Extra"); 582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(false); 583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(std::string("Item 0,Item 1,Item 3,Extra"), 584effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->GetModelContent()); 585effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_api_->LayoutToIdealBounds(); 586effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 587effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(AppsGridViewTest, MouseDragFlipPage) { 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_->SetPageFlipDelay(10); 59046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetPaginationModel()->SetTransitionDurations(10, 10); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PageFlipWaiter page_flip_waiter(message_loop(), GetPaginationModel()); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kPages = 3; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->PopulateApps(kPages * kTilesPerPage); 59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kPages, GetPaginationModel()->total_pages()); 59746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, GetPaginationModel()->selected_page()); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint(); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point to = gfx::Point(apps_grid_view_->width(), 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->height() / 2); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag to right edge. 604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_flip_waiter.Reset(); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::MOUSE, from, to); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Page should be flipped after sometime to hit page 1 and 2 then stop. 608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) while (test_api_->HasPendingPageFlip()) { 609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_flip_waiter.Wait(); 610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ("1,2", page_flip_waiter.selected_pages()); 61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(2, GetPaginationModel()->selected_page()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(true); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now drag to the left edge and test the other direction. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to.set_x(0); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_flip_waiter.Reset(); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::MOUSE, from, to); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) while (test_api_->HasPendingPageFlip()) { 623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_flip_waiter.Wait(); 624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ("1,0", page_flip_waiter.selected_pages()); 62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, GetPaginationModel()->selected_page()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(true); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AppsGridViewTest, SimultaneousDragWithFolderDisabled) { 63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->SetFoldersEnabled(false); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kTotalItems = 4; 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->PopulateApps(kTotalItems); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetModelContent()); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point mouse_from = GetItemTileRectAt(0, 0).CenterPoint(); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point mouse_to = GetItemTileRectAt(0, 1).CenterPoint(); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point touch_from = GetItemTileRectAt(1, 0).CenterPoint(); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point touch_to = GetItemTileRectAt(1, 1).CenterPoint(); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts a mouse drag first then a touch drag. 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::MOUSE, mouse_from, mouse_to); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::TOUCH, touch_from, touch_to); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finishes the drag and mouse drag wins. 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(false); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"), 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetModelContent()); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_->LayoutToIdealBounds(); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts a touch drag first then a mouse drag. 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::TOUCH, touch_from, touch_to); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateDrag(AppsGridView::MOUSE, mouse_from, mouse_to); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finishes the drag and touch drag wins. 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(false); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Item 1,Item 0,Item 3,Item 2"), 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->GetModelContent()); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_api_->LayoutToIdealBounds(); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 663effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, UpdateFolderBackgroundOnCancelDrag) { 664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EnsureFoldersEnabled(); 665c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 666effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const int kTotalItems = 4; 667effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestAppsGridViewFolderDelegate folder_delegate; 668effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->set_folder_delegate(&folder_delegate); 669effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->PopulateApps(kTotalItems); 670effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), 671effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->GetModelContent()); 672effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 673effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point mouse_from = GetItemTileRectAt(0, 0).CenterPoint(); 674effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Point mouse_to = GetItemTileRectAt(0, 1).CenterPoint(); 675effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 676effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Starts a mouse drag and then cancels it. 677effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SimulateDrag(AppsGridView::MOUSE, mouse_from, mouse_to); 678effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(folder_delegate.show_bubble()); 679effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch apps_grid_view_->EndDrag(true); 680effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FALSE(folder_delegate.show_bubble()); 681effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"), 682effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch model_->GetModelContent()); 683effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 684effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AppsGridViewTest, HighlightWithKeyboard) { 68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int kPages = 3; 68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int kItems = (kPages - 1) * kTilesPerPage + 1; 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) model_->PopulateApps(kItems); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int first_index = 0; 69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int last_index = kItems - 1; 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int last_index_on_page1_first_row = kRows - 1; 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int last_index_on_page1 = kTilesPerPage - 1; 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int first_index_on_page2 = kTilesPerPage; 69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int first_index_on_page2_last_row = 2 * kTilesPerPage - kRows; 69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int last_index_on_page2_last_row = 2 * kTilesPerPage - 1; 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try moving off the item beyond the first one. 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_grid_view_->SetSelectedView(GetItemViewAt(first_index)); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_UP); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(first_index))); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_LEFT); 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(first_index))); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move to the last item and try to go past it. 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_grid_view_->SetSelectedView(GetItemViewAt(last_index)); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_DOWN); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(last_index))); 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_RIGHT); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(last_index))); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Move right on last item on page 1 should get to first item on page 2's last 71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // row and vice versa. 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page1)); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_RIGHT); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_index_on_page2_last_row))); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_LEFT); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_index_on_page1))); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Up/down on page boundary does nothing. 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page1)); 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_DOWN); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) last_index_on_page1))); 72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) apps_grid_view_->SetSelectedView( 72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetItemViewAt(first_index_on_page2_last_row)); 72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) apps_grid_view_-> 73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetSelectedView(GetItemViewAt(last_index_on_page1_first_row)); 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_UP); 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) last_index_on_page1_first_row))); 73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Page up and down should go to the same item on the next and last page. 73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) apps_grid_view_->SetSelectedView(GetItemViewAt(first_index_on_page2)); 73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SimulateKeyPress(ui::VKEY_PRIOR); 73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_index))); 74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SimulateKeyPress(ui::VKEY_NEXT); 74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 74290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_index_on_page2))); 74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Moving onto a a page with too few apps to support the expected index snaps 74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // to the last available index. 74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page2_last_row)); 74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SimulateKeyPress(ui::VKEY_RIGHT); 74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) last_index))); 75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page2_last_row)); 75190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SimulateKeyPress(ui::VKEY_NEXT); 75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) last_index))); 75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // After page switch, arrow keys select first item on current page. 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_grid_view_->SetSelectedView(GetItemViewAt(first_index)); 75946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetPaginationModel()->SelectPage(1, false); 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateKeyPress(ui::VKEY_UP); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt( 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_index_on_page2))); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 76558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AppsGridViewTest, ItemLabelShortNameOverride) { 76658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If the app's full name and short name differ, the title label's tooltip 76758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // should always be the full name of the app. 76858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string expected_text("xyz"); 76958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string expected_tooltip("tooltip"); 770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AppListItem* item = model_->CreateAndAddItem("Item with short name"); 771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model_->SetItemNameAndShortName(item, expected_tooltip, expected_text); 77258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 actual_tooltip; 77458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AppListItemView* item_view = GetItemViewAt(0); 77558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(item_view); 77658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const views::Label* title_label = item_view->title(); 77758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(title_label->GetTooltipText( 77858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) title_label->bounds().CenterPoint(), &actual_tooltip)); 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_tooltip, base::UTF16ToUTF8(actual_tooltip)); 7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_text, base::UTF16ToUTF8(title_label->text())); 78158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 78258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 78358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AppsGridViewTest, ItemLabelNoShortName) { 78458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If the app's full name and short name are the same, use the default tooltip 78558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // behavior of the label (only show a tooltip if the title is truncated). 78658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string title("a"); 787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AppListItem* item = model_->CreateAndAddItem(title); 788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model_->SetItemNameAndShortName(item, title, ""); 78958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 actual_tooltip; 79158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AppListItemView* item_view = GetItemViewAt(0); 79258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(item_view); 79358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const views::Label* title_label = item_view->title(); 79458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(title_label->GetTooltipText( 79558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) title_label->bounds().CenterPoint(), &actual_tooltip)); 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(title, base::UTF16ToUTF8(title_label->text())); 79758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 79858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace app_list 801