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

Side by Side 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: Rebased. 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/command_line.h"
6 #include "base/prefs/pref_service.h"
7 #include "base/timer/timer.h"
8 #include "chrome/browser/browser_process.h"
9 #include "chrome/browser/chrome_notification_types.h"
10 #include "chrome/browser/chromeos/input_method/input_method_persistence.h"
11 #include "chrome/browser/chromeos/language_preferences.h"
12 #include "chrome/browser/chromeos/login/login_manager_test.h"
13 #include "chrome/browser/chromeos/login/screenshot_tester.h"
14 #include "chrome/browser/chromeos/login/startup_utils.h"
15 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
16 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
17 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
18 #include "chrome/common/pref_names.h"
19 #include "chromeos/chromeos_switches.h"
20 #include "content/public/browser/browser_thread.h"
21 #include "content/public/browser/notification_observer.h"
22 #include "content/public/browser/notification_registrar.h"
23 #include "content/public/browser/notification_service.h"
24 #include "content/public/browser/notification_types.h"
dzhioev (left Google) 2014/09/23 11:05:39 Why do we need all this notifications_*.h included
Alexander Alekseev 2014/09/23 13:31:40 Done.
25 #include "content/public/test/test_utils.h"
26 #include "ui/compositor/compositor_switches.h"
27
28 namespace chromeos {
29
30 namespace {
31
32 const char kTestUser1[] = "test-user1@gmail.com";
33 const char kTestUser2[] = "test-user2@gmail.com";
34 const char kTestUser3[] = "test-user3@gmail.com";
35
36 class ENLocale {
dzhioev (left Google) 2014/09/23 11:05:39 nit: Why do we need a whole class for that? I thin
Alexander Alekseev 2014/09/23 13:31:40 Done.
37 public:
38 ENLocale() {
39 en_locale_input_methods_.push_back("xkb:us::eng");
40 en_locale_input_methods_.push_back("xkb:us:intl:eng");
41 en_locale_input_methods_.push_back("xkb:us:altgr-intl:eng");
42 en_locale_input_methods_.push_back("xkb:us:dvorak:eng");
43 en_locale_input_methods_.push_back("xkb:us:colemak:eng");
44 chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
dzhioev (left Google) 2014/09/23 11:05:38 Do we need to do a migration here? We are doing it
Alexander Alekseev 2014/09/23 13:31:40 I've removed Migration from tests.
45 &en_locale_input_methods_);
46 }
47
48 void AppendInputMethods(std::vector<std::string>* out) const {
49 out->insert(out->end(),
50 en_locale_input_methods_.begin(),
51 en_locale_input_methods_.end());
52 }
53
54 private:
55 std::vector<std::string> en_locale_input_methods_;
56 };
57
58 class FocusPODWaiter {
59 public:
60 FocusPODWaiter() : focused_(false), runner_(new content::MessageLoopRunner) {
61 GetOobeUI()
62 ->signin_screen_handler_for_test()
63 ->SetFocusPODCallbackForTesting(
64 base::Bind(&FocusPODWaiter::OnFocusPOD, base::Unretained(this)));
65 }
66 ~FocusPODWaiter() {
67 GetOobeUI()
68 ->signin_screen_handler_for_test()
69 ->SetFocusPODCallbackForTesting(base::Closure());
70 }
71
72 void OnFocusPOD() {
73 focused_ = true;
74 if (runner_.get())
75 base::MessageLoopForUI::current()->PostTask(
76 FROM_HERE,
77 base::Bind(&FocusPODWaiter::ExitMessageLoop, base::Unretained(this)));
78 }
79
80 void ExitMessageLoop() { runner_->Quit(); }
81
82 void Wait() {
83 if (focused_)
84 return;
85 runner_->Run();
86 GetOobeUI()
87 ->signin_screen_handler_for_test()
88 ->SetFocusPODCallbackForTesting(base::Closure());
89 runner_ = NULL;
90 }
91
92 private:
93 OobeUI* GetOobeUI() {
94 OobeUI* oobe_ui =
95 static_cast<chromeos::LoginDisplayHostImpl*>(
96 chromeos::LoginDisplayHostImpl::default_host())->GetOobeUI();
97 CHECK(oobe_ui);
98 return oobe_ui;
99 }
100
101 bool focused_;
102
103 scoped_refptr<content::MessageLoopRunner> runner_;
104 };
105
106 } // anonymous namespace
107
108 class LoginUIKeyboardTest : public chromeos::LoginManagerTest {
109 public:
110 LoginUIKeyboardTest() : LoginManagerTest(false) {}
111 virtual ~LoginUIKeyboardTest() {}
112
113 virtual void SetUpOnMainThread() OVERRIDE {
114 user_input_methods.push_back("xkb:fr::fra");
115 user_input_methods.push_back("xkb:de::ger");
116
117 chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
118 &user_input_methods);
119
120 en_locale.reset(new ENLocale);
dzhioev (left Google) 2014/09/23 11:05:38 Why not in constructor?
Alexander Alekseev 2014/09/23 13:31:40 Because of MigrateInputMethods.
121
122 LoginManagerTest::SetUpOnMainThread();
123 }
124
125 // Should be called from PRE_ test so that local_state is saved to disk, and
126 // reloaded in the main test.
127 void InitUserLRUInputMethod() {
128 PrefService* local_state = g_browser_process->local_state();
129
130 input_method::SetUserLRUInputMethodPreferenceForTesting(
131 kTestUser1, user_input_methods[0], local_state);
132 input_method::SetUserLRUInputMethodPreferenceForTesting(
133 kTestUser2, user_input_methods[1], local_state);
134 }
135
136 protected:
137 std::vector<std::string> user_input_methods;
dzhioev (left Google) 2014/09/23 11:05:39 Is this a mapping from user index to user's input
Alexander Alekseev 2014/09/23 13:31:40 Yes.
138 scoped_ptr<ENLocale> en_locale;
139 };
140
141 IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, PRE_CheckPODScreenDefault) {
142 RegisterUser(kTestUser1);
143 RegisterUser(kTestUser2);
144
145 StartupUtils::MarkOobeCompleted();
146 }
147
148 // Check default IME initialization, when there is no IME configuration in
149 // local_state.
150 IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, CheckPODScreenDefault) {
151 js_checker().ExpectEQ("$('pod-row').pods.length", 2);
152
153 std::vector<std::string> expected_input_methods;
154 en_locale->AppendInputMethods(&expected_input_methods);
155
156 const size_t expected_input_methods_number = expected_input_methods.size();
157 chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
158 &expected_input_methods);
159 EXPECT_EQ(expected_input_methods_number, expected_input_methods.size());
160
161 EXPECT_EQ(expected_input_methods,
162 input_method::InputMethodManager::Get()
163 ->GetActiveIMEState()
164 ->GetActiveInputMethodIds());
165 }
166
167 IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, PRE_CheckPODScreenWithUsers) {
168 RegisterUser(kTestUser1);
169 RegisterUser(kTestUser2);
170
171 InitUserLRUInputMethod();
172
173 StartupUtils::MarkOobeCompleted();
174 }
175
176 IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, CheckPODScreenWithUsers) {
177 js_checker().ExpectEQ("$('pod-row').pods.length", 2);
178
179 EXPECT_EQ(user_input_methods[0],
180 input_method::InputMethodManager::Get()
181 ->GetActiveIMEState()
182 ->GetCurrentInputMethod()
183 .id());
184
185 std::vector<std::string> expected_input_methods;
186 en_locale->AppendInputMethods(&expected_input_methods);
187 // Active IM for the first user (active user POD).
188 expected_input_methods.push_back(user_input_methods[0]);
189
190 const size_t expected_input_methods_number = expected_input_methods.size();
191 chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
192 &expected_input_methods);
193 EXPECT_EQ(expected_input_methods_number, expected_input_methods.size());
194
195 EXPECT_EQ(expected_input_methods,
196 input_method::InputMethodManager::Get()
197 ->GetActiveIMEState()
198 ->GetActiveInputMethodIds());
dzhioev (left Google) 2014/09/23 11:05:38 These lines (190-198) are repeated 4 times in this
Alexander Alekseev 2014/09/23 13:31:40 I've removed most of them.
199
200 FocusPODWaiter waiter;
201 js_checker().Evaluate("$('pod-row').focusPod($('pod-row').pods[1])");
202 waiter.Wait();
203
204 EXPECT_EQ(user_input_methods[1],
205 input_method::InputMethodManager::Get()
206 ->GetActiveIMEState()
207 ->GetCurrentInputMethod()
208 .id());
209 }
210
211 class LoginUIKeyboardTestWithUsersAndOwner : public chromeos::LoginManagerTest {
dzhioev (left Google) 2014/09/23 11:05:39 LoginUIKeyboardTestWithUsersAndOwner has a common
Alexander Alekseev 2014/09/23 13:31:40 user_input_methods are different. That is why clas
212 public:
213 LoginUIKeyboardTestWithUsersAndOwner() : LoginManagerTest(false) {}
214 virtual ~LoginUIKeyboardTestWithUsersAndOwner() {}
215
216 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
217 LoginManagerTest::SetUpCommandLine(command_line);
218 command_line->AppendSwitch(switches::kStubCrosSettings);
219
220 LoginManagerTest::SetUpCommandLine(command_line);
221 }
222
223 virtual void SetUpOnMainThread() OVERRIDE {
224 user_input_methods.push_back("xkb:fr::fra");
225 user_input_methods.push_back("xkb:de::ger");
226 user_input_methods.push_back("xkb:pl::pol");
227
228 chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
229 &user_input_methods);
230
231 CrosSettings::Get()->SetString(kDeviceOwner, kTestUser3);
232
233 en_locale.reset(new ENLocale);
234
235 LoginManagerTest::SetUpOnMainThread();
236 }
237
238 // Should be called from PRE_ test so that local_state is saved to disk, and
239 // reloaded in the main test.
240 void InitUserLRUInputMethod() {
241 PrefService* local_state = g_browser_process->local_state();
242
243 input_method::SetUserLRUInputMethodPreferenceForTesting(
244 kTestUser1, user_input_methods[0], local_state);
245 input_method::SetUserLRUInputMethodPreferenceForTesting(
246 kTestUser2, user_input_methods[1], local_state);
247 input_method::SetUserLRUInputMethodPreferenceForTesting(
248 kTestUser3, user_input_methods[2], local_state);
249
250 local_state->SetString(language_prefs::kPreferredKeyboardLayout,
251 user_input_methods[2]);
252 }
253
254 void CheckGaiaKeyboard();
255
256 protected:
257 std::vector<std::string> user_input_methods;
258 scoped_ptr<ENLocale> en_locale;
259 };
260
261 void LoginUIKeyboardTestWithUsersAndOwner::CheckGaiaKeyboard() {
262 std::vector<std::string> expected_input_methods;
263 // kPreferredKeyboardLayout is now set to last focused POD.
264 expected_input_methods.push_back(user_input_methods[0]);
265 // Locale default input methods (the first one also is hardware IM).
266 en_locale->AppendInputMethods(&expected_input_methods);
267
268 const size_t expected_input_methods_number = expected_input_methods.size();
269 chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
270 &expected_input_methods);
271 EXPECT_EQ(expected_input_methods_number, expected_input_methods.size());
272 scoped_refptr<input_method::InputMethodManager::State> ime_state =
273 input_method::InputMethodManager::Get()->GetActiveIMEState();
dzhioev (left Google) 2014/09/23 11:05:39 |ime_state| not used.
Alexander Alekseev 2014/09/23 13:31:40 Done.
274
275 EXPECT_EQ(expected_input_methods,
276 input_method::InputMethodManager::Get()
277 ->GetActiveIMEState()
278 ->GetActiveInputMethodIds());
279 }
280
281 IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTestWithUsersAndOwner,
282 PRE_CheckPODScreenKeyboard) {
283 RegisterUser(kTestUser1);
284 RegisterUser(kTestUser2);
285 RegisterUser(kTestUser3);
286
287 InitUserLRUInputMethod();
288
289 StartupUtils::MarkOobeCompleted();
290 }
291
292 IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTestWithUsersAndOwner,
293 CheckPODScreenKeyboard) {
294 js_checker().ExpectEQ("$('pod-row').pods.length", 3);
295
296 std::vector<std::string> expected_input_methods;
297 // Owner input method.
298 expected_input_methods.push_back(user_input_methods[2]);
299 // Locale default input methods (the first one also is hardware IM).
300 en_locale->AppendInputMethods(&expected_input_methods);
301 // Active IM for the first user (active user POD).
302 expected_input_methods.push_back(user_input_methods[0]);
303
304 const size_t expected_input_methods_number = expected_input_methods.size();
305 chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
306 &expected_input_methods);
307 EXPECT_EQ(expected_input_methods_number, expected_input_methods.size());
308
309 EXPECT_EQ(expected_input_methods,
310 input_method::InputMethodManager::Get()
311 ->GetActiveIMEState()
312 ->GetActiveInputMethodIds());
313
314 // Switch to Gaia.
315 js_checker().Evaluate("$('add-user-button').click()");
316 OobeScreenWaiter(OobeDisplay::SCREEN_GAIA_SIGNIN).Wait();
317 CheckGaiaKeyboard();
318
319 // Switch back.
320 js_checker().Evaluate("$('cancel-add-user-button').click()");
321 OobeScreenWaiter(OobeDisplay::SCREEN_ACCOUNT_PICKER).Wait();
322
323 EXPECT_EQ(expected_input_methods,
324 input_method::InputMethodManager::Get()
325 ->GetActiveIMEState()
326 ->GetActiveInputMethodIds());
327 }
328 } // namespace chromeos
OLDNEW
« 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