15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 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) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/shelf/shelf.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_button.h" 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_item_delegate_manager.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_model.h" 98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/shelf/shelf_view.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/test/shelf_test_api.h" 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/test/shelf_view_test_api.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/test/test_shelf_item_delegate.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/window_util.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/display.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/screen.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/win/windows_version.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing ash::ShelfView; 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing ash::ShelfButton; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ShelfTest : public ash::test::AshTestBase { 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfTest() 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : shelf_(NULL), 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_view_(NULL), 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_model_(NULL), 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) item_delegate_manager_(NULL) {} 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~ShelfTest() {} 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void SetUp() { 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) test::AshTestBase::SetUp(); 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_ = Shelf::ForPrimaryDisplay(); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(shelf_); 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test::ShelfTestAPI test(shelf_); 498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) shelf_view_ = test.shelf_view(); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shelf_model_ = shelf_view_->model(); 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) item_delegate_manager_ = 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->shelf_item_delegate_manager(); 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) test_.reset(new ash::test::ShelfViewTestAPI(shelf_view_)); 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void TearDown() OVERRIDE { 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) test::AshTestBase::TearDown(); 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shelf* shelf() { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return shelf_; 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ShelfView* shelf_view() { 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return shelf_view_; 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShelfModel* shelf_model() { 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return shelf_model_; 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ShelfItemDelegateManager* item_manager() { 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return item_delegate_manager_; 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ash::test::ShelfViewTestAPI* test_api() { 78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return test_.get(); 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shelf* shelf_; 838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ShelfView* shelf_view_; 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShelfModel* shelf_model_; 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ShelfItemDelegateManager* item_delegate_manager_; 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<test::ShelfViewTestAPI> test_; 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShelfTest); 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Confirms that ShelfItem reflects the appropriated state. 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ShelfTest, StatusReflection) { 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Initially we have the app list. 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int button_count = test_api()->GetButtonCount(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Add running platform app. 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfItem item; 98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) item.type = TYPE_PLATFORM_APP; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item.status = STATUS_RUNNING; 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int index = shelf_model()->Add(item); 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(++button_count, test_api()->GetButtonCount()); 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShelfButton* button = test_api()->GetButton(index); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ShelfButton::STATE_RUNNING, button->state()); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove it. 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shelf_model()->RemoveItemAt(index); 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(--button_count, test_api()->GetButtonCount()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Confirm that using the menu will clear the hover attribute. To avoid another 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// browser test we check this here. 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ShelfTest, checkHoverAfterMenu) { 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Initially we have the app list. 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int button_count = test_api()->GetButtonCount(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Add running platform app. 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfItem item; 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) item.type = TYPE_PLATFORM_APP; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.status = STATUS_RUNNING; 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int index = shelf_model()->Add(item); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ShelfItemDelegate> delegate( 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new test::TestShelfItemDelegate(NULL)); 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) item_manager()->SetShelfItemDelegate(shelf_model()->items()[index].id, 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate.Pass()); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(++button_count, test_api()->GetButtonCount()); 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShelfButton* button = test_api()->GetButton(index); 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) button->AddState(ShelfButton::STATE_HOVERED); 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) button->ShowContextMenu(gfx::Point(), ui::MENU_SOURCE_MOUSE); 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(button->state() & ShelfButton::STATE_HOVERED); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove it. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shelf_model()->RemoveItemAt(index); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ShelfTest, ShowOverflowBubble) { 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfID first_item_id = shelf_model()->next_id(); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Add platform app button until overflow. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int items_added = 0; 142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) while (!test_api()->IsOverflowButtonVisible()) { 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfItem item; 144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) item.type = TYPE_PLATFORM_APP; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item.status = STATUS_RUNNING; 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shelf_model()->Add(item); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++items_added; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LT(items_added, 10000); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shows overflow bubble. 153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) test_api()->ShowOverflowBubble(); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(shelf()->IsShowingOverflowBubble()); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Removes the first item in main shelf view. 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shelf_model()->RemoveItemAt(shelf_model()->ItemIndexByID(first_item_id)); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Waits for all transitions to finish and there should be no crash. 160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) test_api()->RunMessageLoopUntilAnimationsDone(); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(shelf()->IsShowingOverflowBubble()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 165