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 |