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