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) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/wm/window_state.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/mock_authenticator.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/screen_locker_tester.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chromeos/dbus/fake_dbus_thread_manager.h" 25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/dbus/fake_session_manager_client.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.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_) 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::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) 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ScreenLockerTest : public InProcessBrowserTest { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ScreenLockerTest() : fake_session_manager_client_(NULL) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FakeSessionManagerClient* fake_session_manager_client_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LockScreen(test::ScreenLockerTester* tester) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver lock_state_observer( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tester->IsLocked()) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_state_observer.Wait(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Verifies if LockScreenDismissed() was called once. 114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool VerifyLockScreenDismissed() { 115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return 1 == fake_session_manager_client_-> 116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) notify_lock_screen_dismissed_call_count(); 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FakeDBusThreadManager* fake_dbus_thread_manager = new FakeDBusThreadManager; 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fake_dbus_thread_manager->SetFakeClients(); 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fake_session_manager_client_ = new FakeSessionManagerClient; 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fake_dbus_thread_manager->SetSessionManagerClient( 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<SessionManagerClient>(fake_session_manager_client_)); 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DBusThreadManager::SetInstanceForTesting(fake_dbus_thread_manager); 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zero_duration_mode_.reset(new ui::ScopedAnimationDurationScaleMode( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedAnimationDurationScaleMode::ZERO_DURATION)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kLoginProfile, "user"); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ui::ScopedAnimationDurationScaleMode> zero_duration_mode_; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScreenLockerTest); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestBasic) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver lock_state_observer( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!chromeos::ScreenLocker::GetTester()->IsLocked()) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_state_observer.Wait(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test to make sure that the widget is actually appearing and is of 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reasonable size, preventing a regression of 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium-os/issues/detail?id=5987 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect lock_bounds = tester->GetChildWidget()->GetWindowBoundsInScreen(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(lock_bounds.width(), 10); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(lock_bounds.height(), 10); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->InjectMockAuthenticator(UserManager::kStubUser, "pass"); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("fail"); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("pass"); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Successful authentication clears the lock screen and tells the 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // SessionManager to announce this over DBus. 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ( 170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1, 171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) fake_session_manager_client_->notify_lock_screen_shown_call_count()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyLockScreenDismissed()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Test how locking the screen affects an active fullscreen window. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestFullscreenExit) { 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 1) If the active browser window is in fullscreen and the fullscreen window 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // does not have all the pixels (e.g. the shelf is auto hidden instead of 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // hidden), locking the screen should not exit fullscreen. The shelf is 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // auto hidden when in immersive fullscreen. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BrowserWindow* browser_window = browser()->window(); 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::wm::WindowState* window_state = ash::wm::GetWindowState( 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser_window->GetNativeWindow()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Waiter waiter(browser()); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->fullscreen_controller()->ToggleFullscreenMode(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter.Wait(false /* not locked */, true /* full screen */); 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(browser_window->IsFullscreen()); 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(window_state->hide_shelf_when_fullscreen()); 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Waiter waiter(browser()); 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ScreenLocker::Show(); 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) tester->EmulateWindowManagerReady(); 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) waiter.Wait(true /* locked */, true /* full screen */); 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(browser_window->IsFullscreen()); 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(window_state->hide_shelf_when_fullscreen()); 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) tester->InjectMockAuthenticator(UserManager::kStubUser, "pass"); 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) tester->EnterPassword("pass"); 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Waiter waiter(browser()); 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser()->fullscreen_controller()->ToggleFullscreenMode(); 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) waiter.Wait(false /* not locked */, false /* fullscreen */); 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(browser_window->IsFullscreen()); 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 2) If the active browser window is in fullscreen and the fullscreen window 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // has all of the pixels, locking the screen should exit fullscreen. The 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // fullscreen window has all of the pixels when in tab fullscreen. 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Waiter waiter(browser()); 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::WebContents* web_contents = 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser()->fullscreen_controller()->ToggleFullscreenModeForTab( 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_contents, true); 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) waiter.Wait(false /* not locked */, true /* fullscreen */); 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(browser_window->IsFullscreen()); 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(window_state->hide_shelf_when_fullscreen()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Waiter waiter(browser()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EmulateWindowManagerReady(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiter.Wait(true /* locked */, false /* full screen */); 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(browser_window->IsFullscreen()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->InjectMockAuthenticator(UserManager::kStubUser, "pass"); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->EnterPassword("pass"); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ( 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2, 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fake_session_manager_client_->notify_lock_screen_shown_call_count()); 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ( 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2, 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fake_session_manager_client_->notify_lock_screen_dismissed_call_count()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimulateKeyPress(views::Widget* widget, ui::KeyboardCode key_code) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::SendKeyPress(widget->GetNativeWindow(), 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code, false, false, false, false); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnlockKeyPress(views::Widget* widget) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateKeyPress(widget, ui::VKEY_SPACE); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestShowTwice) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockScreen(tester.get()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling Show again simply send LockCompleted signal. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Show(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester->IsLocked()); 266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ( 267b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2, 268b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) fake_session_manager_client_->notify_lock_screen_shown_call_count()); 269b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the locker to match expectations. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 275b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyLockScreenDismissed()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(flackr): Find out why the RenderView isn't getting the escape press 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and re-enable this test (currently this test is flaky). 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestEscape) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockScreen(tester.get()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 284b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ( 285b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1, 286b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) fake_session_manager_client_->notify_lock_screen_shown_call_count()); 287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester->SetPassword("password"); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("password", tester->GetPassword()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Escape clears the password. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateKeyPress(tester->GetWidget(), ui::VKEY_ESCAPE); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", tester->GetPassword()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the locker to match expectations. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::Hide(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester->IsLocked()); 299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(VerifyLockScreenDismissed()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 303