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

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: Added browser test for login UI IM. 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..360e8bb8e3f4dcf33acedceb206263ad41911a85
--- /dev/null
+++ b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
@@ -0,0 +1,269 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
dzhioev (left Google) 2014/09/22 11:54:59 Do we have a test, where we move focus from one po
dzhioev (left Google) 2014/09/22 11:54:59 Use $('identifier') instead of document.querySelec
Alexander Alekseev 2014/09/22 19:44:57 Done.
Alexander Alekseev 2014/09/22 19:44:57 Done.
+// 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 "base/timer/timer.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_notification_types.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/screenshot_tester.h"
+#include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.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/browser/browser_thread.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
+#include "ui/compositor/compositor_switches.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 ReportInputMethodsDifference(const std::string& where,
dzhioev (left Google) 2014/09/22 11:54:59 I don't think this function is needed. Just overlo
Alexander Alekseev 2014/09/22 19:44:57 Done.
+ const std::vector<std::string>& expected) {
+ const std::vector<std::string>& actual =
+ input_method::InputMethodManager::Get()
+ ->GetActiveIMEState()
+ ->GetActiveInputMethodIds();
+ EXPECT_EQ(expected.size(), actual.size())
+ << where << ": Enexpected number of active input methods.";
+
+ for (size_t i = 0; i < std::max(expected.size(), actual.size()); ++i) {
+ if (i < std::min(expected.size(), actual.size())) {
+ EXPECT_EQ(expected[i], actual[i])
+ << where << ": Unexpected input method at index i=" << i << ".";
+ } else if (i < expected.size()) {
+ EXPECT_LT(i, actual.size())
+ << where << ": Expected active input method at index i=" << i
+ << " not found. Expected method='" << expected[i] << "'.";
+ } else {
+ EXPECT_LT(i, expected.size())
+ << where << ": Unexpected active input method at index i=" << i
+ << ". Found method='" << actual[i] << "'.";
+ }
+ }
+}
+
+} // 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) {
+ JSExpect("!!document.querySelector('#account-picker')");
+ JSExpect("!!document.querySelector('#pod-row')");
dzhioev (left Google) 2014/09/22 11:54:59 Please, remove these two lines from all test cases
Alexander Alekseev 2014/09/22 19:44:57 Done.
+ JSExpect(
+ "document.querySelectorAll('.pod:not(#user-pod-template)').length == 2");
dzhioev (left Google) 2014/09/22 11:54:59 "$('pod-row').pods.length == 2"
Alexander Alekseev 2014/09/22 19:44:57 Done.
+
+ std::vector<std::string> expected_input_methods;
+ expected_input_methods.push_back("xkb:us::eng");
+ expected_input_methods.push_back("xkb:us:intl:eng");
+ expected_input_methods.push_back("xkb:us:altgr-intl:eng");
+ expected_input_methods.push_back("xkb:us:dvorak:eng");
+ expected_input_methods.push_back("xkb:us:colemak:eng");
+ const size_t expected_input_methods_number = expected_input_methods.size();
+ chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
+ &expected_input_methods);
+ EXPECT_EQ(expected_input_methods_number, expected_input_methods.size());
+
+ ReportInputMethodsDifference("POD Screen Default", expected_input_methods);
+}
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, PRE_CheckPODScreenWithUsers) {
+ RegisterUser(kTestUser1);
+ RegisterUser(kTestUser2);
+
+ InitUserLRUInputMethod();
+
+ StartupUtils::MarkOobeCompleted();
+}
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, CheckPODScreenWithUsers) {
+ JSExpect("!!document.querySelector('#account-picker')");
+ JSExpect("!!document.querySelector('#pod-row')");
+ JSExpect(
+ "document.querySelectorAll('.pod:not(#user-pod-template)').length == 2");
+
+ std::vector<std::string> expected_input_methods;
+ expected_input_methods.push_back("xkb:us::eng");
+ expected_input_methods.push_back("xkb:us:intl:eng");
+ expected_input_methods.push_back("xkb:us:altgr-intl:eng");
+ expected_input_methods.push_back("xkb:us:dvorak:eng");
+ expected_input_methods.push_back("xkb:us:colemak:eng");
+ // Active IM for the first user (active user POD).
+ expected_input_methods.push_back(user_input_methods[0]);
+ const size_t expected_input_methods_number = expected_input_methods.size();
+ chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
+ &expected_input_methods);
+ EXPECT_EQ(expected_input_methods_number, expected_input_methods.size());
+
+ ReportInputMethodsDifference("POD Screen With Users", expected_input_methods);
+}
+
+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).
+ expected_input_methods.push_back("xkb:us::eng");
+ expected_input_methods.push_back("xkb:us:intl:eng");
+ expected_input_methods.push_back("xkb:us:altgr-intl:eng");
+ expected_input_methods.push_back("xkb:us:dvorak:eng");
+ expected_input_methods.push_back("xkb:us:colemak:eng");
dzhioev (left Google) 2014/09/22 11:54:59 You repeat these 5 lines many times in this file.
Alexander Alekseev 2014/09/22 19:44:57 Done.
+
+ const size_t expected_input_methods_number = expected_input_methods.size();
+ chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
+ &expected_input_methods);
+ EXPECT_EQ(expected_input_methods_number, expected_input_methods.size());
+ scoped_refptr<input_method::InputMethodManager::State> ime_state =
+ input_method::InputMethodManager::Get()->GetActiveIMEState();
+
+ ReportInputMethodsDifference("Gaia Keyboard", expected_input_methods);
+}
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTestWithUsersAndOwner,
+ PRE_CheckPODScreenKeyboard) {
+ RegisterUser(kTestUser1);
+ RegisterUser(kTestUser2);
+ RegisterUser(kTestUser3);
+
+ InitUserLRUInputMethod();
+
+ StartupUtils::MarkOobeCompleted();
+}
+
+IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTestWithUsersAndOwner,
+ CheckPODScreenKeyboard) {
+ JSExpect("!!document.querySelector('#account-picker')");
+ JSExpect("!!document.querySelector('#pod-row')");
+ JSExpect(
+ "document.querySelectorAll('.pod:not(#user-pod-template)').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).
+ expected_input_methods.push_back("xkb:us::eng");
+ expected_input_methods.push_back("xkb:us:intl:eng");
+ expected_input_methods.push_back("xkb:us:altgr-intl:eng");
+ expected_input_methods.push_back("xkb:us:dvorak:eng");
+ expected_input_methods.push_back("xkb:us:colemak:eng");
+ // Active IM for the first user (active user POD).
+ expected_input_methods.push_back(user_input_methods[0]);
+
+ const size_t expected_input_methods_number = expected_input_methods.size();
+ chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
+ &expected_input_methods);
+ EXPECT_EQ(expected_input_methods_number, expected_input_methods.size());
+
+ ReportInputMethodsDifference("TestWithUsersAndOwner", expected_input_methods);
+
+ // Switch to Gaia.
+ js_checker().Evaluate("document.querySelector('#add-user-button').click()");
+ OobeScreenWaiter(OobeDisplay::SCREEN_GAIA_SIGNIN).Wait();
+ CheckGaiaKeyboard();
+
+ // Switch back.
+ js_checker().Evaluate(
+ "document.querySelector('#cancel-add-user-button').click()");
+ OobeScreenWaiter(OobeDisplay::SCREEN_ACCOUNT_PICKER).Wait();
+
+ ReportInputMethodsDifference("Account Picker after cancelling Gaia",
+ expected_input_methods);
+}
+} // 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