launcher_view_unittest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_button.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_icon_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_model.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_tooltip_manager.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/launcher_view_test_api.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/shell_test_api.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/test_launcher_delegate.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event_constants.h"
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/view_model.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LauncherIconObserver tests.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestLauncherIconObserver : public LauncherIconObserver {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestLauncherIconObserver(Launcher* launcher)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : launcher_(launcher),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        change_notified_(false) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (launcher_)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      launcher_->AddIconObserver(this);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestLauncherIconObserver() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (launcher_)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      launcher_->RemoveIconObserver(this);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LauncherIconObserver implementation.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLauncherIconPositionsChanged() OVERRIDE {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    change_notified_ = true;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int change_notified() const { return change_notified_; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset() { change_notified_ = false; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Launcher* launcher_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool change_notified_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestLauncherIconObserver);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LauncherViewIconObserverTest : public ash::test::AshTestBase {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherViewIconObserverTest() {}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LauncherViewIconObserverTest() {}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Launcher* launcher = Launcher::ForPrimaryDisplay();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.reset(new TestLauncherIconObserver(launcher));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launcher_view_test_.reset(new LauncherViewTestAPI(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        launcher->GetLauncherViewForTest()));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launcher_view_test_->SetAnimationDuration(1);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.reset();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLauncherIconObserver* observer() { return observer_.get(); }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherViewTestAPI* launcher_view_test() {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return launcher_view_test_.get();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Launcher* LauncherForSecondaryDisplay() {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Launcher::ForWindow(Shell::GetAllRootWindows()[1]);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestLauncherIconObserver> observer_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LauncherViewTestAPI> launcher_view_test_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LauncherViewIconObserverTest);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewIconObserverTest, AddRemove) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::test::TestLauncherDelegate* launcher_delegate =
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::test::TestLauncherDelegate::instance();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launcher_delegate);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<views::Widget> widget(new views::Widget());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launcher_delegate->AddLauncherItem(widget->GetNativeWindow());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_view_test()->RunMessageLoopUntilAnimationsDone();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow());
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_view_test()->RunMessageLoopUntilAnimationsDone();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer()->Reset();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sometimes fails on trybots on win7_aura. http://crbug.com/177135
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AddRemoveWithMultipleDisplays \
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISABLED_AddRemoveWithMultipleDisplays
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AddRemoveWithMultipleDisplays \
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddRemoveWithMultipleDisplays
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure creating/deleting an window on one displays notifies a
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// launcher on external display as well as one on primary.
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewIconObserverTest, MAYBE_AddRemoveWithMultipleDisplays) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x400,400x400");
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestLauncherIconObserver second_observer(LauncherForSecondaryDisplay());
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::test::TestLauncherDelegate* launcher_delegate =
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::test::TestLauncherDelegate::instance();
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(launcher_delegate);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<views::Widget> widget(new views::Widget());
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Init(params);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_delegate->AddLauncherItem(widget->GetNativeWindow());
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_view_test()->RunMessageLoopUntilAnimationsDone();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(second_observer.change_notified());
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer()->Reset();
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_observer.Reset();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_view_test()->RunMessageLoopUntilAnimationsDone();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(second_observer.change_notified());
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_observer.Reset();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewIconObserverTest, BoundsChanged) {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::ShelfWidget* shelf = Shell::GetPrimaryRootWindowController()->shelf();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Launcher* launcher = Launcher::ForPrimaryDisplay();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size shelf_size =
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shelf->GetWindowBoundsInScreen().size();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf_size.set_width(shelf_size.width() / 2);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_GT(shelf_size.width(), 0);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher->SetLauncherViewBounds(gfx::Rect(shelf_size));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No animation happens for LauncherView bounds change.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LauncherView tests.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LauncherViewTest : public AshTestBase {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherViewTest() : model_(NULL), launcher_view_(NULL) {}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LauncherViewTest() {}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test::ShellTestApi test_api(Shell::GetInstance());
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_ = test_api.launcher_model();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Launcher* launcher = Launcher::ForPrimaryDisplay();
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    launcher_view_ = launcher->GetLauncherViewForTest();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The bounds should be big enough for 4 buttons + overflow chevron.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launcher_view_->SetBounds(0, 0, 500, 50);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_api_.reset(new LauncherViewTestAPI(launcher_view_));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->SetAnimationDuration(1);  // Speeds up animation for test.
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Add browser shortcut launcher item at index 0 for test.
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddBrowserShortcut();
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_api_.reset();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LauncherID AddBrowserShortcut() {
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LauncherItem browser_shortcut;
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    browser_shortcut.type = TYPE_BROWSER_SHORTCUT;
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    browser_shortcut.is_incognito = false;
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LauncherID id = model_->next_id();
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    model_->AddAt(0, browser_shortcut);
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return id;
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddAppShortcut() {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItem item;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type = TYPE_APP_SHORTCUT;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.status = STATUS_CLOSED;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = model_->next_id();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->Add(item);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddTabbedBrowserNoWait() {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItem item;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type = TYPE_TABBED;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.status = STATUS_RUNNING;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = model_->next_id();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->Add(item);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddTabbedBrowser() {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = AddTabbedBrowserNoWait();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID AddPanel() {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherID id = AddPanelNoWait();
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return id;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddPlatformAppNoWait() {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItem item;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type = TYPE_PLATFORM_APP;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.status = STATUS_RUNNING;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = model_->next_id();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->Add(item);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID AddPanelNoWait() {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherItem item;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item.type = TYPE_APP_PANEL;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item.status = STATUS_RUNNING;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherID id = model_->next_id();
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_->Add(item);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return id;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddPlatformApp() {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = AddPlatformAppNoWait();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveByID(LauncherID id) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->RemoveItemAt(model_->ItemIndexByID(id));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* GetButtonByID(LauncherID id) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index = model_->ItemIndexByID(id);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_api_->GetButton(index);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem GetItemByID(LauncherID id) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItems::const_iterator items = model_->ItemByID(id);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *items;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckModelIDs(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<std::pair<LauncherID, views::View*> >& id_map) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t map_index = 0;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t model_index = 0;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         model_index < model_->items().size();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++model_index) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::LauncherItem item = model_->items()[model_index];
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::LauncherID id = item.id;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(id_map[map_index].first, id);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(id_map[map_index].second, GetButtonByID(id));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++map_index;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(map_index, id_map.size());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyLauncherItemBoundsAreValid() {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i=0;i <= test_api_->GetLastVisibleIndex(); ++i) {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (test_api_->GetButton(i)) {
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect launcher_view_bounds = launcher_view_->GetLocalBounds();
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect item_bounds = test_api_->GetBoundsByIndex(i);
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.x() >= 0);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.y() >= 0);
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.right() <= launcher_view_bounds.width());
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.bottom() <= launcher_view_bounds.height());
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* SimulateDrag(internal::LauncherButtonHost::Pointer pointer,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int button_index,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int destination_index) {
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    internal::LauncherButtonHost* button_host = launcher_view_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Mouse down.
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* button = test_api_->GetButton(button_index);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent click_event(ui::ET_MOUSE_PRESSED,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               button->bounds().origin(),
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               button->bounds().origin(), 0);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    button_host->PointerPressedOnButton(button, pointer, click_event);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drag.
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* destination = test_api_->GetButton(destination_index);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              destination->bounds().origin(),
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              destination->bounds().origin(), 0);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    button_host->PointerDraggedOnButton(button, pointer, drag_event);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return button;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupForDragTest(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<std::pair<LauncherID, views::View*> >* id_map) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize |id_map| with the automatically-created launcher buttons.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < model_->items().size(); ++i) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButton* button = test_api_->GetButton(i);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id_map->push_back(std::make_pair(model_->items()[i].id, button));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(CheckModelIDs(*id_map));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add 5 app launcher buttons for testing.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < 5; ++i) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LauncherID id = AddAppShortcut();
36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // browser shortcut is located at index 0. So we should start to add app
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // shortcut at index 1.
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      id_map->insert(id_map->begin() + (i + 1),
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     std::make_pair(id, GetButtonByID(id)));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(CheckModelIDs(*id_map));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* GetTooltipAnchorView() {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return launcher_view_->tooltip_manager()->anchor_;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowTooltip() {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launcher_view_->tooltip_manager()->ShowInternal();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherModel* model_;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::LauncherView* launcher_view_;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LauncherViewTestAPI> test_api_;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LauncherViewTest);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LauncherViewTextDirectionTest
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : public LauncherViewTest,
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      public testing::WithParamInterface<bool> {
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LauncherViewTextDirectionTest() : is_rtl_(GetParam()) {}
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~LauncherViewTextDirectionTest() {}
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LauncherViewTest::SetUp();
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    original_locale_ = l10n_util::GetApplicationLocale(std::string());
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (is_rtl_)
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::i18n::SetICUDefaultLocale("he");
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_EQ(is_rtl_, base::i18n::IsRTL());
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (is_rtl_)
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::i18n::SetICUDefaultLocale(original_locale_);
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LauncherViewTest::TearDown();
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_rtl_;
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string original_locale_;
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LauncherViewTextDirectionTest);
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that the ideal item icon bounds match the view's bounds in the screen
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// in both LTR and RTL.
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(LauncherViewTextDirectionTest, IdealBoundsOfItemIcon) {
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LauncherID id = AddTabbedBrowser();
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  internal::LauncherButton* button = GetButtonByID(id);
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect item_bounds = button->GetBoundsInScreen();
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Point icon_offset = button->GetIconBounds().origin();
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  item_bounds.Offset(icon_offset.OffsetFromOrigin());
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect ideal_bounds = launcher_view_->GetIdealBoundsOfItemIcon(id);
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Point screen_origin;
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  views::View::ConvertPointToScreen(launcher_view_, &screen_origin);
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ideal_bounds.Offset(screen_origin.x(), screen_origin.y());
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(item_bounds.x(), ideal_bounds.x());
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(item_bounds.y(), ideal_bounds.y());
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds browser button until overflow and verifies that the last added browser
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// button is hidden.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, AddBrowserUntilOverflow) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser until overflow.
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddTabbedBrowser();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Added button is visible after animation while in this loop.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GetButtonByID(last_added)->visible());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddTabbedBrowser();
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last added button should be invisible.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_added)->visible());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds one browser button then adds app shortcut until overflow. Verifies that
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the browser button gets hidden on overflow and last added app shortcut is
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// still visible.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, AddAppShortcutWithBrowserButtonUntilOverflow) {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID browser_button_id = AddTabbedBrowser();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add app shortcut until overflow.
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddAppShortcut();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Added button is visible after animation while in this loop.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GetButtonByID(last_added)->visible());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddAppShortcut();
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last added app short button should be visible.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_added)->visible());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the browser button is invisible.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(browser_button_id)->visible());
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewTest, AddPanelHidesTabbedBrowser) {
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add tabbed browser until overflow, remember last visible tabbed browser.
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID first_added = AddTabbedBrowser();
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_added)->visible());
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID last_visible = first_added;
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (true) {
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherID added = AddTabbedBrowser();
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (test_api_->IsOverflowButtonVisible()) {
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_FALSE(GetButtonByID(added)->visible());
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_visible = added;
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID panel = AddPanel();
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(panel)->visible());
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_visible)->visible());
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveByID(panel);
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_visible)->visible());
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When there are more panels then browsers we should hide panels rather
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// than browsers.
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewTest, BrowserHidesExcessPanels) {
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add tabbed browser.
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID browser = AddTabbedBrowser();
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID first_panel = AddPanel();
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(browser)->visible());
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_panel)->visible());
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add panels until there is an overflow.
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID last_panel = first_panel;
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_panel = AddPanel();
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first panel should now be hidden by the new browsers needing space.
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(first_panel)->visible());
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_panel)->visible());
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(browser)->visible());
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adding browsers should eventually begin to hide browsers. We will add
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // browsers until either the last panel or browser is hidden.
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  items_added = 0;
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (GetButtonByID(browser)->visible() &&
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         GetButtonByID(last_panel)->visible()) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser = AddTabbedBrowser();
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_panel)->visible());
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(browser)->visible());
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds button until overflow then removes first added one. Verifies that
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last added one changes from invisible to visible and overflow
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chevron is gone.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, RemoveButtonRevealsOverflowed) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser until overflow.
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID first_added = AddTabbedBrowser();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = first_added;
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddTabbedBrowser();
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect add more than 1 button. First added is visible and last is not.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(first_added, last_added);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_added)->visible());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_added)->visible());
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove first added.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveByID(first_added);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last added button becomes visible and overflow chevron is gone.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_added)->visible());
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0f, GetButtonByID(last_added)->layer()->opacity());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_api_->IsOverflowButtonVisible());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that remove last overflowed button should hide overflow chevron.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, RemoveLastOverflowed) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser until overflow.
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID last_added = AddTabbedBrowser();
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddTabbedBrowser();
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveByID(last_added);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_api_->IsOverflowButtonVisible());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds browser button without waiting for animation to finish and verifies
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that all added buttons are visible.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, AddButtonQuickly) {
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a few tabbed browser quickly without wait for animation.
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int added_count = 0;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddTabbedBrowserNoWait();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++added_count;
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(added_count, 10000);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LauncherView should be big enough to hold at least 3 new buttons.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GE(added_count, 3);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the last animation to finish.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verifies non-overflow buttons are visible.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i <= test_api_->GetLastVisibleIndex(); ++i) {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::LauncherButton* button = test_api_->GetButton(i);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (button) {
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(button->visible()) << "button index=" << i;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1.0f, button->layer()->opacity()) << "button index=" << i;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that model changes are handled correctly while a launcher icon is being
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dragged.
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, ModelChangesWhileDragging) {
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::LauncherButtonHost* button_host = launcher_view_;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::pair<LauncherID, views::View*> > id_map;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupForDragTest(&id_map);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Dragging browser shortcut at index 0.
64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(model_->items()[0].type == TYPE_BROWSER_SHORTCUT);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button = SimulateDrag(
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::MOUSE, 0, 2);
64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 1,
65090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
65290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
65490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       false);
65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(model_->items()[2].type == TYPE_BROWSER_SHORTCUT);
65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Dragging changes model order.
65890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  dragged_button = SimulateDrag(
65990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      internal::LauncherButtonHost::MOUSE, 0, 2);
66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 1,
66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancelling the drag operation restores previous order.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       true);
66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 2,
67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting an item keeps the remaining intact.
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_button = SimulateDrag(internal::LauncherButtonHost::MOUSE, 0, 2);
67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  model_->RemoveItemAt(1);
67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.erase(id_map.begin() + 1);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding a launcher item cancels the drag and respects the order.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_button = SimulateDrag(internal::LauncherButtonHost::MOUSE, 0, 2);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID new_id = AddAppShortcut();
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.insert(id_map.begin() + 5,
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                std::make_pair(new_id, GetButtonByID(new_id)));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adding a launcher item at the end (i.e. a panel)  canels drag and respects
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the order.
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dragged_button = SimulateDrag(internal::LauncherButtonHost::MOUSE, 0, 2);
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_id = AddPanel();
69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.insert(id_map.begin() + 7,
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::make_pair(new_id, GetButtonByID(new_id)));
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       false);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that 2nd drag from the other pointer would be ignored.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, SimultaneousDrag) {
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::LauncherButtonHost* button_host = launcher_view_;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::pair<LauncherID, views::View*> > id_map;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupForDragTest(&id_map);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a mouse drag.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button_mouse = SimulateDrag(
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::MOUSE, 0, 2);
71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 1,
71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt a touch drag before the mouse drag finishes.
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button_touch = SimulateDrag(
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::TOUCH, 3, 1);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing changes since 2nd drag is ignored.
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish the mouse drag.
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button_mouse,
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now start a touch drag.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_button_touch = SimulateDrag(
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::TOUCH, 3, 1);
73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin() + 2,
73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3,
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 4);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And attempt a mouse drag before the touch drag finishes.
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_button_mouse = SimulateDrag(
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::MOUSE, 0, 1);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing changes since 2nd drag is ignored.
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button_touch,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::TOUCH,
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that item status changes are reflected in the buttons.
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, LauncherItemStatus) {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser.
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddTabbedBrowser();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem item = GetItemByID(last_added);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = model_->ItemIndexByID(last_added);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* button = GetButtonByID(last_added);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_RUNNING, button->state());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ACTIVE;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_ACTIVE, button->state());
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ATTENTION;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_ATTENTION, button->state());
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that item status changes are reflected in the buttons
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for platform apps.
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, LauncherItemStatusPlatformApp) {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddPlatformApp();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem item = GetItemByID(last_added);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = model_->ItemIndexByID(last_added);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* button = GetButtonByID(last_added);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_RUNNING, button->state());
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ACTIVE;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_ACTIVE, button->state());
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ATTENTION;
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_ATTENTION, button->state());
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Confirm that launcher item bounds are correctly updated on shelf changes.
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewTest, LauncherItemBoundsCheck) {
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::ShelfLayoutManager* shelf_layout_manager =
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->shelf()->shelf_layout_manager();
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf_layout_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf_layout_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, LauncherTooltipTest) {
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prepare some items to the launcher.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID app_button_id = AddAppShortcut();
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID tab_button_id = AddTabbedBrowser();
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* app_button = GetButtonByID(app_button_id);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* tab_button = GetButtonByID(tab_button_id);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::LauncherButtonHost* button_host = launcher_view_;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherTooltipManager* tooltip_manager =
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      launcher_view_->tooltip_manager();
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(app_button);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a delay to show the tooltip, so it's not visible yet.
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_button, GetTooltipAnchorView());
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowTooltip();
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once it's visible, it keeps visibility and is pointing to the same
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item.
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseExitedButton(app_button);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_button, GetTooltipAnchorView());
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When entered to another item, it switches to the new item.  There is no
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delay for the visibility.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(tab_button);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(tab_button, GetTooltipAnchorView());
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseExitedButton(tab_button);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_manager->Close();
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Next time: enter app_button -> move immediately to tab_button.
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(app_button);
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseExitedButton(app_button);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(tab_button);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(tab_button, GetTooltipAnchorView());
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, ShouldHideTooltipTest) {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID app_button_id = AddAppShortcut();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID tab_button_id = AddTabbedBrowser();
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is on normal buttons.
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test_api_->GetButtonCount(); i++) {
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::LauncherButton* button = test_api_->GetButton(i);
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button->GetMirroredBounds().CenterPoint()))
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "LauncherView tries to hide on button " << i;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should not hide on the app-list button.
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* app_list_button = launcher_view_->GetAppListButtonView();
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_list_button->GetMirroredBounds().CenterPoint()));
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is in the gap between two buttons.
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect app_button_rect = GetButtonByID(app_button_id)->GetMirroredBounds();
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect tab_button_rect = GetButtonByID(tab_button_id)->GetMirroredBounds();
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(app_button_rect.Intersects(tab_button_rect));
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::UnionRects(app_button_rect, tab_button_rect).CenterPoint()));
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should hide if it's outside of all buttons.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect all_area;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test_api_->GetButtonCount(); i++) {
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::LauncherButton* button = test_api_->GetButton(i);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_area.Union(button->GetMirroredBounds());
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  all_area.Union(launcher_view_->GetAppListButtonView()->GetMirroredBounds());
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(launcher_view_->ShouldHideTooltip(all_area.origin()));
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.right() - 1, all_area.bottom() - 1)));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.right(), all_area.y())));
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x() - 1, all_area.y())));
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x(), all_area.y() - 1)));
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x(), all_area.bottom())));
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, ShouldHideTooltipWithAppListWindowTest) {
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->ToggleAppList(NULL);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(Shell::GetInstance()->GetAppListWindow());
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is on normal buttons.
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < test_api_->GetButtonCount(); i++) {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::LauncherButton* button = test_api_->GetButton(i);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button->GetMirroredBounds().CenterPoint()))
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "LauncherView tries to hide on button " << i;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should hide on the app-list button.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* app_list_button = launcher_view_->GetAppListButtonView();
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_list_button->GetMirroredBounds().CenterPoint()));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Resizing launcher view while an add animation without fade-in is running,
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which happens when overflow happens. App list button should end up in its
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new ideal bounds.
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, ResizeDuringOverflowAddAnimation) {
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add buttons until overflow. Let the non-overflow add animations finish but
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leave the last running.
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabbedBrowserNoWait();
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddTabbedBrowserNoWait();
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resize launcher view with that animation running and stay overflown.
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = launcher_view_->bounds();
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds.set_width(bounds.width() - kLauncherPreferredSize);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launcher_view_->SetBoundsRect(bounds);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_api_->IsOverflowButtonVisible());
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish the animation.
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App list button should ends up in its new ideal bounds.
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int app_list_button_index = test_api_->GetButtonCount() - 1;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect& app_list_ideal_bounds =
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_api_->GetIdealBoundsByIndex(app_list_button_index);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect& app_list_bounds =
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_api_->GetBoundsByIndex(app_list_button_index);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_list_bounds, app_list_ideal_bounds);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that the first item in the list follows Fitt's law by including the
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first pixel and being therefore bigger then the others.
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewTest, CheckFittsLaw) {
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All buttons should be visible.
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect ideal_bounds_0 = test_api_->GetIdealBoundsByIndex(0);
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect ideal_bounds_1 = test_api_->GetIdealBoundsByIndex(1);
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(ideal_bounds_0.width(), ideal_bounds_1.width());
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(LtrRtl, LauncherViewTextDirectionTest, testing::Bool());
971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
974