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)
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_button.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_icon_observer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_model.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_tooltip_manager.h"
164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "ash/launcher/launcher_types.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/launcher_view_test_api.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/shell_test_api.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/test_launcher_delegate.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/command_line.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/test/event_generator.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event_constants.h"
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/view_model.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LauncherIconObserver tests.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestLauncherIconObserver : public LauncherIconObserver {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestLauncherIconObserver(Launcher* launcher)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : launcher_(launcher),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        change_notified_(false) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (launcher_)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      launcher_->AddIconObserver(this);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestLauncherIconObserver() {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (launcher_)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      launcher_->RemoveIconObserver(this);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LauncherIconObserver implementation.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLauncherIconPositionsChanged() OVERRIDE {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    change_notified_ = true;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int change_notified() const { return change_notified_; }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset() { change_notified_ = false; }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Launcher* launcher_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool change_notified_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestLauncherIconObserver);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LauncherViewIconObserverTest : public ash::test::AshTestBase {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherViewIconObserverTest() {}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LauncherViewIconObserverTest() {}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Launcher* launcher = Launcher::ForPrimaryDisplay();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.reset(new TestLauncherIconObserver(launcher));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launcher_view_test_.reset(new LauncherViewTestAPI(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        launcher->GetLauncherViewForTest()));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launcher_view_test_->SetAnimationDuration(1);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.reset();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLauncherIconObserver* observer() { return observer_.get(); }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherViewTestAPI* launcher_view_test() {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return launcher_view_test_.get();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Launcher* LauncherForSecondaryDisplay() {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Launcher::ForWindow(Shell::GetAllRootWindows()[1]);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestLauncherIconObserver> observer_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LauncherViewTestAPI> launcher_view_test_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LauncherViewIconObserverTest);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewIconObserverTest, AddRemove) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::test::TestLauncherDelegate* launcher_delegate =
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::test::TestLauncherDelegate::instance();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launcher_delegate);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<views::Widget> widget(new views::Widget());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launcher_delegate->AddLauncherItem(widget->GetNativeWindow());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_view_test()->RunMessageLoopUntilAnimationsDone();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_view_test()->RunMessageLoopUntilAnimationsDone();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer()->Reset();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sometimes fails on trybots on win7_aura. http://crbug.com/177135
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AddRemoveWithMultipleDisplays \
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISABLED_AddRemoveWithMultipleDisplays
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AddRemoveWithMultipleDisplays \
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddRemoveWithMultipleDisplays
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure creating/deleting an window on one displays notifies a
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// launcher on external display as well as one on primary.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewIconObserverTest, MAYBE_AddRemoveWithMultipleDisplays) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x400,400x400");
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestLauncherIconObserver second_observer(LauncherForSecondaryDisplay());
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::test::TestLauncherDelegate* launcher_delegate =
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ash::test::TestLauncherDelegate::instance();
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(launcher_delegate);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<views::Widget> widget(new views::Widget());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Init(params);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_delegate->AddLauncherItem(widget->GetNativeWindow());
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_view_test()->RunMessageLoopUntilAnimationsDone();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(second_observer.change_notified());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer()->Reset();
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_observer.Reset();
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow());
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher_view_test()->RunMessageLoopUntilAnimationsDone();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(second_observer.change_notified());
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_observer.Reset();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewIconObserverTest, BoundsChanged) {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::ShelfWidget* shelf = Shell::GetPrimaryRootWindowController()->shelf();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Launcher* launcher = Launcher::ForPrimaryDisplay();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size shelf_size =
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shelf->GetWindowBoundsInScreen().size();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf_size.set_width(shelf_size.width() / 2);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_GT(shelf_size.width(), 0);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  launcher->SetLauncherViewBounds(gfx::Rect(shelf_size));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No animation happens for LauncherView bounds change.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer()->change_notified());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer()->Reset();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LauncherView tests.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LauncherViewTest : public AshTestBase {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherViewTest() : model_(NULL), launcher_view_(NULL) {}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LauncherViewTest() {}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test::ShellTestApi test_api(Shell::GetInstance());
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_ = test_api.launcher_model();
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Launcher* launcher = Launcher::ForPrimaryDisplay();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    launcher_view_ = launcher->GetLauncherViewForTest();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The bounds should be big enough for 4 buttons + overflow chevron.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launcher_view_->SetBounds(0, 0, 500, 50);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_api_.reset(new LauncherViewTestAPI(launcher_view_));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->SetAnimationDuration(1);  // Speeds up animation for test.
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Add browser shortcut launcher item at index 0 for test.
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddBrowserShortcut();
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_api_.reset();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LauncherID AddBrowserShortcut() {
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LauncherItem browser_shortcut;
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    browser_shortcut.type = TYPE_BROWSER_SHORTCUT;
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    browser_shortcut.is_incognito = false;
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LauncherID id = model_->next_id();
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    model_->AddAt(0, browser_shortcut);
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return id;
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddAppShortcut() {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItem item;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type = TYPE_APP_SHORTCUT;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.status = STATUS_CLOSED;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = model_->next_id();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->Add(item);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddTabbedBrowserNoWait() {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItem item;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type = TYPE_TABBED;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.status = STATUS_RUNNING;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = model_->next_id();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->Add(item);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddTabbedBrowser() {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = AddTabbedBrowserNoWait();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID AddPanel() {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherID id = AddPanelNoWait();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return id;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddPlatformAppNoWait() {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItem item;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.type = TYPE_PLATFORM_APP;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.status = STATUS_RUNNING;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = model_->next_id();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->Add(item);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID AddPanelNoWait() {
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherItem item;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item.type = TYPE_APP_PANEL;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item.status = STATUS_RUNNING;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherID id = model_->next_id();
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_->Add(item);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return id;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID AddPlatformApp() {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherID id = AddPlatformAppNoWait();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveByID(LauncherID id) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->RemoveItemAt(model_->ItemIndexByID(id));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* GetButtonByID(LauncherID id) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index = model_->ItemIndexByID(id);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_api_->GetButton(index);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem GetItemByID(LauncherID id) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LauncherItems::const_iterator items = model_->ItemByID(id);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *items;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckModelIDs(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<std::pair<LauncherID, views::View*> >& id_map) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t map_index = 0;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t model_index = 0;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         model_index < model_->items().size();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++model_index) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::LauncherItem item = model_->items()[model_index];
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::LauncherID id = item.id;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(id_map[map_index].first, id);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(id_map[map_index].second, GetButtonByID(id));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++map_index;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(map_index, id_map.size());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyLauncherItemBoundsAreValid() {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i=0;i <= test_api_->GetLastVisibleIndex(); ++i) {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (test_api_->GetButton(i)) {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect launcher_view_bounds = launcher_view_->GetLocalBounds();
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect item_bounds = test_api_->GetBoundsByIndex(i);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.x() >= 0);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.y() >= 0);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.right() <= launcher_view_bounds.width());
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(item_bounds.bottom() <= launcher_view_bounds.height());
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  views::View* SimulateButtonPressed(
3384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      internal::LauncherButtonHost::Pointer pointer,
3394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      int button_index) {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    internal::LauncherButtonHost* button_host = launcher_view_;
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* button = test_api_->GetButton(button_index);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent click_event(ui::ET_MOUSE_PRESSED,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               button->bounds().origin(),
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               button->bounds().origin(), 0);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    button_host->PointerPressedOnButton(button, pointer, click_event);
3464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return button;
3474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
3484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
3494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  views::View* SimulateClick(internal::LauncherButtonHost::Pointer pointer,
3504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                             int button_index) {
3514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    internal::LauncherButtonHost* button_host = launcher_view_;
3524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    views::View* button = SimulateButtonPressed(pointer, button_index);
3534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    button_host->PointerReleasedOnButton(button,
3544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                         internal::LauncherButtonHost::MOUSE,
3554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                         false);
3564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return button;
3574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
3584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
3594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  views::View* SimulateDrag(internal::LauncherButtonHost::Pointer pointer,
3604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                            int button_index,
3614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                            int destination_index) {
3624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    internal::LauncherButtonHost* button_host = launcher_view_;
3634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    views::View* button = SimulateButtonPressed(pointer, button_index);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drag.
36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* destination = test_api_->GetButton(destination_index);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              destination->bounds().origin(),
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              destination->bounds().origin(), 0);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    button_host->PointerDraggedOnButton(button, pointer, drag_event);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return button;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupForDragTest(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<std::pair<LauncherID, views::View*> >* id_map) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize |id_map| with the automatically-created launcher buttons.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < model_->items().size(); ++i) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButton* button = test_api_->GetButton(i);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id_map->push_back(std::make_pair(model_->items()[i].id, button));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(CheckModelIDs(*id_map));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add 5 app launcher buttons for testing.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < 5; ++i) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LauncherID id = AddAppShortcut();
38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // browser shortcut is located at index 0. So we should start to add app
38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // shortcut at index 1.
38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      id_map->insert(id_map->begin() + (i + 1),
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     std::make_pair(id, GetButtonByID(id)));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(CheckModelIDs(*id_map));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* GetTooltipAnchorView() {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return launcher_view_->tooltip_manager()->anchor_;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowTooltip() {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    launcher_view_->tooltip_manager()->ShowInternal();
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherModel* model_;
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::LauncherView* launcher_view_;
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LauncherViewTestAPI> test_api_;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LauncherViewTest);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LauncherViewTextDirectionTest
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : public LauncherViewTest,
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      public testing::WithParamInterface<bool> {
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LauncherViewTextDirectionTest() : is_rtl_(GetParam()) {}
416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~LauncherViewTextDirectionTest() {}
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LauncherViewTest::SetUp();
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    original_locale_ = l10n_util::GetApplicationLocale(std::string());
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (is_rtl_)
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::i18n::SetICUDefaultLocale("he");
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_EQ(is_rtl_, base::i18n::IsRTL());
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (is_rtl_)
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::i18n::SetICUDefaultLocale(original_locale_);
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LauncherViewTest::TearDown();
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_rtl_;
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string original_locale_;
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LauncherViewTextDirectionTest);
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that the ideal item icon bounds match the view's bounds in the screen
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// in both LTR and RTL.
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_P(LauncherViewTextDirectionTest, IdealBoundsOfItemIcon) {
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LauncherID id = AddTabbedBrowser();
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  internal::LauncherButton* button = GetButtonByID(id);
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect item_bounds = button->GetBoundsInScreen();
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Point icon_offset = button->GetIconBounds().origin();
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  item_bounds.Offset(icon_offset.OffsetFromOrigin());
447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect ideal_bounds = launcher_view_->GetIdealBoundsOfItemIcon(id);
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Point screen_origin;
449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  views::View::ConvertPointToScreen(launcher_view_, &screen_origin);
450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ideal_bounds.Offset(screen_origin.x(), screen_origin.y());
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(item_bounds.x(), ideal_bounds.x());
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(item_bounds.y(), ideal_bounds.y());
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Checks that launcher view contents are considered in the correct drag group.
4564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochTEST_F(LauncherViewTest, EnforceDragType) {
4574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_TABBED, TYPE_TABBED));
4584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_TABBED, TYPE_PLATFORM_APP));
4594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_TABBED, TYPE_APP_SHORTCUT));
4604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_TABBED, TYPE_BROWSER_SHORTCUT));
4614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_TABBED, TYPE_WINDOWED_APP));
4624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_TABBED, TYPE_APP_LIST));
4634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_TABBED, TYPE_APP_PANEL));
4644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_PLATFORM_APP));
4664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_APP_SHORTCUT));
4674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP,
4684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                       TYPE_BROWSER_SHORTCUT));
4694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_WINDOWED_APP));
4704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_APP_LIST));
4714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_PLATFORM_APP, TYPE_APP_PANEL));
4724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_SHORTCUT, TYPE_APP_SHORTCUT));
4744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_SHORTCUT,
4754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                      TYPE_BROWSER_SHORTCUT));
4764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_APP_SHORTCUT,
4774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                       TYPE_WINDOWED_APP));
4784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_APP_SHORTCUT, TYPE_APP_LIST));
4794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_APP_SHORTCUT, TYPE_APP_PANEL));
4804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT,
4824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                      TYPE_BROWSER_SHORTCUT));
4834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT,
4844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                       TYPE_WINDOWED_APP));
4854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT, TYPE_APP_LIST));
4864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_BROWSER_SHORTCUT, TYPE_APP_PANEL));
4874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_WINDOWED_APP, TYPE_WINDOWED_APP));
4894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_WINDOWED_APP, TYPE_APP_LIST));
4904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_WINDOWED_APP, TYPE_APP_PANEL));
4914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_LIST, TYPE_APP_LIST));
4934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(test_api_->SameDragType(TYPE_APP_LIST, TYPE_APP_PANEL));
4944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(test_api_->SameDragType(TYPE_APP_PANEL, TYPE_APP_PANEL));
4964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
4974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds browser button until overflow and verifies that the last added browser
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// button is hidden.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, AddBrowserUntilOverflow) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser until overflow.
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddTabbedBrowser();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Added button is visible after animation while in this loop.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GetButtonByID(last_added)->visible());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddTabbedBrowser();
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last added button should be invisible.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_added)->visible());
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds one browser button then adds app shortcut until overflow. Verifies that
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the browser button gets hidden on overflow and last added app shortcut is
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// still visible.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, AddAppShortcutWithBrowserButtonUntilOverflow) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID browser_button_id = AddTabbedBrowser();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add app shortcut until overflow.
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddAppShortcut();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Added button is visible after animation while in this loop.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(GetButtonByID(last_added)->visible());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddAppShortcut();
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last added app short button should be visible.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_added)->visible());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the browser button is invisible.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(browser_button_id)->visible());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewTest, AddPanelHidesTabbedBrowser) {
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add tabbed browser until overflow, remember last visible tabbed browser.
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID first_added = AddTabbedBrowser();
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_added)->visible());
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID last_visible = first_added;
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (true) {
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LauncherID added = AddTabbedBrowser();
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (test_api_->IsOverflowButtonVisible()) {
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_FALSE(GetButtonByID(added)->visible());
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_visible = added;
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID panel = AddPanel();
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(panel)->visible());
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_visible)->visible());
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveByID(panel);
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_visible)->visible());
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When there are more panels then browsers we should hide panels rather
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// than browsers.
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewTest, BrowserHidesExcessPanels) {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add tabbed browser.
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID browser = AddTabbedBrowser();
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID first_panel = AddPanel();
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(browser)->visible());
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_panel)->visible());
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add panels until there is an overflow.
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID last_panel = first_panel;
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_panel = AddPanel();
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first panel should now be hidden by the new browsers needing space.
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(first_panel)->visible());
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_panel)->visible());
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(browser)->visible());
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adding browsers should eventually begin to hide browsers. We will add
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // browsers until either the last panel or browser is hidden.
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  items_added = 0;
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (GetButtonByID(browser)->visible() &&
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         GetButtonByID(last_panel)->visible()) {
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser = AddTabbedBrowser();
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_panel)->visible());
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetButtonByID(browser)->visible());
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds button until overflow then removes first added one. Verifies that
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last added one changes from invisible to visible and overflow
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chevron is gone.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, RemoveButtonRevealsOverflowed) {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser until overflow.
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID first_added = AddTabbedBrowser();
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = first_added;
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddTabbedBrowser();
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect add more than 1 button. First added is visible and last is not.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(first_added, last_added);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(first_added)->visible());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetButtonByID(last_added)->visible());
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove first added.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveByID(first_added);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last added button becomes visible and overflow chevron is gone.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetButtonByID(last_added)->visible());
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0f, GetButtonByID(last_added)->layer()->opacity());
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_api_->IsOverflowButtonVisible());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that remove last overflowed button should hide overflow chevron.
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, RemoveLastOverflowed) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser until overflow.
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LauncherID last_added = AddTabbedBrowser();
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_added = AddTabbedBrowser();
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveByID(last_added);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_api_->IsOverflowButtonVisible());
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds browser button without waiting for animation to finish and verifies
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that all added buttons are visible.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, AddButtonQuickly) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a few tabbed browser quickly without wait for animation.
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int added_count = 0;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddTabbedBrowserNoWait();
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++added_count;
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(added_count, 10000);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LauncherView should be big enough to hold at least 3 new buttons.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GE(added_count, 3);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the last animation to finish.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verifies non-overflow buttons are visible.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i <= test_api_->GetLastVisibleIndex(); ++i) {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::LauncherButton* button = test_api_->GetButton(i);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (button) {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(button->visible()) << "button index=" << i;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1.0f, button->layer()->opacity()) << "button index=" << i;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that model changes are handled correctly while a launcher icon is being
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dragged.
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, ModelChangesWhileDragging) {
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::LauncherButtonHost* button_host = launcher_view_;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::pair<LauncherID, views::View*> > id_map;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupForDragTest(&id_map);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Dragging browser shortcut at index 0.
70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(model_->items()[0].type == TYPE_BROWSER_SHORTCUT);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button = SimulateDrag(
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::MOUSE, 0, 2);
71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 1,
71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       false);
71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(model_->items()[2].type == TYPE_BROWSER_SHORTCUT);
71990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
72090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Dragging changes model order.
72190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  dragged_button = SimulateDrag(
72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      internal::LauncherButtonHost::MOUSE, 0, 2);
72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 1,
72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancelling the drag operation restores previous order.
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       true);
73290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 2,
73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting an item keeps the remaining intact.
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_button = SimulateDrag(internal::LauncherButtonHost::MOUSE, 0, 2);
73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  model_->RemoveItemAt(1);
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.erase(id_map.begin() + 1);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding a launcher item cancels the drag and respects the order.
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_button = SimulateDrag(internal::LauncherButtonHost::MOUSE, 0, 2);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID new_id = AddAppShortcut();
74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.insert(id_map.begin() + 5,
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                std::make_pair(new_id, GetButtonByID(new_id)));
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adding a launcher item at the end (i.e. a panel)  canels drag and respects
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the order.
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dragged_button = SimulateDrag(internal::LauncherButtonHost::MOUSE, 0, 2);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_id = AddPanel();
76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id_map.insert(id_map.begin() + 7,
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::make_pair(new_id, GetButtonByID(new_id)));
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button,
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       false);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that 2nd drag from the other pointer would be ignored.
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, SimultaneousDrag) {
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::LauncherButtonHost* button_host = launcher_view_;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::pair<LauncherID, views::View*> > id_map;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupForDragTest(&id_map);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a mouse drag.
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button_mouse = SimulateDrag(
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::MOUSE, 0, 2);
77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin(),
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 1,
78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt a touch drag before the mouse drag finishes.
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* dragged_button_touch = SimulateDrag(
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::TOUCH, 3, 1);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing changes since 2nd drag is ignored.
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish the mouse drag.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button_mouse,
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::MOUSE,
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now start a touch drag.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_button_touch = SimulateDrag(
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::TOUCH, 3, 1);
79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::rotate(id_map.begin() + 2,
79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 3,
80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              id_map.begin() + 4);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And attempt a mouse drag before the touch drag finishes.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_button_mouse = SimulateDrag(
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::LauncherButtonHost::MOUSE, 0, 1);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing changes since 2nd drag is ignored.
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->PointerReleasedOnButton(dragged_button_touch,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       internal::LauncherButtonHost::TOUCH,
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       false);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Check that clicking first on one item and then dragging another works as
8174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// expected.
8184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochTEST_F(LauncherViewTest, ClickOneDragAnother) {
8194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  internal::LauncherButtonHost* button_host = launcher_view_;
8204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  std::vector<std::pair<LauncherID, views::View*> > id_map;
8224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SetupForDragTest(&id_map);
8234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // A click on item 1 is simulated.
8254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SimulateClick(internal::LauncherButtonHost::MOUSE, 1);
8264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Dragging browser index at 0 should change the model order correctly.
8284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(model_->items()[0].type == TYPE_BROWSER_SHORTCUT);
8294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  views::View* dragged_button = SimulateDrag(
8304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      internal::LauncherButtonHost::MOUSE, 0, 2);
8314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  std::rotate(id_map.begin(),
8324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              id_map.begin() + 1,
8334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              id_map.begin() + 3);
8344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(CheckModelIDs(id_map));
8354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  button_host->PointerReleasedOnButton(dragged_button,
8364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                       internal::LauncherButtonHost::MOUSE,
8374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                       false);
8384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(model_->items()[2].type == TYPE_BROWSER_SHORTCUT);
8394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
8404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that item status changes are reflected in the buttons.
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, LauncherItemStatus) {
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser.
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddTabbedBrowser();
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem item = GetItemByID(last_added);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = model_->ItemIndexByID(last_added);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* button = GetButtonByID(last_added);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_RUNNING, button->state());
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ACTIVE;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_ACTIVE, button->state());
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ATTENTION;
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_ATTENTION, button->state());
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8607dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(LauncherViewTest, LauncherItemPositionReflectedOnStateChanged) {
8617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
8627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            test_api_->GetButtonCount());
8637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Add 2 items to the launcher.
8657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  LauncherID item1_id = AddTabbedBrowser();
8667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  LauncherID item2_id = AddPlatformAppNoWait();
8677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  internal::LauncherButton* item1_button = GetButtonByID(item1_id);
8687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  internal::LauncherButton* item2_button = GetButtonByID(item2_id);
8697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  internal::LauncherButton::State state_mask =
8717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      static_cast<internal::LauncherButton::State>
8727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          (internal::LauncherButton::STATE_NORMAL |
8737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          internal::LauncherButton::STATE_HOVERED |
8747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          internal::LauncherButton::STATE_RUNNING |
8757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          internal::LauncherButton::STATE_ACTIVE |
8767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          internal::LauncherButton::STATE_ATTENTION |
8777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          internal::LauncherButton::STATE_FOCUSED);
8787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Clear the button states.
8807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  item1_button->ClearState(state_mask);
8817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  item2_button->ClearState(state_mask);
8827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Since default alignment in tests is bottom, state is reflected in y-axis.
8847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(item1_button->GetIconBounds().y(),
8857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            item2_button->GetIconBounds().y());
8867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  item1_button->AddState(internal::LauncherButton::STATE_HOVERED);
8877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_NE(item1_button->GetIconBounds().y(),
8887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            item2_button->GetIconBounds().y());
8897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  item1_button->ClearState(internal::LauncherButton::STATE_HOVERED);
8907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Enable the alternate shelf layout.
8927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CommandLine::ForCurrentProcess()->AppendSwitch(
8937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ash::switches::kAshUseAlternateShelfLayout);
8947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  launcher_view_->Layout();
8957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Since default alignment in tests is bottom, state is reflected in y-axis.
8977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // In alternate shelf layout there is no visible hovered state.
8987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(item1_button->GetIconBounds().y(),
8997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            item2_button->GetIconBounds().y());
9007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  item1_button->AddState(internal::LauncherButton::STATE_HOVERED);
9017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(item1_button->GetIconBounds().y(),
9027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            item2_button->GetIconBounds().y());
9037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
9047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that item status changes are reflected in the buttons
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for platform apps.
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, LauncherItemStatusPlatformApp) {
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add tabbed browser.
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID last_added = AddPlatformApp();
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItem item = GetItemByID(last_added);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = model_->ItemIndexByID(last_added);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* button = GetButtonByID(last_added);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_RUNNING, button->state());
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ACTIVE;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_ACTIVE, button->state());
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  item.status = ash::STATUS_ATTENTION;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_->Set(index, item);
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(internal::LauncherButton::STATE_ATTENTION, button->state());
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Confirm that launcher item bounds are correctly updated on shelf changes.
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewTest, LauncherItemBoundsCheck) {
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::ShelfLayoutManager* shelf_layout_manager =
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->shelf()->shelf_layout_manager();
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf_layout_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf_layout_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyLauncherItemBoundsAreValid();
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, LauncherTooltipTest) {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prepare some items to the launcher.
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID app_button_id = AddAppShortcut();
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID tab_button_id = AddTabbedBrowser();
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* app_button = GetButtonByID(app_button_id);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherButton* tab_button = GetButtonByID(tab_button_id);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::LauncherButtonHost* button_host = launcher_view_;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::LauncherTooltipManager* tooltip_manager =
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      launcher_view_->tooltip_manager();
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(app_button);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a delay to show the tooltip, so it's not visible yet.
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_button, GetTooltipAnchorView());
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowTooltip();
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once it's visible, it keeps visibility and is pointing to the same
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item.
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseExitedButton(app_button);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_button, GetTooltipAnchorView());
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When entered to another item, it switches to the new item.  There is no
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delay for the visibility.
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(tab_button);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(tab_button, GetTooltipAnchorView());
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseExitedButton(tab_button);
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_manager->Close();
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Next time: enter app_button -> move immediately to tab_button.
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(app_button);
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseExitedButton(app_button);
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_host->MouseEnteredButton(tab_button);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(tab_button, GetTooltipAnchorView());
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, ShouldHideTooltipTest) {
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID app_button_id = AddAppShortcut();
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherID tab_button_id = AddTabbedBrowser();
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is on normal buttons.
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test_api_->GetButtonCount(); i++) {
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::LauncherButton* button = test_api_->GetButton(i);
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button->GetMirroredBounds().CenterPoint()))
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "LauncherView tries to hide on button " << i;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should not hide on the app-list button.
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* app_list_button = launcher_view_->GetAppListButtonView();
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_list_button->GetMirroredBounds().CenterPoint()));
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is in the gap between two buttons.
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect app_button_rect = GetButtonByID(app_button_id)->GetMirroredBounds();
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect tab_button_rect = GetButtonByID(tab_button_id)->GetMirroredBounds();
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(app_button_rect.Intersects(tab_button_rect));
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::UnionRects(app_button_rect, tab_button_rect).CenterPoint()));
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should hide if it's outside of all buttons.
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect all_area;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test_api_->GetButtonCount(); i++) {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::LauncherButton* button = test_api_->GetButton(i);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_area.Union(button->GetMirroredBounds());
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  all_area.Union(launcher_view_->GetAppListButtonView()->GetMirroredBounds());
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(launcher_view_->ShouldHideTooltip(all_area.origin()));
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.right() - 1, all_area.bottom() - 1)));
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.right(), all_area.y())));
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x() - 1, all_area.y())));
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x(), all_area.y() - 1)));
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(all_area.x(), all_area.bottom())));
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, ShouldHideTooltipWithAppListWindowTest) {
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->ToggleAppList(NULL);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(Shell::GetInstance()->GetAppListWindow());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip shouldn't hide if the mouse is on normal buttons.
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < test_api_->GetButtonCount(); i++) {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::LauncherButton* button = test_api_->GetButton(i);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!button)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(launcher_view_->ShouldHideTooltip(
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button->GetMirroredBounds().CenterPoint()))
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "LauncherView tries to hide on button " << i;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tooltip should hide on the app-list button.
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* app_list_button = launcher_view_->GetAppListButtonView();
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(launcher_view_->ShouldHideTooltip(
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_list_button->GetMirroredBounds().CenterPoint()));
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test that by moving the mouse cursor off the button onto the bubble it closes
10567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// the bubble.
10577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(LauncherViewTest, ShouldHideTooltipWhenHoveringOnTooltip) {
10587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  internal::LauncherTooltipManager* tooltip_manager =
10597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      launcher_view_->tooltip_manager();
10607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  tooltip_manager->CreateZeroDelayTimerForTest();
10617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
10627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Move the mouse off any item and check that no tooltip is shown.
10647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.MoveMouseTo(gfx::Point(0, 0));
10657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
10667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Move the mouse over the button and check that it is visible.
10687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  views::View* app_list_button = launcher_view_->GetAppListButtonView();
10697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Rect bounds = app_list_button->GetBoundsInScreen();
10707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.MoveMouseTo(bounds.CenterPoint());
10717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Wait for the timer to go off.
10727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunAllPendingInMessageLoop();
10737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
10747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Move the mouse cursor slightly to the right of the item. The tooltip should
10767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // stay open.
10777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.MoveMouseBy(-(bounds.width() / 2 + 5), 0);
10787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Make sure there is no delayed close.
10797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunAllPendingInMessageLoop();
10807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
10817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Move back - it should still stay open.
10837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.MoveMouseBy(bounds.width() / 2 + 5, 0);
10847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Make sure there is no delayed close.
10857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunAllPendingInMessageLoop();
10867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(tooltip_manager->IsVisible());
10877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Now move the mouse cursor slightly above the item - so that it is over the
10897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // tooltip bubble. Now it should disappear.
10907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  generator.MoveMouseBy(0, -(bounds.height() / 2 + 5));
10917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Wait until the delayed close kicked in.
10927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunAllPendingInMessageLoop();
10937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(tooltip_manager->IsVisible());
10947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
10957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Resizing launcher view while an add animation without fade-in is running,
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which happens when overflow happens. App list button should end up in its
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new ideal bounds.
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(LauncherViewTest, ResizeDuringOverflowAddAnimation) {
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All buttons should be visible.
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_api_->GetButtonCount());
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add buttons until overflow. Let the non-overflow add animations finish but
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leave the last running.
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int items_added = 0;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabbedBrowserNoWait();
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!test_api_->IsOverflowButtonVisible()) {
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_->RunMessageLoopUntilAnimationsDone();
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddTabbedBrowserNoWait();
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++items_added;
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_LT(items_added, 10000);
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resize launcher view with that animation running and stay overflown.
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = launcher_view_->bounds();
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds.set_width(bounds.width() - kLauncherPreferredSize);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launcher_view_->SetBoundsRect(bounds);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_api_->IsOverflowButtonVisible());
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finish the animation.
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->RunMessageLoopUntilAnimationsDone();
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App list button should ends up in its new ideal bounds.
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int app_list_button_index = test_api_->GetButtonCount() - 1;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect& app_list_ideal_bounds =
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_api_->GetIdealBoundsByIndex(app_list_button_index);
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect& app_list_bounds =
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_api_->GetBoundsByIndex(app_list_button_index);
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_list_bounds, app_list_ideal_bounds);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that the first item in the list follows Fitt's law by including the
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first pixel and being therefore bigger then the others.
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LauncherViewTest, CheckFittsLaw) {
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All buttons should be visible.
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            test_api_->GetButtonCount());
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect ideal_bounds_0 = test_api_->GetIdealBoundsByIndex(0);
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect ideal_bounds_1 = test_api_->GetIdealBoundsByIndex(1);
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(ideal_bounds_0.width(), ideal_bounds_1.width());
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(LtrRtl, LauncherViewTextDirectionTest, testing::Bool());
1145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1148