shelf_view_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
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)
58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/shelf/shelf_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/launcher/launcher_item_delegate_manager.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/launcher/launcher_types.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/overflow_bubble.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/overflow_bubble_view.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_button.h"
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/shelf/shelf_icon_observer.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_model.h"
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/shelf/shelf_tooltip_manager.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/test/launcher_test_api.h"
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/test/overflow_bubble_view_test_api.h"
288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/test/shelf_view_test_api.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/shell_test_api.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/test_launcher_delegate.h"
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/test/test_launcher_item_delegate.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/command_line.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/test/event_generator.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/view_model.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// ShelfIconObserver tests.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class TestShelfIconObserver : public ShelfIconObserver {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit TestShelfIconObserver(Launcher* launcher)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : launcher_(launcher),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        change_notified_(false) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (launcher_)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      launcher_->AddIconObserver(this);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~TestShelfIconObserver() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (launcher_)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      launcher_->RemoveIconObserver(this);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // ShelfIconObserver implementation.
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnShelfIconPositionsChanged() OVERRIDE {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    change_notified_ = true;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int change_notified() const { return change_notified_; }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset() { change_notified_ = false; }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Launcher* launcher_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool change_notified_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestShelfIconObserver);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ShelfViewIconObserverTest : public ash::test::AshTestBase {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ShelfViewIconObserverTest() {}
878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual ~ShelfViewIconObserverTest() {}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Launcher* launcher = Launcher::ForPrimaryDisplay();
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    observer_.reset(new TestShelfIconObserver(launcher));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    shelf_view_test_.reset(new ShelfViewTestAPI(
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        LauncherTestAPI(launcher).shelf_view()));
968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    shelf_view_test_->SetAnimationDuration(1);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.reset();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestShelfIconObserver* observer() { return observer_.get(); }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ShelfViewTestAPI* shelf_view_test() {
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return shelf_view_test_.get();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Launcher* LauncherForSecondaryDisplay() {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Launcher::ForWindow(Shell::GetAllRootWindows()[1]);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<TestShelfIconObserver> observer_;
1168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ShelfViewTestAPI> shelf_view_test_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfViewIconObserverTest);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewIconObserverTest, AddRemove) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::test::TestLauncherDelegate* launcher_delegate =
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::test::TestLauncherDelegate::instance();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launcher_delegate);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<views::Widget> widget(new views::Widget());
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launcher_delegate->AddLauncherItem(widget->GetNativeWindow());
1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  shelf_view_test()->RunMessageLoopUntilAnimationsDone();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow());
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  shelf_view_test()->RunMessageLoopUntilAnimationsDone();
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer()->Reset();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sometimes fails on trybots on win7_aura. http://crbug.com/177135
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AddRemoveWithMultipleDisplays \
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISABLED_AddRemoveWithMultipleDisplays
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AddRemoveWithMultipleDisplays \
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddRemoveWithMultipleDisplays
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure creating/deleting an window on one displays notifies a
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// launcher on external display as well as one on primary.
1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewIconObserverTest, MAYBE_AddRemoveWithMultipleDisplays) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x400,400x400");
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestShelfIconObserver second_observer(LauncherForSecondaryDisplay());
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::test::TestLauncherDelegate* launcher_delegate =
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::test::TestLauncherDelegate::instance();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(launcher_delegate);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<views::Widget> widget(new views::Widget());
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Init(params);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_delegate->AddLauncherItem(widget->GetNativeWindow());
1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  shelf_view_test()->RunMessageLoopUntilAnimationsDone();
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(second_observer.change_notified());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer()->Reset();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_observer.Reset();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow());
1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  shelf_view_test()->RunMessageLoopUntilAnimationsDone();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(second_observer.change_notified());
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_observer.Reset();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewIconObserverTest, BoundsChanged) {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::ShelfWidget* shelf = Shell::GetPrimaryRootWindowController()->shelf();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Launcher* launcher = Launcher::ForPrimaryDisplay();
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size shelf_size =
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shelf->GetWindowBoundsInScreen().size();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf_size.set_width(shelf_size.width() / 2);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_GT(shelf_size.width(), 0);
1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  launcher->SetShelfViewBounds(gfx::Rect(shelf_size));
1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // No animation happens for ShelfView bounds change.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// ShelfView tests.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// LauncherItemDelegate for ShelfViewTest.OverflowBubbleSize only.
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This class should only be used for re-insert test because it cannot handle
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// unpin request.
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestLauncherDelegateForShelfView : public TestLauncherDelegate {
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit TestLauncherDelegateForShelfView(ShelfModel* model)
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : TestLauncherDelegate(model) {}
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~TestLauncherDelegateForShelfView() {}
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // TestLauncherDelegate overrides:
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool IsAppPinned(const std::string& app_id) OVERRIDE {
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Returns true for ShelfViewTest.OverflowBubbleSize. To test ripping off in
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // that test, an item is already pinned state.
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return true;
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestLauncherDelegateForShelfView);
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ShelfViewTest : public AshTestBase {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ShelfViewTest() : model_(NULL), shelf_view_(NULL), browser_index_(1) {}
2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual ~ShelfViewTest() {}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test::ShellTestApi test_api(Shell::GetInstance());
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    model_ = test_api.shelf_model();
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Launcher* launcher = Launcher::ForPrimaryDisplay();
2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    shelf_view_ = test::LauncherTestAPI(launcher).shelf_view();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The bounds should be big enough for 4 buttons + overflow chevron.
2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    shelf_view_->SetBounds(0, 0, 500,
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        internal::ShelfLayoutManager::GetPreferredShelfSize());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    test_api_.reset(new ShelfViewTestAPI(shelf_view_));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->SetAnimationDuration(1);  // Speeds up animation for test.
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    item_manager_ =
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ash::Shell::GetInstance()->launcher_item_delegate_manager();
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK(item_manager_);
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Add browser shortcut launcher item at index 0 for test.
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddBrowserShortcut();
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_api_.reset();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CreateAndSetLauncherItemDelegateForID(LauncherID id) {
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<LauncherItemDelegate> delegate(
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        new ash::test::TestLauncherItemDelegate(NULL));
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    item_manager_->SetLauncherItemDelegate(id, delegate.Pass());
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LauncherID AddBrowserShortcut() {
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LauncherItem browser_shortcut;
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    browser_shortcut.type = TYPE_BROWSER_SHORTCUT;
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LauncherID id = model_->next_id();
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    model_->AddAt(browser_index_, browser_shortcut);
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CreateAndSetLauncherItemDelegateForID(id);
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return id;
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddAppShortcut() {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItem item;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type = TYPE_APP_SHORTCUT;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.status = STATUS_CLOSED;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = model_->next_id();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->Add(item);
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CreateAndSetLauncherItemDelegateForID(id);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID AddPanel() {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherID id = AddPanelNoWait();
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return id;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddPlatformAppNoWait() {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItem item;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type = TYPE_PLATFORM_APP;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.status = STATUS_RUNNING;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = model_->next_id();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->Add(item);
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CreateAndSetLauncherItemDelegateForID(id);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID AddPanelNoWait() {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherItem item;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item.type = TYPE_APP_PANEL;
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item.status = STATUS_RUNNING;
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherID id = model_->next_id();
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_->Add(item);
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CreateAndSetLauncherItemDelegateForID(id);
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return id;
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddPlatformApp() {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = AddPlatformAppNoWait();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveByID(LauncherID id) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->RemoveItemAt(model_->ItemIndexByID(id));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* GetButtonByID(LauncherID id) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index = model_->ItemIndexByID(id);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_api_->GetButton(index);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem GetItemByID(LauncherID id) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItems::const_iterator items = model_->ItemByID(id);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *items;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckModelIDs(
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<std::pair<LauncherID, views::View*> >& id_map) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t map_index = 0;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t model_index = 0;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         model_index < model_->items().size();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++model_index) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::LauncherItem item = model_->items()[model_index];
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::LauncherID id = item.id;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(id_map[map_index].first, id);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(id_map[map_index].second, GetButtonByID(id));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++map_index;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(map_index, id_map.size());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyLauncherItemBoundsAreValid() {
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i=0;i <= test_api_->GetLastVisibleIndex(); ++i) {
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (test_api_->GetButton(i)) {
3518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        gfx::Rect shelf_view_bounds = shelf_view_->GetLocalBounds();
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect item_bounds = test_api_->GetBoundsByIndex(i);
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.x() >= 0);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.y() >= 0);
3558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        EXPECT_TRUE(item_bounds.right() <= shelf_view_bounds.width());
3568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        EXPECT_TRUE(item_bounds.bottom() <= shelf_view_bounds.height());
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  views::View* SimulateButtonPressed(
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      internal::ShelfButtonHost::Pointer pointer,
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      int button_index) {
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    internal::ShelfButtonHost* button_host = shelf_view_;
36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* button = test_api_->GetButton(button_index);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent click_event(ui::ET_MOUSE_PRESSED,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               button->bounds().origin(),
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               button->GetBoundsInScreen().origin(), 0);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    button_host->PointerPressedOnButton(button, pointer, click_event);
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return button;
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::View* SimulateClick(internal::ShelfButtonHost::Pointer pointer,
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                             int button_index) {
375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    internal::ShelfButtonHost* button_host = shelf_view_;
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    views::View* button = SimulateButtonPressed(pointer, button_index);
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    button_host->PointerReleasedOnButton(button,
378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         internal::ShelfButtonHost::MOUSE,
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                         false);
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return button;
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::View* SimulateDrag(internal::ShelfButtonHost::Pointer pointer,
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                            int button_index,
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                            int destination_index) {
386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    internal::ShelfButtonHost* button_host = shelf_view_;
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    views::View* button = SimulateButtonPressed(pointer, button_index);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drag.
39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* destination = test_api_->GetButton(destination_index);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED,
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              destination->bounds().origin(),
39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                              destination->GetBoundsInScreen().origin(), 0);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    button_host->PointerDraggedOnButton(button, pointer, drag_event);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return button;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupForDragTest(
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<std::pair<LauncherID, views::View*> >* id_map) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize |id_map| with the automatically-created launcher buttons.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < model_->items().size(); ++i) {
402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      internal::ShelfButton* button = test_api_->GetButton(i);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id_map->push_back(std::make_pair(model_->items()[i].id, button));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(CheckModelIDs(*id_map));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add 5 app launcher buttons for testing.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < 5; ++i) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LauncherID id = AddAppShortcut();
41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // App Icon is located at index 0, and browser shortcut is located at
41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // index 1. So we should start to add app shortcut at index 2.
41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      id_map->insert(id_map->begin() + (i + browser_index_ + 1),
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     std::make_pair(id, GetButtonByID(id)));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(CheckModelIDs(*id_map));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* GetTooltipAnchorView() {
4198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return shelf_view_->tooltip_manager()->anchor_;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowTooltip() {
4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    shelf_view_->tooltip_manager()->ShowInternal();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ShelfModel* model_;
4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  internal::ShelfView* shelf_view_;
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int browser_index_;
4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LauncherItemDelegateManager* item_manager_;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ShelfViewTestAPI> test_api_;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfViewTest);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ShelfViewLegacyShelfLayoutTest : public ShelfViewTest {
43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
4398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ShelfViewLegacyShelfLayoutTest() : ShelfViewTest() {
44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    browser_index_ = 0;
44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual ~ShelfViewLegacyShelfLayoutTest() {}
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ash::switches::kAshDisableAlternateShelfLayout);
4488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ShelfViewTest::SetUp();
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
4528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfViewLegacyShelfLayoutTest);
45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ScopedTextDirectionChange {
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedTextDirectionChange(bool is_rtl)
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : is_rtl_(is_rtl) {
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    original_locale_ = l10n_util::GetApplicationLocale(std::string());
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (is_rtl_)
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::i18n::SetICUDefaultLocale("he");
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CheckTextDirectionIsCorrect();
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~ScopedTextDirectionChange() {
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (is_rtl_)
4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::i18n::SetICUDefaultLocale(original_locale_);
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CheckTextDirectionIsCorrect() {
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_EQ(is_rtl_, base::i18n::IsRTL());
4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool is_rtl_;
4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string original_locale_;
4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
4784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ShelfViewTextDirectionTest
4808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    : public ShelfViewTest,
481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      public testing::WithParamInterface<bool> {
482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
4838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ShelfViewTextDirectionTest() : text_direction_change_(GetParam()) {}
4848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual ~ShelfViewTextDirectionTest() {}
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
4878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ShelfViewTest::SetUp();
488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
4918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ShelfViewTest::TearDown();
492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedTextDirectionChange text_direction_change_;
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfViewTextDirectionTest);
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that the ideal item icon bounds match the view's bounds in the screen
501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// in both LTR and RTL.
5028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_P(ShelfViewTextDirectionTest, IdealBoundsOfItemIcon) {
503424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID id = AddPlatformApp();
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* button = GetButtonByID(id);
505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect item_bounds = button->GetBoundsInScreen();
506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Point icon_offset = button->GetIconBounds().origin();
507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  item_bounds.Offset(icon_offset.OffsetFromOrigin());
5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  gfx::Rect ideal_bounds = shelf_view_->GetIdealBoundsOfItemIcon(id);
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Point screen_origin;
5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  views::View::ConvertPointToScreen(shelf_view_, &screen_origin);
511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ideal_bounds.Offset(screen_origin.x(), screen_origin.y());
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(item_bounds.x(), ideal_bounds.x());
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(item_bounds.y(), ideal_bounds.y());
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Checks that shelf view contents are considered in the correct drag group.
5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, EnforceDragType) {
518ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_PLATFORM_APP));
519ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_APP_SHORTCUT));
520ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP,
521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                       TYPE_BROWSER_SHORTCUT));
522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_WINDOWED_APP));
523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_APP_LIST));
524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_APP_PANEL));
525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_SHORTCUT, TYPE_APP_SHORTCUT));
527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_SHORTCUT,
528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      TYPE_BROWSER_SHORTCUT));
529ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_APP_SHORTCUT,
530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                       TYPE_WINDOWED_APP));
531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_APP_SHORTCUT, TYPE_APP_LIST));
532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_APP_SHORTCUT, TYPE_APP_PANEL));
533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT,
535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      TYPE_BROWSER_SHORTCUT));
536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT,
537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                       TYPE_WINDOWED_APP));
538ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT, TYPE_APP_LIST));
539ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT, TYPE_APP_PANEL));
540ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
541ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_WINDOWED_APP, TYPE_WINDOWED_APP));
542ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_WINDOWED_APP, TYPE_APP_LIST));
543ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_WINDOWED_APP, TYPE_APP_PANEL));
544ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
545ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_LIST, TYPE_APP_LIST));
546ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_APP_LIST, TYPE_APP_PANEL));
547ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
548ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_PANEL, TYPE_APP_PANEL));
549ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
550ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
551424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Adds platform app button until overflow and verifies that the last added
552424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// platform app button is hidden.
5538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, AddBrowserUntilOverflow) {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
558424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add platform app button until overflow.
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
560424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID last_added = AddPlatformApp();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Added button is visible after animation while in this loop.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GetButtonByID(last_added)->visible());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    last_added = AddPlatformApp();
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last added button should be invisible.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_added)->visible());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
574424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Adds one platform app button then adds app shortcut until overflow. Verifies
575424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// that the browser button gets hidden on overflow and last added app shortcut
576424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// is still visible.
5778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, AddAppShortcutWithBrowserButtonUntilOverflow) {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID browser_button_id = AddPlatformApp();
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add app shortcut until overflow.
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddAppShortcut();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Added button is visible after animation while in this loop.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GetButtonByID(last_added)->visible());
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddAppShortcut();
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // And the platform app button is invisible.
59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(browser_button_id)->visible());
59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewLegacyShelfLayoutTest,
60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       AddAppShortcutWithBrowserButtonUntilOverflow) {
60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // All buttons should be visible.
60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            test_api_->GetButtonCount());
60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LauncherID browser_button_id = AddPlatformApp();
60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Add app shortcut until overflow.
60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int items_added = 0;
61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LauncherID last_added = AddAppShortcut();
61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Added button is visible after animation while in this loop.
61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(GetButtonByID(last_added)->visible());
61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    last_added = AddAppShortcut();
61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ++items_added;
61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last added app short button should be visible.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_added)->visible());
622424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // And the platform app button is invisible.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(browser_button_id)->visible());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, AddPanelHidesPlatformAppButton) {
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
630424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add platform app button until overflow, remember last visible platform app
631424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // button.
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
633424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID first_added = AddPlatformApp();
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_added)->visible());
63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  while (true) {
63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LauncherID added = AddPlatformApp();
63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (test_api_->IsOverflowButtonVisible()) {
63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_FALSE(GetButtonByID(added)->visible());
63958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      RemoveByID(added);
64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ++items_added;
64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
64458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LauncherID panel = AddPanel();
64758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(test_api_->IsOverflowButtonVisible());
64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RemoveByID(panel);
65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(test_api_->IsOverflowButtonVisible());
65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
65258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewLegacyShelfLayoutTest, AddPanelHidesPlatformAppButton) {
65458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            test_api_->GetButtonCount());
65658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
65758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Add platform app button until overflow, remember last visible platform app
65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // button.
65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int items_added = 0;
66058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LauncherID first_added = AddPlatformApp();
66158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_added)->visible());
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID last_visible = first_added;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (true) {
664424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    LauncherID added = AddPlatformApp();
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (test_api_->IsOverflowButtonVisible()) {
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_FALSE(GetButtonByID(added)->visible());
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_visible = added;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID panel = AddPanel();
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(panel)->visible());
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_visible)->visible());
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveByID(panel);
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_visible)->visible());
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// When there are more panels then platform app buttons we should hide panels
683424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// rather than platform apps.
6848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, PlatformAppHidesExcessPanels) {
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
688424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add platform app button.
689424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID platform_app = AddPlatformApp();
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID first_panel = AddPanel();
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(platform_app)->visible());
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_panel)->visible());
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add panels until there is an overflow.
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID last_panel = first_panel;
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_panel = AddPanel();
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
704424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // The first panel should now be hidden by the new platform apps needing
705424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // space.
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(first_panel)->visible());
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_panel)->visible());
708424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(platform_app)->visible());
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
710424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Adding platform apps should eventually begin to hide platform apps. We will
711424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // add platform apps until either the last panel or platform app is hidden.
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  items_added = 0;
713424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  while (GetButtonByID(platform_app)->visible() &&
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         GetButtonByID(last_panel)->visible()) {
715424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    platform_app = AddPlatformApp();
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_panel)->visible());
720424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(platform_app)->visible());
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds button until overflow then removes first added one. Verifies that
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last added one changes from invisible to visible and overflow
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chevron is gone.
7268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, RemoveButtonRevealsOverflowed) {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
731424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add platform app buttons until overflow.
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
733424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID first_added = AddPlatformApp();
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = first_added;
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
736424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    last_added = AddPlatformApp();
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect add more than 1 button. First added is visible and last is not.
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(first_added, last_added);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_added)->visible());
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_added)->visible());
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove first added.
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveByID(first_added);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last added button becomes visible and overflow chevron is gone.
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_added)->visible());
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0f, GetButtonByID(last_added)->layer()->opacity());
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_api_->IsOverflowButtonVisible());
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that remove last overflowed button should hide overflow chevron.
7568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, RemoveLastOverflowed) {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
761424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add platform app button until overflow.
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
763424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID last_added = AddPlatformApp();
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
765424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    last_added = AddPlatformApp();
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveByID(last_added);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_api_->IsOverflowButtonVisible());
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
774424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Adds platform app button without waiting for animation to finish and verifies
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that all added buttons are visible.
7768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, AddButtonQuickly) {
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
781424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add a few platform buttons quickly without wait for animation.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int added_count = 0;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
784424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AddPlatformAppNoWait();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++added_count;
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(added_count, 10000);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // ShelfView should be big enough to hold at least 3 new buttons.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GE(added_count, 3);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the last animation to finish.
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verifies non-overflow buttons are visible.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i <= test_api_->GetLastVisibleIndex(); ++i) {
797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    internal::ShelfButton* button = test_api_->GetButton(i);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (button) {
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(button->visible()) << "button index=" << i;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1.0f, button->layer()->opacity()) << "button index=" << i;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that model changes are handled correctly while a launcher icon is being
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dragged.
8078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, ModelChangesWhileDragging) {
808f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButtonHost* button_host = shelf_view_;
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::pair<LauncherID, views::View*> > id_map;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupForDragTest(&id_map);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Dragging browser shortcut at index 1.
81458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(model_->items()[1].type == TYPE_BROWSER_SHORTCUT);
81558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  views::View* dragged_button = SimulateDrag(
816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      internal::ShelfButtonHost::MOUSE, 1, 3);
81758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::rotate(id_map.begin() + 1,
81858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 2,
81958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 4);
82058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
82158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
82358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       false);
82458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(model_->items()[3].type == TYPE_BROWSER_SHORTCUT);
82558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
82658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Dragging changes model order.
827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button = SimulateDrag(internal::ShelfButtonHost::MOUSE, 1, 3);
82858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::rotate(id_map.begin() + 1,
82958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 2,
83058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 4);
83158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
83258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
83358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Cancelling the drag operation restores previous order.
83458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
83658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       true);
83758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::rotate(id_map.begin() + 1,
83858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 3,
83958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 4);
84058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
84158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
84258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Deleting an item keeps the remaining intact.
843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button = SimulateDrag(internal::ShelfButtonHost::MOUSE, 1, 3);
84458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  model_->RemoveItemAt(1);
84558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  id_map.erase(id_map.begin() + 1);
84658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
84758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
84958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       false);
85058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
85158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Adding a launcher item cancels the drag and respects the order.
852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button = SimulateDrag(internal::ShelfButtonHost::MOUSE, 1, 3);
85358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LauncherID new_id = AddAppShortcut();
85458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  id_map.insert(id_map.begin() + 6,
85558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                std::make_pair(new_id, GetButtonByID(new_id)));
85658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
85758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
85958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       false);
86058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
86158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Adding a launcher item at the end (i.e. a panel)  canels drag and respects
86258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the order.
863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button = SimulateDrag(internal::ShelfButtonHost::MOUSE, 1, 3);
86458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  new_id = AddPanel();
86558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  id_map.insert(id_map.begin() + 7,
86658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                std::make_pair(new_id, GetButtonByID(new_id)));
86758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
86858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
87058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       false);
87158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
87258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewLegacyShelfLayoutTest, ModelChangesWhileDragging) {
874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButtonHost* button_host = shelf_view_;
87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<std::pair<LauncherID, views::View*> > id_map;
87758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetupForDragTest(&id_map);
87858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Dragging browser shortcut at index 0.
88090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(model_->items()[0].type == TYPE_BROWSER_SHORTCUT);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button = SimulateDrag(
882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      internal::ShelfButtonHost::MOUSE, 0, 2);
88390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
88490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 1,
88590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
88690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
88990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       false);
89090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(model_->items()[2].type == TYPE_BROWSER_SHORTCUT);
89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Dragging changes model order.
893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button = SimulateDrag(internal::ShelfButtonHost::MOUSE, 0, 2);
89490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 1,
89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancelling the drag operation restores previous order.
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       true);
90390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
90490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 2,
90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting an item keeps the remaining intact.
909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button = SimulateDrag(internal::ShelfButtonHost::MOUSE, 0, 2);
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  model_->RemoveItemAt(1);
91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.erase(id_map.begin() + 1);
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
914f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding a launcher item cancels the drag and respects the order.
918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button = SimulateDrag(internal::ShelfButtonHost::MOUSE, 0, 2);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID new_id = AddAppShortcut();
92090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.insert(id_map.begin() + 5,
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                std::make_pair(new_id, GetButtonByID(new_id)));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adding a launcher item at the end (i.e. a panel)  canels drag and respects
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the order.
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button = SimulateDrag(internal::ShelfButtonHost::MOUSE, 0, 2);
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_id = AddPanel();
93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.insert(id_map.begin() + 7,
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::make_pair(new_id, GetButtonByID(new_id)));
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       false);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that 2nd drag from the other pointer would be ignored.
9408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, SimultaneousDrag) {
941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButtonHost* button_host = shelf_view_;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::pair<LauncherID, views::View*> > id_map;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupForDragTest(&id_map);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a mouse drag.
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button_mouse = SimulateDrag(
948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      internal::ShelfButtonHost::MOUSE, 1, 3);
94958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::rotate(id_map.begin() + 1,
95058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 2,
95158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 4);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt a touch drag before the mouse drag finishes.
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button_touch = SimulateDrag(
955f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      internal::ShelfButtonHost::TOUCH, 4, 2);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing changes since 2nd drag is ignored.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish the mouse drag.
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button_mouse,
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now start a touch drag.
967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button_touch = SimulateDrag(internal::ShelfButtonHost::TOUCH, 4, 2);
96858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::rotate(id_map.begin() + 3,
96958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 4,
97058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 5);
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And attempt a mouse drag before the touch drag finishes.
974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dragged_button_mouse = SimulateDrag(internal::ShelfButtonHost::MOUSE, 1, 2);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing changes since 2nd drag is ignored.
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button_touch,
980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::TOUCH,
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Check that clicking first on one item and then dragging another works as
986ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// expected.
9878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, ClickOneDragAnother) {
988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButtonHost* button_host = shelf_view_;
989ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
990ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::pair<LauncherID, views::View*> > id_map;
991ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetupForDragTest(&id_map);
992ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
993ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // A click on item 1 is simulated.
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateClick(internal::ShelfButtonHost::MOUSE, 1);
995ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
996ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Dragging browser index at 0 should change the model order correctly.
99758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(model_->items()[1].type == TYPE_BROWSER_SHORTCUT);
998ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  views::View* dragged_button = SimulateDrag(
999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      internal::ShelfButtonHost::MOUSE, 1, 3);
100058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::rotate(id_map.begin() + 1,
100158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 2,
100258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              id_map.begin() + 4);
1003ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
1004ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  button_host->PointerReleasedOnButton(dragged_button,
1005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       internal::ShelfButtonHost::MOUSE,
1006ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                       false);
100758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(model_->items()[3].type == TYPE_BROWSER_SHORTCUT);
1008ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1009ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that item status changes are reflected in the buttons.
10118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, LauncherItemStatus) {
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add platform app button.
1016424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID last_added = AddPlatformApp();
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem item = GetItemByID(last_added);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = model_->ItemIndexByID(last_added);
1019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* button = GetButtonByID(last_added);
1020f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(internal::ShelfButton::STATE_RUNNING, button->state());
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ACTIVE;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
1023f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(internal::ShelfButton::STATE_ACTIVE, button->state());
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ATTENTION;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
1026f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(internal::ShelfButton::STATE_ATTENTION, button->state());
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewLegacyShelfLayoutTest,
103058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       LauncherItemPositionReflectedOnStateChanged) {
10317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
10327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            test_api_->GetButtonCount());
10337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Add 2 items to the launcher.
1035424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID item1_id = AddPlatformApp();
10367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  LauncherID item2_id = AddPlatformAppNoWait();
1037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* item1_button = GetButtonByID(item1_id);
1038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* item2_button = GetButtonByID(item2_id);
1039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton::State state_mask =
1041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<internal::ShelfButton::State>(
1042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          internal::ShelfButton::STATE_NORMAL |
1043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          internal::ShelfButton::STATE_HOVERED |
1044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          internal::ShelfButton::STATE_RUNNING |
1045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          internal::ShelfButton::STATE_ACTIVE |
1046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          internal::ShelfButton::STATE_ATTENTION |
1047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          internal::ShelfButton::STATE_FOCUSED);
10487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Clear the button states.
10507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  item1_button->ClearState(state_mask);
10517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  item2_button->ClearState(state_mask);
10527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Since default alignment in tests is bottom, state is reflected in y-axis.
10547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(item1_button->GetIconBounds().y(),
10557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            item2_button->GetIconBounds().y());
1056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  item1_button->AddState(internal::ShelfButton::STATE_HOVERED);
10577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_NE(item1_button->GetIconBounds().y(),
10587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            item2_button->GetIconBounds().y());
1059f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  item1_button->ClearState(internal::ShelfButton::STATE_HOVERED);
10607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
10617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that item status changes are reflected in the buttons
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for platform apps.
10648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, LauncherItemStatusPlatformApp) {
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1068424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Add platform app button.
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddPlatformApp();
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem item = GetItemByID(last_added);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = model_->ItemIndexByID(last_added);
1072f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* button = GetButtonByID(last_added);
1073f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(internal::ShelfButton::STATE_RUNNING, button->state());
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ACTIVE;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
1076f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(internal::ShelfButton::STATE_ACTIVE, button->state());
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ATTENTION;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
1079f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(internal::ShelfButton::STATE_ATTENTION, button->state());
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Confirm that launcher item bounds are correctly updated on shelf changes.
10838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, LauncherItemBoundsCheck) {
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
10851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  shelf_view_->shelf_layout_manager()->SetAutoHideBehavior(
10861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
10891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  shelf_view_->shelf_layout_manager()->SetAutoHideBehavior(
10901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, ShelfTooltipTest) {
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prepare some items to the launcher.
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID app_button_id = AddAppShortcut();
1101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID platform_button_id = AddPlatformApp();
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* app_button = GetButtonByID(app_button_id);
1104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* platform_button = GetButtonByID(platform_button_id);
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButtonHost* button_host = shelf_view_;
11074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  internal::ShelfTooltipManager* tooltip_manager =
11088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      shelf_view_->tooltip_manager();
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(app_button);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a delay to show the tooltip, so it's not visible yet.
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_button, GetTooltipAnchorView());
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowTooltip();
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once it's visible, it keeps visibility and is pointing to the same
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item.
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseExitedButton(app_button);
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_button, GetTooltipAnchorView());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When entered to another item, it switches to the new item.  There is no
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delay for the visibility.
1126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  button_host->MouseEnteredButton(platform_button);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
1128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(platform_button, GetTooltipAnchorView());
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  button_host->MouseExitedButton(platform_button);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_manager->Close();
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Next time: enter app_button -> move immediately to tab_button.
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(app_button);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseExitedButton(app_button);
1136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  button_host->MouseEnteredButton(platform_button);
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
1138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(platform_button, GetTooltipAnchorView());
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Verify a fix for crash caused by a tooltip update for a deleted launcher
1142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// button, see crbug.com/288838.
11438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, RemovingItemClosesTooltip) {
1144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButtonHost* button_host = shelf_view_;
11454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  internal::ShelfTooltipManager* tooltip_manager =
11468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      shelf_view_->tooltip_manager();
1147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Add an item to the launcher.
1149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LauncherID app_button_id = AddAppShortcut();
1150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* app_button = GetButtonByID(app_button_id);
1151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Spawn a tooltip on that item.
1153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  button_host->MouseEnteredButton(app_button);
1154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ShowTooltip();
1155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
1156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Remove the app shortcut while the tooltip is open. The tooltip should be
1158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // closed.
1159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RemoveByID(app_button_id);
1160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
1161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Change the shelf layout. This should not crash.
1163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ash::Shell::GetInstance()->SetShelfAlignment(
1164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ash::SHELF_ALIGNMENT_LEFT,
1165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ash::Shell::GetPrimaryRootWindow());
1166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Changing the shelf alignment closes any open tooltip.
11698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, ShelfAlignmentClosesTooltip) {
1170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButtonHost* button_host = shelf_view_;
11714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  internal::ShelfTooltipManager* tooltip_manager =
11728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      shelf_view_->tooltip_manager();
1173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Add an item to the launcher.
1175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LauncherID app_button_id = AddAppShortcut();
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfButton* app_button = GetButtonByID(app_button_id);
1177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Spawn a tooltip on the item.
1179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  button_host->MouseEnteredButton(app_button);
1180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ShowTooltip();
1181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
1182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Changing shelf alignment hides the tooltip.
1184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ash::Shell::GetInstance()->SetShelfAlignment(
1185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ash::SHELF_ALIGNMENT_LEFT,
1186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ash::Shell::GetPrimaryRootWindow());
1187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
1188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
11908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, ShouldHideTooltipTest) {
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID app_button_id = AddAppShortcut();
1192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  LauncherID platform_button_id = AddPlatformApp();
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is on normal buttons.
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test_api_->GetButtonCount(); i++) {
1196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    internal::ShelfButton* button = test_api_->GetButton(i);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_FALSE(shelf_view_->ShouldHideTooltip(
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button->GetMirroredBounds().CenterPoint()))
12028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        << "ShelfView tries to hide on button " << i;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should not hide on the app-list button.
12068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  views::View* app_list_button = shelf_view_->GetAppListButtonView();
12078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(shelf_view_->ShouldHideTooltip(
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_list_button->GetMirroredBounds().CenterPoint()));
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is in the gap between two buttons.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect app_button_rect = GetButtonByID(app_button_id)->GetMirroredBounds();
1212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect platform_button_rect =
1213424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      GetButtonByID(platform_button_id)->GetMirroredBounds();
1214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_FALSE(app_button_rect.Intersects(platform_button_rect));
12158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(shelf_view_->ShouldHideTooltip(
1216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      gfx::UnionRects(app_button_rect, platform_button_rect).CenterPoint()));
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should hide if it's outside of all buttons.
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect all_area;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test_api_->GetButtonCount(); i++) {
1221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    internal::ShelfButton* button = test_api_->GetButton(i);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_area.Union(button->GetMirroredBounds());
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  all_area.Union(shelf_view_->GetAppListButtonView()->GetMirroredBounds());
12288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(shelf_view_->ShouldHideTooltip(all_area.origin()));
12298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(shelf_view_->ShouldHideTooltip(
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.right() - 1, all_area.bottom() - 1)));
12318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(shelf_view_->ShouldHideTooltip(
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.right(), all_area.y())));
12338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(shelf_view_->ShouldHideTooltip(
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x() - 1, all_area.y())));
12358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(shelf_view_->ShouldHideTooltip(
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x(), all_area.y() - 1)));
12378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(shelf_view_->ShouldHideTooltip(
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x(), all_area.bottom())));
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, ShouldHideTooltipWithAppListWindowTest) {
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->ToggleAppList(NULL);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(Shell::GetInstance()->GetAppListWindow());
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is on normal buttons.
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < test_api_->GetButtonCount(); i++) {
1247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    internal::ShelfButton* button = test_api_->GetButton(i);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_FALSE(shelf_view_->ShouldHideTooltip(
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button->GetMirroredBounds().CenterPoint()))
12538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        << "ShelfView tries to hide on button " << i;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should hide on the app-list button.
12578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  views::View* app_list_button = shelf_view_->GetAppListButtonView();
12588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(shelf_view_->ShouldHideTooltip(
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_list_button->GetMirroredBounds().CenterPoint()));
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test that by moving the mouse cursor off the button onto the bubble it closes
12637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// the bubble.
12648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, ShouldHideTooltipWhenHoveringOnTooltip) {
12654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  internal::ShelfTooltipManager* tooltip_manager =
12668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      shelf_view_->tooltip_manager();
12677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  tooltip_manager->CreateZeroDelayTimerForTest();
12687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
12697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Move the mouse off any item and check that no tooltip is shown.
12717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.MoveMouseTo(gfx::Point(0, 0));
12727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
12737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Move the mouse over the button and check that it is visible.
12758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  views::View* app_list_button = shelf_view_->GetAppListButtonView();
12767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Rect bounds = app_list_button->GetBoundsInScreen();
12777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.MoveMouseTo(bounds.CenterPoint());
12787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Wait for the timer to go off.
12797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunAllPendingInMessageLoop();
12807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
12817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Move the mouse cursor slightly to the right of the item. The tooltip should
12837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // stay open.
128458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  generator.MoveMouseBy(bounds.width() / 2 + 5, 0);
12857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Make sure there is no delayed close.
12867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunAllPendingInMessageLoop();
12877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
12887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Move back - it should still stay open.
129058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  generator.MoveMouseBy(-(bounds.width() / 2 + 5), 0);
12917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Make sure there is no delayed close.
12927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunAllPendingInMessageLoop();
12937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
12947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Now move the mouse cursor slightly above the item - so that it is over the
12967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // tooltip bubble. Now it should disappear.
12977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.MoveMouseBy(0, -(bounds.height() / 2 + 5));
12987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Wait until the delayed close kicked in.
12997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunAllPendingInMessageLoop();
13007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
13017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
13027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
13038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Resizing shelf view while an add animation without fade-in is running,
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which happens when overflow happens. App list button should end up in its
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new ideal bounds.
13068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewTest, ResizeDuringOverflowAddAnimation) {
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add buttons until overflow. Let the non-overflow add animations finish but
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leave the last running.
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
1314424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  AddPlatformAppNoWait();
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
1317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AddPlatformAppNoWait();
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Resize shelf view with that animation running and stay overflown.
13238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  gfx::Rect bounds = shelf_view_->bounds();
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds.set_width(bounds.width() - kLauncherPreferredSize);
13258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  shelf_view_->SetBoundsRect(bounds);
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_api_->IsOverflowButtonVisible());
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish the animation.
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App list button should ends up in its new ideal bounds.
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int app_list_button_index = test_api_->GetButtonCount() - 1;
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect& app_list_ideal_bounds =
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_api_->GetIdealBoundsByIndex(app_list_button_index);
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect& app_list_bounds =
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_api_->GetBoundsByIndex(app_list_button_index);
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_list_bounds, app_list_ideal_bounds);
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks the overflow bubble size when an item is ripped off and re-inserted.
1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ShelfViewTest, OverflowBubbleSize) {
1342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Replace LauncherDelegate.
1343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test::ShellTestApi test_api(Shell::GetInstance());
1344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_api.SetLauncherDelegate(NULL);
1345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LauncherDelegate *delegate = new TestLauncherDelegateForShelfView(model_);
1346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_api.SetLauncherDelegate(delegate);
1347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test::LauncherTestAPI(
1348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Launcher::ForPrimaryDisplay()).SetLauncherDelegate(delegate);
1349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_api_->SetLauncherDelegate(delegate);
1350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add buttons until overflow.
1352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int items_added = 0;
1353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
1354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AddAppShortcut();
1355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ++items_added;
1356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
1357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Show overflow bubble.
1360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_api_->ShowOverflowBubble();
1361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(test_api_->overflow_bubble() &&
1362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              test_api_->overflow_bubble()->IsShowing());
1363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::test::ShelfViewTestAPI test_for_overflow_view(
1365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_->overflow_bubble()->shelf_view());
1366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int ripped_index = test_for_overflow_view.GetLastVisibleIndex();
1368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Size bubble_size = test_for_overflow_view.GetPreferredSize();
1369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int item_width = test_for_overflow_view.GetButtonSize() +
1370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_for_overflow_view.GetButtonSpacing();
1371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow(),
1373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       gfx::Point());
1374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::internal::ShelfButton* button =
1375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_for_overflow_view.GetButton(ripped_index);
1376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Rip off the last visible item.
1377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point start_point = button->GetBoundsInScreen().CenterPoint();
1378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point rip_off_point(start_point.x(), 0);
1379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  generator.MoveMouseTo(start_point.x(), start_point.y());
1380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  generator.PressLeftButton();
1382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  generator.MoveMouseTo(rip_off_point.x(), rip_off_point.y());
1384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_for_overflow_view.RunMessageLoopUntilAnimationsDone();
1386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check the overflow bubble size when an item is ripped off.
1388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(bubble_size.width() - item_width,
1389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            test_for_overflow_view.GetPreferredSize().width());
1390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(test_api_->overflow_bubble() &&
1391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              test_api_->overflow_bubble()->IsShowing());
1392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Re-insert an item into the overflow bubble.
1394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int first_index = test_for_overflow_view.GetFirstVisibleIndex();
1395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  button = test_for_overflow_view.GetButton(first_index);
1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check the bubble size after an item is re-inserted.
1398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  generator.MoveMouseTo(button->GetBoundsInScreen().CenterPoint());
1399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_for_overflow_view.RunMessageLoopUntilAnimationsDone();
1400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(bubble_size.width(),
1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            test_for_overflow_view.GetPreferredSize().width());
1402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  generator.ReleaseLeftButton();
1404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_for_overflow_view.RunMessageLoopUntilAnimationsDone();
1405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(bubble_size.width(),
1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            test_for_overflow_view.GetPreferredSize().width());
1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that the first item in the list follows Fitt's law by including the
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first pixel and being therefore bigger then the others.
14118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ShelfViewLegacyShelfLayoutTest, CheckFittsLaw) {
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All buttons should be visible.
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect ideal_bounds_0 = test_api_->GetIdealBoundsByIndex(0);
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect ideal_bounds_1 = test_api_->GetIdealBoundsByIndex(1);
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(ideal_bounds_0.width(), ideal_bounds_1.width());
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Check the drag insertion bounds of scrolled overflow bubble.
1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ShelfViewTest, CheckDragInsertBoundsOfScrolledOverflowBubble) {
1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UpdateDisplay("400x300");
1423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, model_->item_count());
1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add buttons until overflow.
1427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int items_added = 0;
1428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
1429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AddAppShortcut();
1430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ++items_added;
1431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
1432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Show overflow bubble.
1435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_api_->ShowOverflowBubble();
1436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(test_api_->overflow_bubble() &&
1437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              test_api_->overflow_bubble()->IsShowing());
1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int item_width = test_api_->GetButtonSize() +
1440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_->GetButtonSpacing();
1441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::OverflowBubbleView* bubble_view =
1442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_->overflow_bubble()->bubble_view();
1443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test::OverflowBubbleViewTestAPI bubble_view_api(bubble_view);
1444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add more buttons until OverflowBubble is scrollable and it has 3 invisible
1446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // items.
1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  while (bubble_view_api.GetContentsSize().width() <
1448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         (bubble_view->GetContentsBounds().width() + 3 * item_width))
1449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AddAppShortcut();
1450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(test_api_->overflow_bubble() &&
1452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              test_api_->overflow_bubble()->IsShowing());
1453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::test::ShelfViewTestAPI test_for_overflow_view(
1455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_->overflow_bubble()->shelf_view());
1456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int first_index = test_for_overflow_view.GetFirstVisibleIndex();
1457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int last_index = test_for_overflow_view.GetLastVisibleIndex();
1458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::internal::ShelfButton* first_button =
1460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_for_overflow_view.GetButton(first_index);
1461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::internal::ShelfButton* last_button =
1462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_for_overflow_view.GetButton(last_index);
1463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point first_point = first_button->GetBoundsInScreen().CenterPoint();
1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point last_point = last_button->GetBoundsInScreen().CenterPoint();
1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect drag_reinsert_bounds =
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_for_overflow_view.GetBoundsForDragInsertInScreen();
1467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(drag_reinsert_bounds.Contains(first_point));
1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(drag_reinsert_bounds.Contains(last_point));
1469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Scrolls sufficiently to show last item.
1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bubble_view_api.ScrollByXOffset(3 * item_width);
1472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  drag_reinsert_bounds =
1473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_for_overflow_view.GetBoundsForDragInsertInScreen();
1474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  first_point = first_button->GetBoundsInScreen().CenterPoint();
1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  last_point = last_button->GetBoundsInScreen().CenterPoint();
1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(drag_reinsert_bounds.Contains(first_point));
1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(drag_reinsert_bounds.Contains(last_point));
1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Check the drag insertion bounds of shelf view in multi monitor environment.
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ShelfViewTest, CheckDragInsertBoundsWithMultiMonitor) {
1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // win8-aura doesn't support multiple display.
1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!SupportsMultipleDisplays())
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UpdateDisplay("800x600,800x600");
1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Launcher* secondary_launcher =
1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Launcher::ForWindow(ash::Shell::GetAllRootWindows()[1]);
1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::ShelfView* shelf_view_for_secondary =
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test::LauncherTestAPI(secondary_launcher).shelf_view();
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The bounds should be big enough for 4 buttons + overflow chevron.
1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shelf_view_for_secondary->SetBounds(0, 0, 500,
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      internal::ShelfLayoutManager::GetPreferredShelfSize());
1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ShelfViewTestAPI test_api_for_secondary(shelf_view_for_secondary);
1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Speeds up animation for test.
1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_api_for_secondary.SetAnimationDuration(1);
1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add buttons until overflow.
1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int items_added = 0;
1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AddAppShortcut();
1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ++items_added;
1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
1506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Test #1: Test drag insertion bounds of primary shelf.
1509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Show overflow bubble.
1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_api_->ShowOverflowBubble();
1511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(test_api_->overflow_bubble() &&
1512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              test_api_->overflow_bubble()->IsShowing());
1513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::test::ShelfViewTestAPI test_api_for_overflow_view(
1515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_->overflow_bubble()->shelf_view());
1516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::internal::ShelfButton* button = test_api_for_overflow_view.GetButton(
1518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_for_overflow_view.GetLastVisibleIndex());
1519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Checks that a point in shelf is contained in drag insert bounds.
1521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point point_in_shelf_view = button->GetBoundsInScreen().CenterPoint();
1522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect drag_reinsert_bounds =
1523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_for_overflow_view.GetBoundsForDragInsertInScreen();
1524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(drag_reinsert_bounds.Contains(point_in_shelf_view));
1525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Checks that a point out of shelf is not contained in drag insert bounds.
1526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(drag_reinsert_bounds.Contains(
1527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Point(point_in_shelf_view.x(), 0)));
1528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Test #2: Test drag insertion bounds of secondary shelf.
1530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Show overflow bubble.
1531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  test_api_for_secondary.ShowOverflowBubble();
1532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(test_api_for_secondary.overflow_bubble() &&
1533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              test_api_for_secondary.overflow_bubble()->IsShowing());
1534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::test::ShelfViewTestAPI test_api_for_overflow_view_of_secondary(
1536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_for_secondary.overflow_bubble()->shelf_view());
1537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ash::internal::ShelfButton* button_in_secondary =
1539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_for_overflow_view_of_secondary.GetButton(
1540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          test_api_for_overflow_view_of_secondary.GetLastVisibleIndex());
1541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Checks that a point in shelf is contained in drag insert bounds.
1543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Point point_in_secondary_shelf_view =
1544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      button_in_secondary->GetBoundsInScreen().CenterPoint();
1545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect drag_reinsert_bounds_in_secondary =
1546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test_api_for_overflow_view_of_secondary.GetBoundsForDragInsertInScreen();
1547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(drag_reinsert_bounds_in_secondary.Contains(
1548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      point_in_secondary_shelf_view));
1549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Checks that a point out of shelf is not contained in drag insert bounds.
1550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(drag_reinsert_bounds_in_secondary.Contains(
1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Point(point_in_secondary_shelf_view.x(), 0)));
1552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Checks that a point of overflow bubble in primary shelf should not be
1553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // contained by insert bounds of secondary shelf.
1554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(drag_reinsert_bounds_in_secondary.Contains(point_in_shelf_view));
1555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ShelfViewVisibleBoundsTest : public ShelfViewTest,
1558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   public testing::WithParamInterface<bool> {
15594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
15608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ShelfViewVisibleBoundsTest() : text_direction_change_(GetParam()) {}
15614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CheckAllItemsAreInBounds() {
15638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Rect visible_bounds = shelf_view_->GetVisibleItemsBoundsInScreen();
15648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Rect launcher_bounds = shelf_view_->GetBoundsInScreen();
15654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(launcher_bounds.Contains(visible_bounds));
15664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (int i = 0; i < test_api_->GetButtonCount(); ++i)
1567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (internal::ShelfButton* button = test_api_->GetButton(i))
15684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_TRUE(visible_bounds.Contains(button->GetBoundsInScreen()));
15694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CheckAppListButtonIsInBounds();
15704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
15714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CheckAppListButtonIsInBounds() {
15738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Rect visible_bounds = shelf_view_->GetVisibleItemsBoundsInScreen();
15748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    gfx::Rect app_list_button_bounds = shelf_view_->GetAppListButtonView()->
15754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       GetBoundsInScreen();
15764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(visible_bounds.Contains(app_list_button_bounds));
15774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
15784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
15804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedTextDirectionChange text_direction_change_;
15814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfViewVisibleBoundsTest);
15834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
15844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_P(ShelfViewVisibleBoundsTest, ItemsAreInBounds) {
15864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Adding elements leaving some empty space.
15874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (int i = 0; i < 3; i++) {
15884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    AddAppShortcut();
15894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
15904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
15914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(test_api_->IsOverflowButtonVisible());
15924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CheckAllItemsAreInBounds();
15934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Same for overflow case.
15944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
15954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    AddAppShortcut();
15964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
15974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
15984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CheckAllItemsAreInBounds();
15994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
16004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
16018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(LtrRtl, ShelfViewTextDirectionTest, testing::Bool());
16028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(VisibleBounds, ShelfViewVisibleBoundsTest,
16034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    testing::Bool());
1604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1607