screen_locker_browsertest.cc revision 3551c9c881056c480085172ff9840cab31610854
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) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/chromeos/login/screen_locker.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/mock_authenticator.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_switches.h" 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/dbus/fake_session_manager_client.h" 23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/layer_animator.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An object that wait for lock state and fullscreen state. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Waiter : public content::NotificationObserver { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Waiter(Browser* browser) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : browser_(browser), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) running_(false) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_FULLSCREEN_CHANGED, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Waiter() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type == chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED || 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == chrome::NOTIFICATION_FULLSCREEN_CHANGED); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (running_) 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait until the two conditions are met. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Wait(bool locker_state, bool fullscreen) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) running_ = true; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<chromeos::test::ScreenLockerTester> 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester(chromeos::ScreenLocker::GetTester()); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tester->IsLocked() != locker_state || 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_->window()->IsFullscreen() != fullscreen) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure all pending tasks are executed. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) running_ = false; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Are we currently running the message loop? 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool running_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Waiter); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ScreenLockerTest : public InProcessBrowserTest { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ScreenLockerTest() : fake_session_manager_client_(NULL) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 98b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FakeSessionManagerClient* fake_session_manager_client_; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LockScreen(test::ScreenLockerTester* tester) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver lock_state_observer( 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tester->IsLocked()) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_state_observer.Wait(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Verifies if LockScreenDismissed() was called once. 112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool VerifyLockScreenDismissed() { 113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return 1 == fake_session_manager_client_-> 114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) notify_lock_screen_dismissed_call_count(); 115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager = 120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new MockDBusThreadManagerWithoutGMock; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager); 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); 123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) fake_session_manager_client_ = 124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mock_dbus_thread_manager->fake_session_manager_client(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zero_duration_mode_.reset(new ui::ScopedAnimationDurationScaleMode( 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedAnimationDurationScaleMode::ZERO_DURATION)); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kLoginProfile, "user"); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ui::ScopedAnimationDurationScaleMode> zero_duration_mode_; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScreenLockerTest); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestBasic) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver lock_state_observer( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!chromeos::ScreenLocker::GetTester()->IsLocked()) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_state_observer.Wait(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test to make sure that the widget is actually appearing and is of 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reasonable size, preventing a regression of 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium-os/issues/detail?id=5987 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect lock_bounds = tester->GetChildWidget()->GetWindowBoundsInScreen(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(lock_bounds.width(), 10); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(lock_bounds.height(), 10); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->InjectMockAuthenticator(UserManager::kStubUser, "pass"); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("fail"); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("pass"); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Successful authentication simply send a unlock request to PowerManager. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ( 165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1, 166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) fake_session_manager_client_->notify_lock_screen_shown_call_count()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Emulate LockScreen request from SessionManager. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(oshima): Find out better way to handle this in mock. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyLockScreenDismissed()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestFullscreenExit) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Waiter waiter(browser()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->fullscreen_controller()->ToggleFullscreenMode(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter.Wait(false /* not locked */, true /* full screen */); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(browser()->window()->IsFullscreen()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Waiter waiter(browser()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter.Wait(true /* locked */, false /* full screen */); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(browser()->window()->IsFullscreen()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ( 194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1, 195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) fake_session_manager_client_->notify_lock_screen_shown_call_count()); 196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->InjectMockAuthenticator(UserManager::kStubUser, "pass"); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("pass"); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyLockScreenDismissed()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimulateKeyPress(views::Widget* widget, ui::KeyboardCode key_code) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::SendKeyPress(widget->GetNativeWindow(), 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code, false, false, false, false); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnlockKeyPress(views::Widget* widget) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateKeyPress(widget, ui::VKEY_SPACE); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestShowTwice) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockScreen(tester.get()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure there's a profile or this test crashes. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager::GetDefaultProfile(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling Show again simply send LockCompleted signal. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ( 226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2, 227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) fake_session_manager_client_->notify_lock_screen_shown_call_count()); 228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the locker to match expectations. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyLockScreenDismissed()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(flackr): Find out why the RenderView isn't getting the escape press 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and re-enable this test (currently this test is flaky). 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestEscape) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockScreen(tester.get()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure there's a profile or this test crashes. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager::GetDefaultProfile(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ( 247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1, 248b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) fake_session_manager_client_->notify_lock_screen_shown_call_count()); 249b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->SetPassword("password"); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("password", tester->GetPassword()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Escape clears the password. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateKeyPress(tester->GetWidget(), ui::VKEY_ESCAPE); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", tester->GetPassword()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the locker to match expectations. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyLockScreenDismissed()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 265