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