Chromium Code Reviews| Index: chrome/browser/chromeos/policy/device_local_account_browsertest.cc |
| diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc |
| index 8d79f63f40a2ec56ee3f87b147139cd535cd3315..8fffa2cfa8b8ca5f102b406f4916198eaf918bbf 100644 |
| --- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc |
| +++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc |
| @@ -4,6 +4,7 @@ |
| #include <map> |
| #include <string> |
| +#include <vector> |
| #include "apps/app_window_registry.h" |
| #include "apps/ui/native_app_window.h" |
| @@ -39,6 +40,7 @@ |
| #include "chrome/browser/chrome_notification_types.h" |
| #include "chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.h" |
| #include "chrome/browser/chromeos/extensions/external_cache.h" |
| +#include "chrome/browser/chromeos/input_method/input_method_util.h" |
| #include "chrome/browser/chromeos/login/existing_user_controller.h" |
| #include "chrome/browser/chromeos/login/screens/wizard_screen.h" |
| #include "chrome/browser/chromeos/login/ui/login_display_host.h" |
| @@ -99,6 +101,7 @@ |
| #include "components/signin/core/common/signin_pref_names.h" |
| #include "components/user_manager/user.h" |
| #include "components/user_manager/user_type.h" |
| +#include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/notification_details.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/notification_source.h" |
| @@ -172,6 +175,15 @@ const char kPackagedAppCRXPath[] = "extensions/platform_apps/app_window_2.crx"; |
| const char kExternalData[] = "External data"; |
| const char kExternalDataURL[] = "http://localhost/external_data"; |
| +const char* kRecommendedLocales1[] = { |
| + "pl", |
| + "et", |
| + "en-US", |
| +}; |
| +const char* kRecommendedLocales2[] = { |
| + "fr", |
| + "nl", |
| +}; |
| const char kPublicSessionLocale[] = "de"; |
| const char kPublicSessionInputMethodIDTemplate[] = "_comp_ime_%sxkb:de:neo:ger"; |
| @@ -491,6 +503,17 @@ class DeviceLocalAccountTest : public DevicePolicyCrosBrowserTest, |
| std::string(), proto.SerializeAsString()); |
| } |
| + void EnableAutoLogin() { |
| + em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); |
| + em::DeviceLocalAccountsProto* device_local_accounts = |
| + proto.mutable_device_local_accounts(); |
| + device_local_accounts->set_auto_login_id(kAccountId1); |
| + device_local_accounts->set_auto_login_delay(0); |
| + RefreshDevicePolicy(); |
| + test_server_.UpdatePolicy(dm_protocol::kChromeDevicePolicyType, |
| + std::string(), proto.SerializeAsString()); |
| + } |
| + |
| void CheckPublicSessionPresent(const std::string& id) { |
| const user_manager::User* user = chromeos::UserManager::Get()->FindUser(id); |
| ASSERT_TRUE(user); |
| @@ -522,6 +545,21 @@ class DeviceLocalAccountTest : public DevicePolicyCrosBrowserTest, |
| return ProfileManager::GetActiveUserProfile(); |
| } |
| + content::WebContents* GetWebContents() { |
| + chromeos::LoginDisplayHostImpl* host = |
| + reinterpret_cast<chromeos::LoginDisplayHostImpl*>( |
| + chromeos::LoginDisplayHostImpl::default_host()); |
| + if (!host) |
| + return NULL; |
| + chromeos::WebUILoginView* web_ui_login_view = host->GetWebUILoginView(); |
| + if (!web_ui_login_view) |
| + return NULL; |
| + content::WebUI* web_ui = web_ui_login_view->GetWebUI(); |
| + if (!web_ui) |
| + return NULL; |
| + return web_ui->GetWebContents(); |
| + } |
| + |
| void WaitForDisplayName(const std::string& user_id, |
| const std::string& expected_display_name) { |
| DictionaryPrefValueWaiter("UserDisplayName", |
| @@ -576,6 +614,30 @@ class DeviceLocalAccountTest : public DevicePolicyCrosBrowserTest, |
| base::Bind(IsSessionStarted)).Wait(); |
| } |
| + void SkipToLoginScreen() { |
| + chromeos::WizardController* wizard_controller = |
| + chromeos::WizardController::default_controller(); |
| + ASSERT_TRUE(wizard_controller); |
|
pneubeck (no reviews)
2014/07/30 15:23:19
just FYI: ASSERTs in functions only skip the rest
bartfab (slow)
2014/08/05 17:16:23
That's why I use ASSERT_NO_FATAL_FAILURE().
|
| + wizard_controller->SkipToLoginForTesting(LoginScreenContext()); |
| + content::WindowedNotificationObserver( |
| + chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, |
| + content::NotificationService::AllSources()).Wait(); |
| + } |
| + |
| + void VerifyKeyboardLayoutMatchesLocale() { |
| + chromeos::input_method::InputMethodManager* input_method_manager = |
| + chromeos::input_method::InputMethodManager::Get(); |
| + std::vector<std::string> layouts_from_locale; |
| + input_method_manager->GetInputMethodUtil()-> |
|
pneubeck (no reviews)
2014/07/30 17:55:44
I don't know how the logic for selecting the keybo
bartfab (slow)
2014/08/05 17:16:24
This is exactly the production function that the U
|
| + GetInputMethodIdsFromLanguageCode( |
| + g_browser_process->GetApplicationLocale(), |
| + chromeos::input_method::kKeyboardLayoutsOnly, |
| + &layouts_from_locale); |
| + ASSERT_FALSE(layouts_from_locale.empty()); |
| + EXPECT_EQ(layouts_from_locale.front(), |
| + input_method_manager->GetCurrentInputMethod().id()); |
| + } |
| + |
| const std::string user_id_1_; |
| const std::string user_id_2_; |
| const std::string public_session_input_method_id_; |
| @@ -611,26 +673,10 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DisplayName) { |
| AddPublicSessionToDevicePolicy(kAccountId1); |
| WaitForPolicy(); |
| - |
| - // Skip to the login screen. |
| - chromeos::WizardController* wizard_controller = |
| - chromeos::WizardController::default_controller(); |
| - ASSERT_TRUE(wizard_controller); |
| - wizard_controller->SkipToLoginForTesting(LoginScreenContext()); |
| - content::WindowedNotificationObserver( |
| - chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, |
| - content::NotificationService::AllSources()).Wait(); |
| + ASSERT_NO_FATAL_FAILURE(SkipToLoginScreen()); |
| // Verify that the display name is shown in the UI. |
| - chromeos::LoginDisplayHostImpl* host = |
| - reinterpret_cast<chromeos::LoginDisplayHostImpl*>( |
| - chromeos::LoginDisplayHostImpl::default_host()); |
| - ASSERT_TRUE(host); |
| - chromeos::WebUILoginView* web_ui_login_view = host->GetWebUILoginView(); |
| - ASSERT_TRUE(web_ui_login_view); |
| - content::WebUI* web_ui = web_ui_login_view->GetWebUI(); |
| - ASSERT_TRUE(web_ui); |
| - content::WebContents* contents = web_ui->GetWebContents(); |
| + content::WebContents* contents = GetWebContents(); |
| ASSERT_TRUE(contents); |
| const std::string get_compact_pod_display_name = base::StringPrintf( |
| "domAutomationController.send(document.getElementById('pod-row')" |
| @@ -1295,43 +1341,258 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, LastWindowClosedLogoutReminder) { |
| app_window_registry->RemoveObserver(this); |
| }; |
| -IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DoNotSelectLanguageAndKeyboard) { |
| - chromeos::input_method::InputMethodManager* input_method_manager = |
| - chromeos::input_method::InputMethodManager::Get(); |
| +IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, NoRecommendedLocale) { |
|
pneubeck (no reviews)
2014/07/30 15:39:23
is this case different from no locale policy being
bartfab (slow)
2014/08/05 17:16:24
There was no test verifying that scenario. I added
|
| const std::string initial_locale = g_browser_process->GetApplicationLocale(); |
| - const std::string initial_input_method = |
| - input_method_manager->GetCurrentInputMethod().id(); |
| UploadAndInstallDeviceLocalAccountPolicy(); |
| AddPublicSessionToDevicePolicy(kAccountId1); |
| WaitForPolicy(); |
| - ASSERT_NO_FATAL_FAILURE(WaitForLoginUI()); |
| - ASSERT_NO_FATAL_FAILURE(StartLogin(std::string(), std::string())); |
| + ASSERT_NO_FATAL_FAILURE(SkipToLoginScreen()); |
| + |
| + // Click on the pod to expand it. Verify that the pod expands to its basic |
| + // form as there are no recommended locales. |
| + content::WebContents* contents = GetWebContents(); |
| + ASSERT_TRUE(contents); |
| + bool advanced = false; |
| + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
| + contents, |
| + base::StringPrintf( |
| + "var pod =" |
| + " document.getElementById('pod-row').getPodWithUsername_('%s');" |
| + "pod.click();" |
| + "domAutomationController.send(pod.classList.contains('advanced'));", |
| + user_id_1_.c_str()), |
| + &advanced)); |
| + EXPECT_FALSE(advanced); |
| + |
| + // Click the enter button to start the session. |
| + ASSERT_TRUE(content::ExecuteScript( |
| + contents, |
| + base::StringPrintf( |
| + "document.getElementById('pod-row').getPodWithUsername_('%s')" |
| + " .querySelector('.enter-button').click();", |
| + user_id_1_.c_str()))); |
| + |
| WaitForSessionStart(); |
| + // Verify that the locale has not changed and the first keyboard layout |
| + // applicable to the locale was chosen. |
| EXPECT_EQ(initial_locale, g_browser_process->GetApplicationLocale()); |
| - EXPECT_EQ(initial_input_method, |
| - input_method_manager->GetCurrentInputMethod().id()); |
| + VerifyKeyboardLayoutMatchesLocale(); |
| } |
| -IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, SelectLanguageAndKeyboard) { |
| - // Specify startup pages. |
| - device_local_account_policy_.payload().mutable_restoreonstartup()->set_value( |
| - SessionStartupPref::kPrefValueURLs); |
| - em::StringListPolicyProto* startup_urls_proto = |
| - device_local_account_policy_.payload().mutable_restoreonstartupurls(); |
| - for (size_t i = 0; i < arraysize(kStartupURLs); ++i) |
| - startup_urls_proto->mutable_value()->add_entries(kStartupURLs[i]); |
| +IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, OneRecommendedLocale) { |
| + // Specify a recommended locale. |
| + em::StringListPolicyProto* session_locales_proto = |
| + device_local_account_policy_.payload().mutable_sessionlocales(); |
| + session_locales_proto->mutable_policy_options()->set_mode( |
| + em::PolicyOptions_PolicyMode_RECOMMENDED); |
| + session_locales_proto->mutable_value()->add_entries(kRecommendedLocales1[0]); |
|
pneubeck (no reviews)
2014/07/30 17:55:44
instead of using the unrelated kRecommendedLocales
bartfab (slow)
2014/08/05 17:16:24
Done.
|
| UploadAndInstallDeviceLocalAccountPolicy(); |
| AddPublicSessionToDevicePolicy(kAccountId1); |
| - // Log in to the device-local account with a specific locale and keyboard |
| - // layout. |
| WaitForPolicy(); |
| - ASSERT_NO_FATAL_FAILURE(WaitForLoginUI()); |
| - ASSERT_NO_FATAL_FAILURE( |
| - StartLogin(kPublicSessionLocale, public_session_input_method_id_)); |
| + ASSERT_NO_FATAL_FAILURE(SkipToLoginScreen()); |
| + |
| + // Click on the pod to expand it. Verify that the pod expands to its basic |
| + // form as there is only one recommended locale. |
| + content::WebContents* contents = GetWebContents(); |
| + ASSERT_TRUE(contents); |
| + bool advanced = false; |
| + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
| + contents, |
| + base::StringPrintf( |
| + "var pod =" |
| + " document.getElementById('pod-row').getPodWithUsername_('%s');" |
| + "pod.click();" |
| + "domAutomationController.send(pod.classList.contains('advanced'));", |
| + user_id_1_.c_str()), |
| + &advanced)); |
| + EXPECT_FALSE(advanced); |
| + |
| + // Click the enter button to start the session. |
| + ASSERT_TRUE(content::ExecuteScript( |
| + contents, |
| + base::StringPrintf( |
| + "document.getElementById('pod-row').getPodWithUsername_('%s')" |
| + " .querySelector('.enter-button').click();", |
| + user_id_1_.c_str()))); |
| + |
| + WaitForSessionStart(); |
| + |
| + // Verify that the recommended locale has been applied and the first keyboard |
| + // layout applicable to the locale was chosen. |
| + EXPECT_EQ(kRecommendedLocales1[0], g_browser_process->GetApplicationLocale()); |
| + VerifyKeyboardLayoutMatchesLocale(); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, MultipleRecommendedLocales) { |
|
pneubeck (no reviews)
2014/07/30 17:55:44
can the user also minify the pod after expanding?
bartfab (slow)
2014/08/05 17:16:23
Yes, the pod will contract if it loses focus. The
|
| + // Specify recommended locales. |
| + em::StringListPolicyProto* session_locales_proto = |
|
pneubeck (no reviews)
2014/07/30 17:55:44
the setting of the locales could be in helper func
bartfab (slow)
2014/08/05 17:16:24
Done.
|
| + device_local_account_policy_.payload().mutable_sessionlocales(); |
| + session_locales_proto->mutable_policy_options()->set_mode( |
| + em::PolicyOptions_PolicyMode_RECOMMENDED); |
| + for (size_t i = 0; i < arraysize(kRecommendedLocales1); ++i) { |
| + session_locales_proto->mutable_value()->add_entries( |
| + kRecommendedLocales1[i]); |
| + } |
| + UploadAndInstallDeviceLocalAccountPolicy(); |
| + AddPublicSessionToDevicePolicy(kAccountId1); |
| + |
| + WaitForPolicy(); |
| + ASSERT_NO_FATAL_FAILURE(SkipToLoginScreen()); |
| + |
| + // Verify that the pod shows a list of locales beginning with the recommended |
| + // ones, followed by others. |
| + content::WebContents* contents = GetWebContents(); |
| + ASSERT_TRUE(contents); |
| + const std::string get_locale_list = base::StringPrintf( |
| + "var languageSelect = document.getElementById('pod-row')" |
| + " .getPodWithUsername_('%s').querySelector('.language-select');" |
| + "var locales = [];" |
| + "for (var i = 0; i < languageSelect.length; ++i)" |
| + " locales.push(languageSelect.options[i].value);" |
| + "domAutomationController.send(JSON.stringify(locales));", |
| + user_id_1_.c_str()); |
| + std::string json; |
| + ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, |
| + get_locale_list, |
| + &json)); |
| + scoped_ptr<base::Value> value_ptr(base::JSONReader::Read(json)); |
| + const base::ListValue* locales = NULL; |
| + ASSERT_TRUE(value_ptr); |
| + ASSERT_TRUE(value_ptr->GetAsList(&locales)); |
| + EXPECT_LT(arraysize(kRecommendedLocales1), locales->GetSize()); |
| + for (size_t i = 0; i < arraysize(kRecommendedLocales1); ++i) { |
| + std::string locale; |
| + EXPECT_TRUE(locales->GetString(i, &locale)); |
| + EXPECT_EQ(kRecommendedLocales1[i], locale); |
| + } |
| + |
| + // Verify that the first recommended locale is selected. |
|
pneubeck (no reviews)
2014/07/30 15:39:23
It's irritating that you're testing this before th
bartfab (slow)
2014/08/05 17:16:23
Done.
|
| + const std::string get_selected_locale = |
| + base::StringPrintf( |
|
pneubeck (no reviews)
2014/07/30 15:39:23
This block and the next together should test:
- f
bartfab (slow)
2014/08/05 17:16:23
My test verifies this but the focus is slightly di
|
| + "domAutomationController.send(document.getElementById('pod-row')" |
| + " .getPodWithUsername_('%s').querySelector('.language-select')" |
| + " .value);", |
| + user_id_1_.c_str()); |
| + std::string selected_locale; |
| + ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, |
| + get_selected_locale, |
| + &selected_locale)); |
| + EXPECT_EQ(kRecommendedLocales1[0], selected_locale); |
| + |
| + // Click on the pod to expand it. Verify that the pod expands to its advanced |
| + // form directly as there are two or more recommended locales. |
|
pneubeck (no reviews)
2014/07/30 15:39:23
nit: "as there are more than two"
bartfab (slow)
2014/08/05 17:16:24
No, "two or more" is correct. The advanced pod is
|
| + bool advanced = false; |
| + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
| + contents, |
| + base::StringPrintf( |
| + "var pod =" |
| + " document.getElementById('pod-row').getPodWithUsername_('%s');" |
| + "pod.click();" |
| + "domAutomationController.send(pod.classList.contains('advanced'));", |
| + user_id_1_.c_str()), |
| + &advanced)); |
| + EXPECT_TRUE(advanced); |
| + |
| + // Change the list of recommended locales. |
| + session_locales_proto->mutable_value()->Clear(); |
| + for (size_t i = 0; i < arraysize(kRecommendedLocales2); ++i) { |
| + session_locales_proto->mutable_value()->add_entries( |
| + kRecommendedLocales2[i]); |
| + } |
|
pneubeck (no reviews)
2014/07/30 15:39:23
nit: empty line after this one.
bartfab (slow)
2014/08/05 17:16:23
Done.
|
| + // Also change the display name as it is easy to ensure that policy has been |
| + // updated by waiting for a display name change. |
| + device_local_account_policy_.payload().mutable_userdisplayname()->set_value( |
| + kDisplayName2); |
| + UploadAndInstallDeviceLocalAccountPolicy(); |
| + policy::BrowserPolicyConnectorChromeOS* connector = |
| + g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
| + DeviceLocalAccountPolicyBroker* broker = |
| + connector->GetDeviceLocalAccountPolicyService()->GetBrokerForUser( |
| + user_id_1_); |
| + ASSERT_TRUE(broker); |
| + broker->core()->store()->Load(); |
| + WaitForDisplayName(user_id_1_, kDisplayName2); |
| + |
| + // Verify that the new list of locales is shown in the UI. |
| + ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, |
| + get_locale_list, |
| + &json)); |
| + value_ptr.reset(base::JSONReader::Read(json)); |
|
pneubeck (no reviews)
2014/07/30 17:55:44
if this code part (JSONReader -> cast to concrete
bartfab (slow)
2014/08/05 17:16:23
I do such a conversion three times in this file. I
|
| + locales = NULL; |
| + ASSERT_TRUE(value_ptr); |
| + ASSERT_TRUE(value_ptr->GetAsList(&locales)); |
| + EXPECT_LT(arraysize(kRecommendedLocales2), locales->GetSize()); |
| + for (size_t i = 0; i < arraysize(kRecommendedLocales2); ++i) { |
| + std::string locale; |
| + EXPECT_TRUE(locales->GetString(i, &locale)); |
| + EXPECT_EQ(kRecommendedLocales2[i], locale); |
| + } |
| + |
| + // Verify that the first new recommended locale is selected. |
| + ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, |
| + get_selected_locale, |
| + &selected_locale)); |
| + EXPECT_EQ(kRecommendedLocales2[0], selected_locale); |
| + |
| + // Manually select a different locale. |
| + ASSERT_TRUE(content::ExecuteScript( |
| + contents, |
| + base::StringPrintf( |
| + "var languageSelect = document.getElementById('pod-row')" |
| + " .getPodWithUsername_('%s').querySelector('.language-select');" |
| + "languageSelect.value = '%s';" |
| + "var event = document.createEvent('HTMLEvents');" |
| + "event.initEvent('change', false, true);" |
| + "languageSelect.dispatchEvent(event);", |
| + user_id_1_.c_str(), |
| + kPublicSessionLocale))); |
| + |
| + // Change the list of recommended locales. |
| + session_locales_proto->mutable_value()->Clear(); |
| + for (size_t i = 0; i < arraysize(kRecommendedLocales1); ++i) { |
| + session_locales_proto->mutable_value()->add_entries( |
| + kRecommendedLocales1[i]); |
| + } |
| + device_local_account_policy_.payload().mutable_userdisplayname()->set_value( |
| + kDisplayName1); |
| + UploadAndInstallDeviceLocalAccountPolicy(); |
| + broker->core()->store()->Load(); |
| + WaitForDisplayName(user_id_1_, kDisplayName1); |
| + |
| + // Verify that the first manually selected locale is still selected. |
|
pneubeck (no reviews)
2014/07/30 17:55:44
what means 'the first manually selected' ?
Can the
bartfab (slow)
2014/08/05 17:16:24
Oops, typo. Removed the "first".
|
| + ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, |
| + get_selected_locale, |
| + &selected_locale)); |
| + EXPECT_EQ(kPublicSessionLocale, selected_locale); |
| + |
| + // The UI will have requested an updated list of keyboard layouts at this |
|
pneubeck (no reviews)
2014/07/30 17:55:44
nit: move to a helper "FlushFileThread"
bartfab (slow)
2014/08/05 17:16:23
Done.
|
| + // point. Flush the FILE and UI thread loops to allow the process that |
| + // constructs this list to complete. |
| + base::RunLoop run_loop; |
| + content::BrowserThread::PostTaskAndReply( |
| + content::BrowserThread::FILE, |
| + FROM_HERE, |
| + base::Bind(&base::DoNothing), |
| + run_loop.QuitClosure()); |
| + run_loop.Run(); |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + // Manually select a different keyboard layout and click the enter button to |
| + // start the session. |
| + ASSERT_TRUE(content::ExecuteScript( |
| + contents, |
| + base::StringPrintf( |
| + "var pod =" |
| + " document.getElementById('pod-row').getPodWithUsername_('%s');" |
| + "pod.querySelector('.keyboard-select').value = '%s';" |
| + "pod.querySelector('.enter-button').click();", |
| + user_id_1_.c_str(), |
| + public_session_input_method_id_.c_str()))); |
| + |
| WaitForSessionStart(); |
| // Verify that the locale and keyboard layout have been applied. |
|
pneubeck (no reviews)
2014/07/30 17:55:44
'Verify that the manually selected ...'
Hm. Is th
bartfab (slow)
2014/08/05 17:16:24
There are several places where you can pick the lo
|
| @@ -1342,7 +1603,51 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, SelectLanguageAndKeyboard) { |
| } |
|
pneubeck (no reviews)
2014/07/30 15:39:23
will continue review after this part later.
bartfab (slow)
2014/08/05 17:16:24
Acknowledged.
|
| IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, |
| - SelectLanguageAndKeyboardWithTermsOfService) { |
| + AutoLoginWithoutRecommendedLocales) { |
|
pneubeck (no reviews)
2014/07/30 17:55:44
can you compare this to whatever other test maybe
bartfab (slow)
2014/08/05 17:16:23
The only other auto-login tests I am aware of are
|
| + const std::string initial_locale = g_browser_process->GetApplicationLocale(); |
| + |
| + UploadAndInstallDeviceLocalAccountPolicy(); |
| + AddPublicSessionToDevicePolicy(kAccountId1); |
| + EnableAutoLogin(); |
| + |
| + WaitForPolicy(); |
| + ASSERT_NO_FATAL_FAILURE(SkipToLoginScreen()); |
| + |
| + WaitForSessionStart(); |
| + |
| + // Verify that the locale has not changed and the first keyboard layout |
| + // applicable to the locale was chosen. |
| + EXPECT_EQ(initial_locale, g_browser_process->GetApplicationLocale()); |
| + VerifyKeyboardLayoutMatchesLocale(); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, |
| + AutoLoginWithRecommendedLocales) { |
| + // Specify recommended locales. |
| + em::StringListPolicyProto* session_locales_proto = |
| + device_local_account_policy_.payload().mutable_sessionlocales(); |
| + session_locales_proto->mutable_policy_options()->set_mode( |
| + em::PolicyOptions_PolicyMode_RECOMMENDED); |
| + for (size_t i = 0; i < arraysize(kRecommendedLocales1); ++i) { |
| + session_locales_proto->mutable_value()->add_entries( |
| + kRecommendedLocales1[i]); |
| + } |
| + UploadAndInstallDeviceLocalAccountPolicy(); |
| + AddPublicSessionToDevicePolicy(kAccountId1); |
| + EnableAutoLogin(); |
| + |
| + WaitForPolicy(); |
| + ASSERT_NO_FATAL_FAILURE(SkipToLoginScreen()); |
| + |
| + WaitForSessionStart(); |
| + |
| + // Verify that the first recommended locale has been applied and the first |
| + // keyboard layout applicable to the locale was chosen. |
| + EXPECT_EQ(kRecommendedLocales1[0], g_browser_process->GetApplicationLocale()); |
| + VerifyKeyboardLayoutMatchesLocale(); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, TermsOfServiceWithLocaleSwitch) { |
| // Specify Terms of Service URL. |
| ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| device_local_account_policy_.payload().mutable_termsofserviceurl()->set_value( |
| @@ -1351,12 +1656,35 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, |
| UploadAndInstallDeviceLocalAccountPolicy(); |
| AddPublicSessionToDevicePolicy(kAccountId1); |
| - // Log in to the device-local account with a specific locale and keyboard |
| - // layout. |
| WaitForPolicy(); |
| - ASSERT_NO_FATAL_FAILURE(WaitForLoginUI()); |
| - ASSERT_NO_FATAL_FAILURE( |
| - StartLogin(kPublicSessionLocale, public_session_input_method_id_)); |
| + ASSERT_NO_FATAL_FAILURE(SkipToLoginScreen()); |
| + |
| + // Select a different locale. |
| + content::WebContents* contents = GetWebContents(); |
| + ASSERT_TRUE(contents); |
| + ASSERT_TRUE(content::ExecuteScript( |
| + contents, |
| + base::StringPrintf( |
| + "var languageSelect = document.getElementById('pod-row')" |
| + " .getPodWithUsername_('%s').querySelector('.language-select');" |
| + "languageSelect.value = '%s';" |
| + "var event = document.createEvent('HTMLEvents');" |
| + "event.initEvent('change', false, true);" |
| + "languageSelect.dispatchEvent(event);", |
| + user_id_1_.c_str(), |
| + kPublicSessionLocale))); |
| + |
| + // The UI will have requested an updated list of keyboard layouts at this |
| + // point. Flush the FILE and UI thread loops to allow the process that |
| + // constructs this list to complete. |
| + base::RunLoop run_loop; |
| + content::BrowserThread::PostTaskAndReply( |
| + content::BrowserThread::FILE, |
| + FROM_HERE, |
| + base::Bind(&base::DoNothing), |
| + run_loop.QuitClosure()); |
| + run_loop.Run(); |
| + base::RunLoop().RunUntilIdle(); |
| // Set up an observer that will quit the message loop when login has succeeded |
| // and the first wizard screen, if any, is being shown. |
| @@ -1364,12 +1692,25 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, |
| chromeos::MockAuthStatusConsumer login_status_consumer; |
| EXPECT_CALL(login_status_consumer, OnAuthSuccess(_)).Times(1).WillOnce( |
| InvokeWithoutArgs(&login_wait_run_loop, &base::RunLoop::Quit)); |
| - |
| - // Spin the loop until the observer fires. Then, unregister the observer. |
| chromeos::ExistingUserController* controller = |
| chromeos::ExistingUserController::current_controller(); |
| ASSERT_TRUE(controller); |
| controller->set_login_status_consumer(&login_status_consumer); |
| + |
| + // Manually select a different keyboard layout and click the enter button to |
| + // start the session. |
| + ASSERT_TRUE(content::ExecuteScript( |
| + contents, |
| + base::StringPrintf( |
| + "var pod =" |
| + " document.getElementById('pod-row').getPodWithUsername_('%s');" |
| + "pod.querySelector('.keyboard-select').value = '%s';" |
| + "pod.querySelector('.enter-button').click();", |
| + user_id_1_.c_str(), |
| + public_session_input_method_id_.c_str()))); |
| + |
| + // Spin the loop until the login observer fires. Then, unregister the |
| + // observer. |
| login_wait_run_loop.Run(); |
| controller->set_login_status_consumer(NULL); |
| @@ -1382,16 +1723,6 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, |
| wizard_controller->current_screen()->GetName()); |
| // Wait for the Terms of Service to finish downloading. |
| - chromeos::LoginDisplayHostImpl* host = |
| - reinterpret_cast<chromeos::LoginDisplayHostImpl*>( |
| - chromeos::LoginDisplayHostImpl::default_host()); |
| - ASSERT_TRUE(host); |
| - chromeos::WebUILoginView* web_ui_login_view = host->GetWebUILoginView(); |
| - ASSERT_TRUE(web_ui_login_view); |
| - content::WebUI* web_ui = web_ui_login_view->GetWebUI(); |
| - ASSERT_TRUE(web_ui); |
| - content::WebContents* contents = web_ui->GetWebContents(); |
| - ASSERT_TRUE(contents); |
| bool done = false; |
| ASSERT_TRUE(content::ExecuteScriptAndExtractBool(contents, |
| "var screenElement = document.getElementById('terms-of-service');" |
| @@ -1472,15 +1803,7 @@ IN_PROC_BROWSER_TEST_P(TermsOfServiceDownloadTest, TermsOfServiceScreen) { |
| // Wait for the Terms of Service to finish downloading, then get the status of |
| // the screen's UI elements. |
| - chromeos::LoginDisplayHostImpl* host = |
| - reinterpret_cast<chromeos::LoginDisplayHostImpl*>( |
| - chromeos::LoginDisplayHostImpl::default_host()); |
| - ASSERT_TRUE(host); |
| - chromeos::WebUILoginView* web_ui_login_view = host->GetWebUILoginView(); |
| - ASSERT_TRUE(web_ui_login_view); |
| - content::WebUI* web_ui = web_ui_login_view->GetWebUI(); |
| - ASSERT_TRUE(web_ui); |
| - content::WebContents* contents = web_ui->GetWebContents(); |
| + content::WebContents* contents = GetWebContents(); |
| ASSERT_TRUE(contents); |
| std::string json; |
| ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, |