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

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

Issue 484353005: ChromeOS: "Add New User" screen should enable all hardware keyboards. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix tests. Created 6 years, 3 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/login_ui_keyboard_browsertest.cc
diff --git a/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0c74408b8c82bda708fcce06afef89f3b8df3c4f
--- /dev/null
+++ b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
@@ -0,0 +1,278 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/command_line.h"
+#include "base/prefs/pref_service.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/input_method/input_method_persistence.h"
+#include "chrome/browser/chromeos/language_preferences.h"
+#include "chrome/browser/chromeos/login/login_manager_test.h"
+#include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
+#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
+#include "chrome/common/pref_names.h"
+#include "chromeos/chromeos_switches.h"
+#include "content/public/test/test_utils.h"
+
+namespace chromeos {
+
+namespace {
+
+const char kTestUser1[] = "test-user1@gmail.com";
+const char kTestUser2[] = "test-user2@gmail.com";
+const char kTestUser3[] = "test-user3@gmail.com";
+
+void Append_en_US_InputMethods(std::vector<std::string>* out) {
+ out->push_back("xkb:us::eng");
+ out->push_back("xkb:us:intl:eng");
+ out->push_back("xkb:us:altgr-intl:eng");
+ out->push_back("xkb:us:dvorak:eng");
+ out->push_back("xkb:us:colemak:eng");
+ chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(out);
+}
+
+class FocusPODWaiter {
+ public:
+ FocusPODWaiter() : focused_(false), runner_(new content::MessageLoopRunner) {
+ GetOobeUI()
+ ->signin_screen_handler_for_test()
+ ->SetFocusPODCallbackForTesting(
+ base::Bind(&FocusPODWaiter::OnFocusPOD, base::Unretained(this)));
+ }
+ ~FocusPODWaiter() {
+ GetOobeUI()
+ ->signin_screen_handler_for_test()
+ ->SetFocusPODCallbackForTesting(base::Closure());
+ }
+
+ void OnFocusPOD() {
+ focused_ = true;
+ if (runner_.get())
+ base::MessageLoopForUI::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&FocusPODWaiter::ExitMessageLoop, base::Unretained(this)));
+ }
+
+ void ExitMessageLoop() { runner_->Quit(); }
+
+ void Wait() {
+ if (focused_)
+ return;
+ runner_->Run();
+ GetOobeUI()
+ ->signin_screen_handler_for_test()
+ ->SetFocusPODCallbackForTesting(base::Closure());
+ runner_ = NULL;
+ }
+
+ private:
+ OobeUI* GetOobeUI() {
+ OobeUI* oobe_ui =
+ static_cast<chromeos::LoginDisplayHostImpl*>(
+ chromeos::LoginDisplayHostImpl::default_host())->GetOobeUI();
+ CHECK(oobe_ui);
+ return oobe_ui;
+ }
+
+ bool focused_;
+
+ scoped_refptr<content::MessageLoopRunner> runner_;
+};
+
+} // anonymous namespace
+
+class LoginUIKeyboardTest : public chromeos::LoginManagerTest {
+ public:
+ LoginUIKeyboardTest() : LoginManagerTest(false) {}
+ virtual ~LoginUIKeyboardTest() {}
+
+ virtual void SetUpOnMainThread() OVERRIDE {
+ user_input_methods.push_back("xkb:fr::fra");
+ user_input_methods.push_back("xkb:de::ger");
+
+ chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
+ &user_input_methods);
+
+ LoginManagerTest::SetUpOnMainThread();
+ }
+
+ // Should be called from PRE_ test so that local_state is saved to disk, and
+ // reloaded in the main test.
+ void InitUserLRUInputMethod() {
+ PrefService* local_state = g_browser_process->local_state();
+
+ input_method::SetUserLRUInputMethodPreferenceForTesting(
+ kTestUser1, user_input_methods[0], local_state);
+ input_method::SetUserLRUInputMethodPreferenceForTesting(
+ kTestUser2, user_input_methods[1], local_state);
+ }
+
+ protected:
+ std::vector<std::string> user_input_methods;
+};
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, PRE_CheckPODScreenDefault) {
+ RegisterUser(kTestUser1);
+ RegisterUser(kTestUser2);
+
+ StartupUtils::MarkOobeCompleted();
+}
+
+// Check default IME initialization, when there is no IME configuration in
+// local_state.
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, CheckPODScreenDefault) {
+ js_checker().ExpectEQ("$('pod-row').pods.length", 2);
+
+ std::vector<std::string> expected_input_methods;
+ Append_en_US_InputMethods(&expected_input_methods);
+
+ EXPECT_EQ(expected_input_methods,
+ input_method::InputMethodManager::Get()
+ ->GetActiveIMEState()
+ ->GetActiveInputMethodIds());
+}
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, PRE_CheckPODScreenWithUsers) {
+ RegisterUser(kTestUser1);
+ RegisterUser(kTestUser2);
+
+ InitUserLRUInputMethod();
+
+ StartupUtils::MarkOobeCompleted();
+}
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, CheckPODScreenWithUsers) {
+ js_checker().ExpectEQ("$('pod-row').pods.length", 2);
+
+ EXPECT_EQ(user_input_methods[0],
+ input_method::InputMethodManager::Get()
+ ->GetActiveIMEState()
+ ->GetCurrentInputMethod()
+ .id());
+
+ std::vector<std::string> expected_input_methods;
+ Append_en_US_InputMethods(&expected_input_methods);
+ // Active IM for the first user (active user POD).
+ expected_input_methods.push_back(user_input_methods[0]);
+
+ EXPECT_EQ(expected_input_methods,
+ input_method::InputMethodManager::Get()
+ ->GetActiveIMEState()
+ ->GetActiveInputMethodIds());
+
+ FocusPODWaiter waiter;
+ js_checker().Evaluate("$('pod-row').focusPod($('pod-row').pods[1])");
+ waiter.Wait();
+
+ EXPECT_EQ(user_input_methods[1],
+ input_method::InputMethodManager::Get()
+ ->GetActiveIMEState()
+ ->GetCurrentInputMethod()
+ .id());
+}
+
+class LoginUIKeyboardTestWithUsersAndOwner : public chromeos::LoginManagerTest {
+ public:
+ LoginUIKeyboardTestWithUsersAndOwner() : LoginManagerTest(false) {}
+ virtual ~LoginUIKeyboardTestWithUsersAndOwner() {}
+
+ virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
+ LoginManagerTest::SetUpCommandLine(command_line);
+ command_line->AppendSwitch(switches::kStubCrosSettings);
+
+ LoginManagerTest::SetUpCommandLine(command_line);
+ }
+
+ virtual void SetUpOnMainThread() OVERRIDE {
+ user_input_methods.push_back("xkb:fr::fra");
+ user_input_methods.push_back("xkb:de::ger");
+ user_input_methods.push_back("xkb:pl::pol");
+
+ chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
+ &user_input_methods);
+
+ CrosSettings::Get()->SetString(kDeviceOwner, kTestUser3);
+
+ LoginManagerTest::SetUpOnMainThread();
+ }
+
+ // Should be called from PRE_ test so that local_state is saved to disk, and
+ // reloaded in the main test.
+ void InitUserLRUInputMethod() {
+ PrefService* local_state = g_browser_process->local_state();
+
+ input_method::SetUserLRUInputMethodPreferenceForTesting(
+ kTestUser1, user_input_methods[0], local_state);
+ input_method::SetUserLRUInputMethodPreferenceForTesting(
+ kTestUser2, user_input_methods[1], local_state);
+ input_method::SetUserLRUInputMethodPreferenceForTesting(
+ kTestUser3, user_input_methods[2], local_state);
+
+ local_state->SetString(language_prefs::kPreferredKeyboardLayout,
+ user_input_methods[2]);
+ }
+
+ void CheckGaiaKeyboard();
+
+ protected:
+ std::vector<std::string> user_input_methods;
+};
+
+void LoginUIKeyboardTestWithUsersAndOwner::CheckGaiaKeyboard() {
+ std::vector<std::string> expected_input_methods;
+ // kPreferredKeyboardLayout is now set to last focused POD.
+ expected_input_methods.push_back(user_input_methods[0]);
+ // Locale default input methods (the first one also is hardware IM).
+ Append_en_US_InputMethods(&expected_input_methods);
+
+ EXPECT_EQ(expected_input_methods,
+ input_method::InputMethodManager::Get()
+ ->GetActiveIMEState()
+ ->GetActiveInputMethodIds());
+}
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTestWithUsersAndOwner,
+ PRE_CheckPODScreenKeyboard) {
+ RegisterUser(kTestUser1);
+ RegisterUser(kTestUser2);
+ RegisterUser(kTestUser3);
+
+ InitUserLRUInputMethod();
+
+ StartupUtils::MarkOobeCompleted();
+}
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTestWithUsersAndOwner,
+ CheckPODScreenKeyboard) {
+ js_checker().ExpectEQ("$('pod-row').pods.length", 3);
+
+ std::vector<std::string> expected_input_methods;
+ // Owner input method.
+ expected_input_methods.push_back(user_input_methods[2]);
+ // Locale default input methods (the first one also is hardware IM).
+ Append_en_US_InputMethods(&expected_input_methods);
+ // Active IM for the first user (active user POD).
+ expected_input_methods.push_back(user_input_methods[0]);
+
+ EXPECT_EQ(expected_input_methods,
+ input_method::InputMethodManager::Get()
+ ->GetActiveIMEState()
+ ->GetActiveInputMethodIds());
+
+ // Switch to Gaia.
+ js_checker().Evaluate("$('add-user-button').click()");
+ OobeScreenWaiter(OobeDisplay::SCREEN_GAIA_SIGNIN).Wait();
+ CheckGaiaKeyboard();
+
+ // Switch back.
+ js_checker().Evaluate("$('cancel-add-user-button').click()");
+ OobeScreenWaiter(OobeDisplay::SCREEN_ACCOUNT_PICKER).Wait();
+
+ EXPECT_EQ(expected_input_methods,
+ input_method::InputMethodManager::Get()
+ ->GetActiveIMEState()
+ ->GetActiveInputMethodIds());
+}
+} // namespace chromeos
« no previous file with comments | « chrome/browser/chromeos/login/login_manager_test.h ('k') | chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698