Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(590)

Unified Diff: chrome/browser/chromeos/login/screen_locker_browsertest.cc

Issue 2832063: Exit Fullscreen when screen is locked (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: minor change to fix edge case. Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/login/screen_locker_browsertest.cc
diff --git a/chrome/browser/chromeos/login/screen_locker_browsertest.cc b/chrome/browser/chromeos/login/screen_locker_browsertest.cc
index 48a8ff8f925149694f2aa83ddcfb1a7571056796..bad841f712738aa0e4702d6e428605c392e66bf5 100644
--- a/chrome/browser/chromeos/login/screen_locker_browsertest.cc
+++ b/chrome/browser/chromeos/login/screen_locker_browsertest.cc
@@ -5,6 +5,8 @@
#include "base/message_loop.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/automation/ui_controls.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_window.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/chromeos/cros/cros_in_process_browser_test.h"
#include "chrome/browser/chromeos/cros/mock_screen_lock_library.h"
@@ -15,11 +17,74 @@
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/views/browser_dialogs.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/notification_service.h"
#include "chrome/common/notification_type.h"
#include "chrome/test/ui_test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "views/controls/textfield/textfield.h"
+#include "views/window/window_gtk.h"
+
+namespace {
+
+// An object that wait for lock state and fullscreen state.
+class Waiter : public NotificationObserver {
+ public:
+ Waiter(Browser* browser)
+ : browser_(browser) {
+ registrar_.Add(this,
+ NotificationType::SCREEN_LOCK_STATE_CHANGED,
+ NotificationService::AllSources());
+ handler_id_ = g_signal_connect(
+ G_OBJECT(browser_->window()->GetNativeHandle()),
+ "window-state-event",
+ G_CALLBACK(OnWindowStateEventThunk),
+ this);
+ }
+
+ ~Waiter() {
+ g_signal_handler_disconnect(
+ G_OBJECT(browser_->window()->GetNativeHandle()),
+ handler_id_);
+ }
+
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ DCHECK(type == NotificationType::SCREEN_LOCK_STATE_CHANGED);
+ MessageLoop::current()->Quit();
+ }
+
+ // Wait until the two conditions are met.
+ void Wait(bool locker_state, bool fullscreen) {
+ scoped_ptr<chromeos::test::ScreenLockerTester>
+ tester(chromeos::ScreenLocker::GetTester());
+ while (tester->IsLocked() != locker_state ||
+ browser_->window()->IsFullscreen() != fullscreen) {
+ ui_test_utils::RunMessageLoop();
+ }
+ // Make sure all pending tasks are executed.
+ ui_test_utils::RunAllPendingInMessageLoop();
+ }
+
+ CHROMEGTK_CALLBACK_1(Waiter, gboolean, OnWindowStateEvent,
+ GdkEventWindowState*);
+
+ private:
+ Browser* browser_;
+ gulong handler_id_;
+ NotificationRegistrar registrar_;
+
+ DISALLOW_COPY_AND_ASSIGN(Waiter);
+};
+
+gboolean Waiter::OnWindowStateEvent(GtkWidget* widget,
+ GdkEventWindowState* event) {
+ MessageLoop::current()->Quit();
+ return false;
+}
+
+} // namespace
namespace chromeos {
@@ -38,18 +103,18 @@ class ScreenLockerTest : public CrosInProcessBrowserTest {
tester->EmulateWindowManagerReady();
ui_test_utils::WaitForNotification(
NotificationType::SCREEN_LOCK_STATE_CHANGED);
- EXPECT_TRUE(tester->IsOpen());
+ EXPECT_TRUE(tester->IsLocked());
tester->InjectMockAuthenticator("", "");
unlock(tester->GetWidget());
ui_test_utils::RunAllPendingInMessageLoop();
- EXPECT_TRUE(tester->IsOpen());
+ EXPECT_TRUE(tester->IsLocked());
// Emulate LockScreen request from PowerManager (via SessionManager).
ScreenLocker::Hide();
ui_test_utils::RunAllPendingInMessageLoop();
- EXPECT_FALSE(tester->IsOpen());
+ EXPECT_FALSE(tester->IsLocked());
}
private:
@@ -95,20 +160,45 @@ IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestBasic) {
NotificationType::SCREEN_LOCK_STATE_CHANGED);
tester->InjectMockAuthenticator("user", "pass");
- EXPECT_TRUE(tester->IsOpen());
+ EXPECT_TRUE(tester->IsLocked());
tester->EnterPassword("fail");
ui_test_utils::RunAllPendingInMessageLoop();
- EXPECT_TRUE(tester->IsOpen());
+ EXPECT_TRUE(tester->IsLocked());
tester->EnterPassword("pass");
ui_test_utils::RunAllPendingInMessageLoop();
// Successful authentication simply send a unlock request to PowerManager.
- EXPECT_TRUE(tester->IsOpen());
+ EXPECT_TRUE(tester->IsLocked());
// Emulate LockScreen request from PowerManager (via SessionManager).
// TODO(oshima): Find out better way to handle this in mock.
ScreenLocker::Hide();
ui_test_utils::RunAllPendingInMessageLoop();
- EXPECT_FALSE(tester->IsOpen());
+ EXPECT_FALSE(tester->IsLocked());
+}
+
+IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestFullscreenExit) {
+ scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
+ {
+ Waiter waiter(browser());
+ browser()->ToggleFullscreenMode();
+ waiter.Wait(false /* not locked */, true /* full screen */);
+ EXPECT_TRUE(browser()->window()->IsFullscreen());
+ EXPECT_FALSE(tester->IsLocked());
+ }
+ {
+ Waiter waiter(browser());
+ UserManager::Get()->UserLoggedIn("user");
+ ScreenLocker::Show();
+ tester->EmulateWindowManagerReady();
+ waiter.Wait(true /* locked */, false /* full screen */);
+ EXPECT_FALSE(browser()->window()->IsFullscreen());
+ EXPECT_TRUE(tester->IsLocked());
+ }
+ tester->InjectMockAuthenticator("user", "pass");
+ tester->EnterPassword("pass");
+ ScreenLocker::Hide();
+ ui_test_utils::RunAllPendingInMessageLoop();
+ EXPECT_FALSE(tester->IsLocked());
}
void MouseMove(views::Widget* widget) {
« no previous file with comments | « chrome/browser/chromeos/login/screen_locker.cc ('k') | chrome/browser/chromeos/login/screen_locker_tester.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698