screen_locker_browsertest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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 "base/command_line.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/cros_in_process_browser_test.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/mock_network_library.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/mock_authenticator.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/screen_locker.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/screen_locker_tester.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_controls.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_power_manager_client.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_session_manager_client.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/mock_update_engine_client.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/layer_animator.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An object that wait for lock state and fullscreen state. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Waiter : public content::NotificationObserver { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Waiter(Browser* browser) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : browser_(browser), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) running_(false) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_FULLSCREEN_CHANGED, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Waiter() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type == chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED || 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == chrome::NOTIFICATION_FULLSCREEN_CHANGED); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (running_) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Quit(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait until the two conditions are met. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Wait(bool locker_state, bool fullscreen) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) running_ = true; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<chromeos::test::ScreenLockerTester> 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester(chromeos::ScreenLocker::GetTester()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tester->IsLocked() != locker_state || 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_->window()->IsFullscreen() != fullscreen) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure all pending tasks are executed. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) running_ = false; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Are we currently running the message loop? 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool running_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Waiter); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenLockerTest : public CrosInProcessBrowserTest { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLockerTest() : mock_power_manager_client_(NULL), 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_session_manager_client_(NULL) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPowerManagerClient* mock_power_manager_client_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSessionManagerClient* mock_session_manager_client_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LockScreen(test::ScreenLockerTester* tester) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver lock_state_observer( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tester->IsLocked()) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_state_observer.Wait(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDBusThreadManager* mock_dbus_thread_manager = 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockDBusThreadManager; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_dbus_thread_manager, GetSystemBus()) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(reinterpret_cast<dbus::Bus*>(NULL))); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrosInProcessBrowserTest::SetUpInProcessBrowserTestFixture(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_power_manager_client_ = static_cast<MockPowerManagerClient*>( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::Get()->GetPowerManagerClient()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_session_manager_client_ = static_cast<MockSessionManagerClient*>( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::Get()->GetSessionManagerClient()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_mock_->InitStatusAreaMocks(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_power_manager_client_, AddObserver(_)) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenDismissed()) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expectations for the status are on the screen lock window. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_mock_->SetStatusAreaMocksExpectations(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockNetworkLibrary* mock_network_library = 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_mock_->mock_network_library(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_network_library, AddUserActionObserver(_)) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_network_library, LoadOncNetworks(_, _)) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AnyNumber()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zero_duration_mode_.reset(new ui::ScopedAnimationDurationScaleMode( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedAnimationDurationScaleMode::ZERO_DURATION)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kLoginProfile, "user"); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ui::ScopedAnimationDurationScaleMode> zero_duration_mode_; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScreenLockerTest); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestBasic) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenShown()) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver lock_state_observer( 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!chromeos::ScreenLocker::GetTester()->IsLocked()) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_state_observer.Wait(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test to make sure that the widget is actually appearing and is of 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reasonable size, preventing a regression of 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium-os/issues/detail?id=5987 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect lock_bounds = tester->GetChildWidget()->GetWindowBoundsInScreen(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(lock_bounds.width(), 10); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(lock_bounds.height(), 10); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->InjectMockAuthenticator(UserManager::kStubUser, "pass"); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("fail"); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("pass"); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successful authentication simply send a unlock request to PowerManager. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Emulate LockScreen request from SessionManager. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(oshima): Find out better way to handle this in mock. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestFullscreenExit) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenShown()) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Waiter waiter(browser()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->fullscreen_controller()->ToggleFullscreenMode(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter.Wait(false /* not locked */, true /* full screen */); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsFullscreen()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Waiter waiter(browser()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter.Wait(true /* locked */, false /* full screen */); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsFullscreen()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->InjectMockAuthenticator(UserManager::kStubUser, "pass"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("pass"); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimulateKeyPress(views::Widget* widget, ui::KeyboardCode key_code) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::SendKeyPress(widget->GetNativeWindow(), 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code, false, false, false, false); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnlockKeyPress(views::Widget* widget) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateKeyPress(widget, ui::VKEY_SPACE); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestShowTwice) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenShown()) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(2) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockScreen(tester.get()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure there's a profile or this test crashes. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager::GetDefaultProfile(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling Show again simply send LockCompleted signal. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the locker to match expectations. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(flackr): Find out why the RenderView isn't getting the escape press 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and re-enable this test (currently this test is flaky). 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestEscape) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenShown()) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockScreen(tester.get()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure there's a profile or this test crashes. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager::GetDefaultProfile(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->SetPassword("password"); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("password", tester->GetPassword()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Escape clears the password. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateKeyPress(tester->GetWidget(), ui::VKEY_ESCAPE); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", tester->GetPassword()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the locker to match expectations. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 275