11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/command_line.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/browser_process.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/input_method/input_method_persistence.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/language_preferences.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/login/login_manager_test.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/login/startup_utils.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/chromeos_switches.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_utils.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromeos {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTestUser1[] = "test-user1@gmail.com";
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTestUser2[] = "test-user2@gmail.com";
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTestUser3[] = "test-user3@gmail.com";
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Append_en_US_InputMethods(std::vector<std::string>* out) {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  out->push_back("xkb:us::eng");
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  out->push_back("xkb:us:intl:eng");
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  out->push_back("xkb:us:altgr-intl:eng");
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  out->push_back("xkb:us:dvorak:eng");
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  out->push_back("xkb:us:colemak:eng");
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(out);
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass FocusPODWaiter {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FocusPODWaiter() : focused_(false), runner_(new content::MessageLoopRunner) {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetOobeUI()
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->signin_screen_handler_for_test()
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->SetFocusPODCallbackForTesting(
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::Bind(&FocusPODWaiter::OnFocusPOD, base::Unretained(this)));
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ~FocusPODWaiter() {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetOobeUI()
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->signin_screen_handler_for_test()
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->SetFocusPODCallbackForTesting(base::Closure());
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnFocusPOD() {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    focused_ = true;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (runner_.get())
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::MessageLoopForUI::current()->PostTask(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          FROM_HERE,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(&FocusPODWaiter::ExitMessageLoop, base::Unretained(this)));
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ExitMessageLoop() { runner_->Quit(); }
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Wait() {
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (focused_)
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    runner_->Run();
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetOobeUI()
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->signin_screen_handler_for_test()
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->SetFocusPODCallbackForTesting(base::Closure());
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    runner_ = NULL;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OobeUI* GetOobeUI() {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OobeUI* oobe_ui =
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        static_cast<chromeos::LoginDisplayHostImpl*>(
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            chromeos::LoginDisplayHostImpl::default_host())->GetOobeUI();
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(oobe_ui);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return oobe_ui;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool focused_;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<content::MessageLoopRunner> runner_;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // anonymous namespace
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass LoginUIKeyboardTest : public chromeos::LoginManagerTest {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  LoginUIKeyboardTest() : LoginManagerTest(false) {}
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~LoginUIKeyboardTest() {}
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUpOnMainThread() OVERRIDE {
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_input_methods.push_back("xkb:fr::fra");
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_input_methods.push_back("xkb:de::ger");
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &user_input_methods);
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LoginManagerTest::SetUpOnMainThread();
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Should be called from PRE_ test so that local_state is saved to disk, and
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // reloaded in the main test.
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void InitUserLRUInputMethod() {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefService* local_state = g_browser_process->local_state();
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::SetUserLRUInputMethodPreferenceForTesting(
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kTestUser1, user_input_methods[0], local_state);
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::SetUserLRUInputMethodPreferenceForTesting(
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kTestUser2, user_input_methods[1], local_state);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> user_input_methods;
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, PRE_CheckPODScreenDefault) {
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RegisterUser(kTestUser1);
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RegisterUser(kTestUser2);
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartupUtils::MarkOobeCompleted();
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Check default IME initialization, when there is no IME configuration in
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// local_state.
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, CheckPODScreenDefault) {
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  js_checker().ExpectEQ("$('pod-row').pods.length", 2);
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> expected_input_methods;
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Append_en_US_InputMethods(&expected_input_methods);
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(expected_input_methods,
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input_method::InputMethodManager::Get()
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveIMEState()
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveInputMethodIds());
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, PRE_CheckPODScreenWithUsers) {
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RegisterUser(kTestUser1);
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RegisterUser(kTestUser2);
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitUserLRUInputMethod();
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartupUtils::MarkOobeCompleted();
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, CheckPODScreenWithUsers) {
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  js_checker().ExpectEQ("$('pod-row').pods.length", 2);
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(user_input_methods[0],
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input_method::InputMethodManager::Get()
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveIMEState()
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetCurrentInputMethod()
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                .id());
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> expected_input_methods;
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Append_en_US_InputMethods(&expected_input_methods);
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Active IM for the first user (active user POD).
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_input_methods.push_back(user_input_methods[0]);
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(expected_input_methods,
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input_method::InputMethodManager::Get()
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveIMEState()
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveInputMethodIds());
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FocusPODWaiter waiter;
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  js_checker().Evaluate("$('pod-row').focusPod($('pod-row').pods[1])");
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  waiter.Wait();
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(user_input_methods[1],
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input_method::InputMethodManager::Get()
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveIMEState()
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetCurrentInputMethod()
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                .id());
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass LoginUIKeyboardTestWithUsersAndOwner : public chromeos::LoginManagerTest {
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  LoginUIKeyboardTestWithUsersAndOwner() : LoginManagerTest(false) {}
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~LoginUIKeyboardTestWithUsersAndOwner() {}
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LoginManagerTest::SetUpCommandLine(command_line);
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    command_line->AppendSwitch(switches::kStubCrosSettings);
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LoginManagerTest::SetUpCommandLine(command_line);
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUpOnMainThread() OVERRIDE {
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_input_methods.push_back("xkb:fr::fra");
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_input_methods.push_back("xkb:de::ger");
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_input_methods.push_back("xkb:pl::pol");
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &user_input_methods);
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CrosSettings::Get()->SetString(kDeviceOwner, kTestUser3);
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LoginManagerTest::SetUpOnMainThread();
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Should be called from PRE_ test so that local_state is saved to disk, and
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // reloaded in the main test.
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void InitUserLRUInputMethod() {
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefService* local_state = g_browser_process->local_state();
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::SetUserLRUInputMethodPreferenceForTesting(
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kTestUser1, user_input_methods[0], local_state);
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::SetUserLRUInputMethodPreferenceForTesting(
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kTestUser2, user_input_methods[1], local_state);
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::SetUserLRUInputMethodPreferenceForTesting(
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kTestUser3, user_input_methods[2], local_state);
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    local_state->SetString(language_prefs::kPreferredKeyboardLayout,
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           user_input_methods[2]);
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void CheckGaiaKeyboard();
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> user_input_methods;
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid LoginUIKeyboardTestWithUsersAndOwner::CheckGaiaKeyboard() {
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> expected_input_methods;
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // kPreferredKeyboardLayout is now set to last focused POD.
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_input_methods.push_back(user_input_methods[0]);
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Locale default input methods (the first one also is hardware IM).
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Append_en_US_InputMethods(&expected_input_methods);
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(expected_input_methods,
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input_method::InputMethodManager::Get()
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveIMEState()
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveInputMethodIds());
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(LoginUIKeyboardTestWithUsersAndOwner,
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       PRE_CheckPODScreenKeyboard) {
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RegisterUser(kTestUser1);
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RegisterUser(kTestUser2);
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RegisterUser(kTestUser3);
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitUserLRUInputMethod();
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  StartupUtils::MarkOobeCompleted();
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(LoginUIKeyboardTestWithUsersAndOwner,
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       CheckPODScreenKeyboard) {
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  js_checker().ExpectEQ("$('pod-row').pods.length", 3);
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> expected_input_methods;
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Owner input method.
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_input_methods.push_back(user_input_methods[2]);
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Locale default input methods (the first one also is hardware IM).
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Append_en_US_InputMethods(&expected_input_methods);
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Active IM for the first user (active user POD).
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_input_methods.push_back(user_input_methods[0]);
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(expected_input_methods,
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input_method::InputMethodManager::Get()
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveIMEState()
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveInputMethodIds());
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Switch to Gaia.
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  js_checker().Evaluate("$('add-user-button').click()");
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OobeScreenWaiter(OobeDisplay::SCREEN_GAIA_SIGNIN).Wait();
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckGaiaKeyboard();
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Switch back.
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  js_checker().Evaluate("$('cancel-add-user-button').click()");
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OobeScreenWaiter(OobeDisplay::SCREEN_ACCOUNT_PICKER).Wait();
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(expected_input_methods,
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input_method::InputMethodManager::Get()
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveIMEState()
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->GetActiveInputMethodIds());
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace chromeos
279