| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <map> | 5 #include <map> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "apps/app_window_registry.h" | 8 #include "apps/app_window_registry.h" |
| 9 #include "apps/ui/native_app_window.h" | 9 #include "apps/ui/native_app_window.h" |
| 10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| 11 #include "ash/system/chromeos/session/logout_confirmation_controller.h" | 11 #include "ash/system/chromeos/session/logout_confirmation_controller.h" |
| 12 #include "ash/system/chromeos/session/logout_confirmation_dialog.h" | 12 #include "ash/system/chromeos/session/logout_confirmation_dialog.h" |
| 13 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
| 16 #include "base/callback.h" | 16 #include "base/callback.h" |
| 17 #include "base/command_line.h" | 17 #include "base/command_line.h" |
| 18 #include "base/file_util.h" | 18 #include "base/file_util.h" |
| 19 #include "base/files/file_path.h" | 19 #include "base/files/file_path.h" |
| 20 #include "base/json/json_reader.h" | 20 #include "base/json/json_reader.h" |
| 21 #include "base/json/json_writer.h" | 21 #include "base/json/json_writer.h" |
| 22 #include "base/location.h" | 22 #include "base/location.h" |
| 23 #include "base/macros.h" |
| 23 #include "base/memory/ref_counted.h" | 24 #include "base/memory/ref_counted.h" |
| 24 #include "base/memory/scoped_ptr.h" | 25 #include "base/memory/scoped_ptr.h" |
| 25 #include "base/message_loop/message_loop.h" | 26 #include "base/message_loop/message_loop.h" |
| 26 #include "base/message_loop/message_loop_proxy.h" | 27 #include "base/message_loop/message_loop_proxy.h" |
| 27 #include "base/path_service.h" | 28 #include "base/path_service.h" |
| 29 #include "base/prefs/pref_change_registrar.h" |
| 28 #include "base/prefs/pref_service.h" | 30 #include "base/prefs/pref_service.h" |
| 29 #include "base/run_loop.h" | 31 #include "base/run_loop.h" |
| 30 #include "base/sequenced_task_runner.h" | 32 #include "base/sequenced_task_runner.h" |
| 31 #include "base/strings/string_number_conversions.h" | 33 #include "base/strings/string_number_conversions.h" |
| 32 #include "base/strings/string_util.h" | 34 #include "base/strings/string_util.h" |
| 33 #include "base/strings/stringprintf.h" | 35 #include "base/strings/stringprintf.h" |
| 34 #include "base/strings/utf_string_conversions.h" | 36 #include "base/strings/utf_string_conversions.h" |
| 35 #include "base/values.h" | 37 #include "base/values.h" |
| 36 #include "chrome/browser/browser_process.h" | 38 #include "chrome/browser/browser_process.h" |
| 37 #include "chrome/browser/chrome_notification_types.h" | 39 #include "chrome/browser/chrome_notification_types.h" |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 using testing::Return; | 136 using testing::Return; |
| 135 using testing::_; | 137 using testing::_; |
| 136 | 138 |
| 137 namespace policy { | 139 namespace policy { |
| 138 | 140 |
| 139 namespace { | 141 namespace { |
| 140 | 142 |
| 141 const char kDomain[] = "example.com"; | 143 const char kDomain[] = "example.com"; |
| 142 const char kAccountId1[] = "dla1@example.com"; | 144 const char kAccountId1[] = "dla1@example.com"; |
| 143 const char kAccountId2[] = "dla2@example.com"; | 145 const char kAccountId2[] = "dla2@example.com"; |
| 144 const char kDisplayName[] = "display name"; | 146 const char kDisplayName1[] = "display name 1"; |
| 147 const char kDisplayName2[] = "display name 2"; |
| 145 const char* kStartupURLs[] = { | 148 const char* kStartupURLs[] = { |
| 146 "chrome://policy", | 149 "chrome://policy", |
| 147 "chrome://about", | 150 "chrome://about", |
| 148 }; | 151 }; |
| 149 const char kExistentTermsOfServicePath[] = "chromeos/enterprise/tos.txt"; | 152 const char kExistentTermsOfServicePath[] = "chromeos/enterprise/tos.txt"; |
| 150 const char kNonexistentTermsOfServicePath[] = "chromeos/enterprise/tos404.txt"; | 153 const char kNonexistentTermsOfServicePath[] = "chromeos/enterprise/tos404.txt"; |
| 151 const char kRelativeUpdateURL[] = "/service/update2/crx"; | 154 const char kRelativeUpdateURL[] = "/service/update2/crx"; |
| 152 const char kUpdateManifestHeader[] = | 155 const char kUpdateManifestHeader[] = |
| 153 "<?xml version='1.0' encoding='UTF-8'?>\n" | 156 "<?xml version='1.0' encoding='UTF-8'?>\n" |
| 154 "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>\n"; | 157 "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>\n"; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 GURL crx_url; | 204 GURL crx_url; |
| 202 }; | 205 }; |
| 203 typedef std::map<std::string, Update> UpdateMap; | 206 typedef std::map<std::string, Update> UpdateMap; |
| 204 UpdateMap updates_; | 207 UpdateMap updates_; |
| 205 | 208 |
| 206 const std::string relative_update_url_; | 209 const std::string relative_update_url_; |
| 207 | 210 |
| 208 DISALLOW_COPY_AND_ASSIGN(TestingUpdateManifestProvider); | 211 DISALLOW_COPY_AND_ASSIGN(TestingUpdateManifestProvider); |
| 209 }; | 212 }; |
| 210 | 213 |
| 214 // Helper that observes the dictionary |pref| in local state and waits until the |
| 215 // value stored for |key| matches |expected_value|. |
| 216 class DictionaryPrefValueWaiter { |
| 217 public: |
| 218 DictionaryPrefValueWaiter(const std::string& pref, |
| 219 const std::string& key, |
| 220 const std::string& expected_value); |
| 221 ~DictionaryPrefValueWaiter(); |
| 222 |
| 223 void Wait(); |
| 224 |
| 225 private: |
| 226 void QuitLoopIfExpectedValueFound(); |
| 227 |
| 228 const std::string pref_; |
| 229 const std::string key_; |
| 230 const std::string expected_value_; |
| 231 |
| 232 base::RunLoop run_loop_; |
| 233 PrefChangeRegistrar pref_change_registrar_; |
| 234 |
| 235 DISALLOW_COPY_AND_ASSIGN(DictionaryPrefValueWaiter); |
| 236 }; |
| 237 |
| 211 TestingUpdateManifestProvider::Update::Update(const std::string& version, | 238 TestingUpdateManifestProvider::Update::Update(const std::string& version, |
| 212 const GURL& crx_url) | 239 const GURL& crx_url) |
| 213 : version(version), | 240 : version(version), |
| 214 crx_url(crx_url) { | 241 crx_url(crx_url) { |
| 215 } | 242 } |
| 216 | 243 |
| 217 TestingUpdateManifestProvider::Update::Update() { | 244 TestingUpdateManifestProvider::Update::Update() { |
| 218 } | 245 } |
| 219 | 246 |
| 220 TestingUpdateManifestProvider::TestingUpdateManifestProvider( | 247 TestingUpdateManifestProvider::TestingUpdateManifestProvider( |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 } | 284 } |
| 258 content += kUpdateManifestFooter; | 285 content += kUpdateManifestFooter; |
| 259 scoped_ptr<net::test_server::BasicHttpResponse> | 286 scoped_ptr<net::test_server::BasicHttpResponse> |
| 260 http_response(new net::test_server::BasicHttpResponse); | 287 http_response(new net::test_server::BasicHttpResponse); |
| 261 http_response->set_code(net::HTTP_OK); | 288 http_response->set_code(net::HTTP_OK); |
| 262 http_response->set_content(content); | 289 http_response->set_content(content); |
| 263 http_response->set_content_type("text/xml"); | 290 http_response->set_content_type("text/xml"); |
| 264 return http_response.PassAs<net::test_server::HttpResponse>(); | 291 return http_response.PassAs<net::test_server::HttpResponse>(); |
| 265 } | 292 } |
| 266 | 293 |
| 294 DictionaryPrefValueWaiter::DictionaryPrefValueWaiter( |
| 295 const std::string& pref, |
| 296 const std::string& key, |
| 297 const std::string& expected_value) |
| 298 : pref_(pref), |
| 299 key_(key), |
| 300 expected_value_(expected_value) { |
| 301 pref_change_registrar_.Init(g_browser_process->local_state()); |
| 302 } |
| 303 |
| 304 DictionaryPrefValueWaiter::~DictionaryPrefValueWaiter() { |
| 305 } |
| 306 |
| 307 void DictionaryPrefValueWaiter::Wait() { |
| 308 pref_change_registrar_.Add( |
| 309 pref_.c_str(), |
| 310 base::Bind(&DictionaryPrefValueWaiter::QuitLoopIfExpectedValueFound, |
| 311 base::Unretained(this))); |
| 312 QuitLoopIfExpectedValueFound(); |
| 313 run_loop_.Run(); |
| 314 } |
| 315 |
| 316 void DictionaryPrefValueWaiter::QuitLoopIfExpectedValueFound() { |
| 317 const base::DictionaryValue* pref = |
| 318 pref_change_registrar_.prefs()->GetDictionary(pref_.c_str()); |
| 319 ASSERT_TRUE(pref); |
| 320 std::string actual_value; |
| 321 if (pref->GetStringWithoutPathExpansion(key_, &actual_value) && |
| 322 actual_value == expected_value_) { |
| 323 run_loop_.Quit(); |
| 324 } |
| 325 } |
| 326 |
| 267 bool DoesInstallSuccessReferToId(const std::string& id, | 327 bool DoesInstallSuccessReferToId(const std::string& id, |
| 268 const content::NotificationSource& source, | 328 const content::NotificationSource& source, |
| 269 const content::NotificationDetails& details) { | 329 const content::NotificationDetails& details) { |
| 270 return content::Details<const extensions::InstalledExtensionInfo>(details)-> | 330 return content::Details<const extensions::InstalledExtensionInfo>(details)-> |
| 271 extension->id() == id; | 331 extension->id() == id; |
| 272 } | 332 } |
| 273 | 333 |
| 274 bool DoesInstallFailureReferToId(const std::string& id, | 334 bool DoesInstallFailureReferToId(const std::string& id, |
| 275 const content::NotificationSource& source, | 335 const content::NotificationSource& source, |
| 276 const content::NotificationDetails& details) { | 336 const content::NotificationDetails& details) { |
| 277 return content::Details<const base::string16>(details)-> | 337 return content::Details<const base::string16>(details)-> |
| 278 find(base::UTF8ToUTF16(id)) != base::string16::npos; | 338 find(base::UTF8ToUTF16(id)) != base::string16::npos; |
| 279 } | 339 } |
| 280 | 340 |
| 281 scoped_ptr<net::FakeURLFetcher> RunCallbackAndReturnFakeURLFetcher( | 341 scoped_ptr<net::FakeURLFetcher> RunCallbackAndReturnFakeURLFetcher( |
| 282 scoped_refptr<base::SequencedTaskRunner> task_runner, | 342 scoped_refptr<base::SequencedTaskRunner> task_runner, |
| 283 const base::Closure& callback, | 343 const base::Closure& callback, |
| 284 const GURL& url, | 344 const GURL& url, |
| 285 net::URLFetcherDelegate* delegate, | 345 net::URLFetcherDelegate* delegate, |
| 286 const std::string& response_data, | 346 const std::string& response_data, |
| 287 net::HttpStatusCode response_code, | 347 net::HttpStatusCode response_code, |
| 288 net::URLRequestStatus::Status status) { | 348 net::URLRequestStatus::Status status) { |
| 289 task_runner->PostTask(FROM_HERE, callback); | 349 task_runner->PostTask(FROM_HERE, callback); |
| 290 return make_scoped_ptr(new net::FakeURLFetcher( | 350 return make_scoped_ptr(new net::FakeURLFetcher( |
| 291 url, delegate, response_data, response_code, status)); | 351 url, delegate, response_data, response_code, status)); |
| 292 } | 352 } |
| 293 | 353 |
| 294 bool DisplayNameMatches(const std::string& account_id, | |
| 295 const std::string& display_name) { | |
| 296 const user_manager::User* user = | |
| 297 chromeos::UserManager::Get()->FindUser(account_id); | |
| 298 if (!user || user->display_name().empty()) | |
| 299 return false; | |
| 300 EXPECT_EQ(base::UTF8ToUTF16(display_name), user->display_name()); | |
| 301 return true; | |
| 302 } | |
| 303 | |
| 304 bool IsSessionStarted() { | 354 bool IsSessionStarted() { |
| 305 return chromeos::UserManager::Get()->IsSessionStarted(); | 355 return chromeos::UserManager::Get()->IsSessionStarted(); |
| 306 } | 356 } |
| 307 | 357 |
| 308 } // namespace | 358 } // namespace |
| 309 | 359 |
| 310 class DeviceLocalAccountTest : public DevicePolicyCrosBrowserTest, | 360 class DeviceLocalAccountTest : public DevicePolicyCrosBrowserTest, |
| 311 public chromeos::UserManager::Observer, | 361 public chromeos::UserManager::Observer, |
| 312 public chrome::BrowserListObserver, | 362 public chrome::BrowserListObserver, |
| 313 public apps::AppWindowRegistry::Observer { | 363 public apps::AppWindowRegistry::Observer { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); | 451 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); |
| 402 proto.mutable_show_user_names()->set_show_user_names(true); | 452 proto.mutable_show_user_names()->set_show_user_names(true); |
| 403 | 453 |
| 404 device_local_account_policy_.policy_data().set_policy_type( | 454 device_local_account_policy_.policy_data().set_policy_type( |
| 405 dm_protocol::kChromePublicAccountPolicyType); | 455 dm_protocol::kChromePublicAccountPolicyType); |
| 406 device_local_account_policy_.policy_data().set_username(kAccountId1); | 456 device_local_account_policy_.policy_data().set_username(kAccountId1); |
| 407 device_local_account_policy_.policy_data().set_settings_entity_id( | 457 device_local_account_policy_.policy_data().set_settings_entity_id( |
| 408 kAccountId1); | 458 kAccountId1); |
| 409 device_local_account_policy_.policy_data().set_public_key_version(1); | 459 device_local_account_policy_.policy_data().set_public_key_version(1); |
| 410 device_local_account_policy_.payload().mutable_userdisplayname()->set_value( | 460 device_local_account_policy_.payload().mutable_userdisplayname()->set_value( |
| 411 kDisplayName); | 461 kDisplayName1); |
| 412 } | 462 } |
| 413 | 463 |
| 414 void BuildDeviceLocalAccountPolicy() { | 464 void BuildDeviceLocalAccountPolicy() { |
| 415 device_local_account_policy_.SetDefaultSigningKey(); | 465 device_local_account_policy_.SetDefaultSigningKey(); |
| 416 device_local_account_policy_.Build(); | 466 device_local_account_policy_.Build(); |
| 417 } | 467 } |
| 418 | 468 |
| 419 void UploadDeviceLocalAccountPolicy() { | 469 void UploadDeviceLocalAccountPolicy() { |
| 420 BuildDeviceLocalAccountPolicy(); | 470 BuildDeviceLocalAccountPolicy(); |
| 421 test_server_.UpdatePolicy( | 471 test_server_.UpdatePolicy( |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 return GetExtensionCacheDirectoryForAccountID(account_id) | 515 return GetExtensionCacheDirectoryForAccountID(account_id) |
| 466 .Append(base::StringPrintf("%s-%s.crx", id.c_str(), version.c_str())); | 516 .Append(base::StringPrintf("%s-%s.crx", id.c_str(), version.c_str())); |
| 467 } | 517 } |
| 468 | 518 |
| 469 // Returns a profile which can be used for testing. | 519 // Returns a profile which can be used for testing. |
| 470 Profile* GetProfileForTest() { | 520 Profile* GetProfileForTest() { |
| 471 // Any profile can be used here since this test does not test multi profile. | 521 // Any profile can be used here since this test does not test multi profile. |
| 472 return ProfileManager::GetActiveUserProfile(); | 522 return ProfileManager::GetActiveUserProfile(); |
| 473 } | 523 } |
| 474 | 524 |
| 525 void WaitForDisplayName(const std::string& user_id, |
| 526 const std::string& expected_display_name) { |
| 527 DictionaryPrefValueWaiter("UserDisplayName", |
| 528 user_id, |
| 529 expected_display_name).Wait(); |
| 530 } |
| 531 |
| 475 void WaitForPolicy() { | 532 void WaitForPolicy() { |
| 476 // This observes the display name becoming available as this indicates | 533 // Wait for the display name becoming available as that indicates |
| 477 // device-local account policy is fully loaded, which is a prerequisite for | 534 // device-local account policy is fully loaded, which is a prerequisite for |
| 478 // successful login. | 535 // successful login. |
| 479 content::WindowedNotificationObserver( | 536 WaitForDisplayName(user_id_1_, kDisplayName1); |
| 480 chrome::NOTIFICATION_USER_LIST_CHANGED, | |
| 481 base::Bind(&DisplayNameMatches, user_id_1_, kDisplayName)).Wait(); | |
| 482 } | 537 } |
| 483 | 538 |
| 484 void WaitForLoginUI() { | 539 void WaitForLoginUI() { |
| 485 // Wait for the login UI to be ready. | 540 // Wait for the login UI to be ready. |
| 486 chromeos::LoginDisplayHostImpl* host = | 541 chromeos::LoginDisplayHostImpl* host = |
| 487 reinterpret_cast<chromeos::LoginDisplayHostImpl*>( | 542 reinterpret_cast<chromeos::LoginDisplayHostImpl*>( |
| 488 chromeos::LoginDisplayHostImpl::default_host()); | 543 chromeos::LoginDisplayHostImpl::default_host()); |
| 489 ASSERT_TRUE(host); | 544 ASSERT_TRUE(host); |
| 490 chromeos::OobeUI* oobe_ui = host->GetOobeUI(); | 545 chromeos::OobeUI* oobe_ui = host->GetOobeUI(); |
| 491 ASSERT_TRUE(oobe_ui); | 546 ASSERT_TRUE(oobe_ui); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 return chromeos::UserManager::Get()->IsKnownUser(account_id); | 593 return chromeos::UserManager::Get()->IsKnownUser(account_id); |
| 539 } | 594 } |
| 540 | 595 |
| 541 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, LoginScreen) { | 596 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, LoginScreen) { |
| 542 AddPublicSessionToDevicePolicy(kAccountId1); | 597 AddPublicSessionToDevicePolicy(kAccountId1); |
| 543 AddPublicSessionToDevicePolicy(kAccountId2); | 598 AddPublicSessionToDevicePolicy(kAccountId2); |
| 544 | 599 |
| 545 content::WindowedNotificationObserver(chrome::NOTIFICATION_USER_LIST_CHANGED, | 600 content::WindowedNotificationObserver(chrome::NOTIFICATION_USER_LIST_CHANGED, |
| 546 base::Bind(&IsKnownUser, user_id_1_)) | 601 base::Bind(&IsKnownUser, user_id_1_)) |
| 547 .Wait(); | 602 .Wait(); |
| 548 content::WindowedNotificationObserver(chrome::NOTIFICATION_USER_LIST_CHANGED, | 603 EXPECT_TRUE(IsKnownUser(user_id_2_)); |
| 549 base::Bind(&IsKnownUser, user_id_2_)) | |
| 550 .Wait(); | |
| 551 | 604 |
| 552 CheckPublicSessionPresent(user_id_1_); | 605 CheckPublicSessionPresent(user_id_1_); |
| 553 CheckPublicSessionPresent(user_id_2_); | 606 CheckPublicSessionPresent(user_id_2_); |
| 554 } | 607 } |
| 555 | 608 |
| 556 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DisplayName) { | 609 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DisplayName) { |
| 557 UploadAndInstallDeviceLocalAccountPolicy(); | 610 UploadAndInstallDeviceLocalAccountPolicy(); |
| 558 AddPublicSessionToDevicePolicy(kAccountId1); | 611 AddPublicSessionToDevicePolicy(kAccountId1); |
| 559 | 612 |
| 560 WaitForPolicy(); | 613 WaitForPolicy(); |
| 614 |
| 615 // Skip to the login screen. |
| 616 chromeos::WizardController* wizard_controller = |
| 617 chromeos::WizardController::default_controller(); |
| 618 ASSERT_TRUE(wizard_controller); |
| 619 wizard_controller->SkipToLoginForTesting(LoginScreenContext()); |
| 620 content::WindowedNotificationObserver( |
| 621 chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, |
| 622 content::NotificationService::AllSources()).Wait(); |
| 623 |
| 624 // Verify that the display name is shown in the UI. |
| 625 chromeos::LoginDisplayHostImpl* host = |
| 626 reinterpret_cast<chromeos::LoginDisplayHostImpl*>( |
| 627 chromeos::LoginDisplayHostImpl::default_host()); |
| 628 ASSERT_TRUE(host); |
| 629 chromeos::WebUILoginView* web_ui_login_view = host->GetWebUILoginView(); |
| 630 ASSERT_TRUE(web_ui_login_view); |
| 631 content::WebUI* web_ui = web_ui_login_view->GetWebUI(); |
| 632 ASSERT_TRUE(web_ui); |
| 633 content::WebContents* contents = web_ui->GetWebContents(); |
| 634 ASSERT_TRUE(contents); |
| 635 const std::string get_compact_pod_display_name = base::StringPrintf( |
| 636 "domAutomationController.send(document.getElementById('pod-row')" |
| 637 " .getPodWithUsername_('%s').nameElement.textContent);", |
| 638 user_id_1_.c_str()); |
| 639 std::string display_name; |
| 640 ASSERT_TRUE(content::ExecuteScriptAndExtractString( |
| 641 contents, |
| 642 get_compact_pod_display_name, |
| 643 &display_name)); |
| 644 EXPECT_EQ(kDisplayName1, display_name); |
| 645 const std::string get_expanded_pod_display_name = base::StringPrintf( |
| 646 "domAutomationController.send(document.getElementById('pod-row')" |
| 647 " .getPodWithUsername_('%s').querySelector('.expanded-pane-name')" |
| 648 " .textContent);", |
| 649 user_id_1_.c_str()); |
| 650 display_name.clear(); |
| 651 ASSERT_TRUE(content::ExecuteScriptAndExtractString( |
| 652 contents, |
| 653 get_expanded_pod_display_name, |
| 654 &display_name)); |
| 655 EXPECT_EQ(kDisplayName1, display_name); |
| 656 |
| 657 // Click on the pod to expand it. |
| 658 ASSERT_TRUE(content::ExecuteScript( |
| 659 contents, |
| 660 base::StringPrintf( |
| 661 "document.getElementById('pod-row').getPodWithUsername_('%s')" |
| 662 " .click();", |
| 663 user_id_1_.c_str()))); |
| 664 |
| 665 // Change the display name. |
| 666 device_local_account_policy_.payload().mutable_userdisplayname()->set_value( |
| 667 kDisplayName2); |
| 668 UploadAndInstallDeviceLocalAccountPolicy(); |
| 669 policy::BrowserPolicyConnectorChromeOS* connector = |
| 670 g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
| 671 DeviceLocalAccountPolicyBroker* broker = |
| 672 connector->GetDeviceLocalAccountPolicyService()->GetBrokerForUser( |
| 673 user_id_1_); |
| 674 ASSERT_TRUE(broker); |
| 675 broker->core()->store()->Load(); |
| 676 WaitForDisplayName(user_id_1_, kDisplayName2); |
| 677 |
| 678 // Verify that the new display name is shown in the UI. |
| 679 display_name.clear(); |
| 680 ASSERT_TRUE(content::ExecuteScriptAndExtractString( |
| 681 contents, |
| 682 get_compact_pod_display_name, |
| 683 &display_name)); |
| 684 EXPECT_EQ(kDisplayName2, display_name); |
| 685 display_name.clear(); |
| 686 ASSERT_TRUE(content::ExecuteScriptAndExtractString( |
| 687 contents, |
| 688 get_expanded_pod_display_name, |
| 689 &display_name)); |
| 690 EXPECT_EQ(kDisplayName2, display_name); |
| 691 |
| 692 // Verify that the pod is still expanded. This indicates that the UI updated |
| 693 // without reloading and losing state. |
| 694 bool expanded = false; |
| 695 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
| 696 contents, |
| 697 base::StringPrintf( |
| 698 "domAutomationController.send(document.getElementById('pod-row')" |
| 699 " .getPodWithUsername_('%s').expanded);", |
| 700 user_id_1_.c_str()), |
| 701 &expanded)); |
| 702 EXPECT_TRUE(expanded); |
| 561 } | 703 } |
| 562 | 704 |
| 563 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, PolicyDownload) { | 705 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, PolicyDownload) { |
| 564 UploadDeviceLocalAccountPolicy(); | 706 UploadDeviceLocalAccountPolicy(); |
| 565 AddPublicSessionToDevicePolicy(kAccountId1); | 707 AddPublicSessionToDevicePolicy(kAccountId1); |
| 566 | 708 |
| 567 WaitForPolicy(); | 709 WaitForPolicy(); |
| 568 | 710 |
| 569 // Sanity check: The policy should be present now. | 711 // Sanity check: The policy should be present now. |
| 570 ASSERT_FALSE(session_manager_client()->device_local_account_policy( | 712 ASSERT_FALSE(session_manager_client()->device_local_account_policy( |
| 571 kAccountId1).empty()); | 713 kAccountId1).empty()); |
| 572 } | 714 } |
| 573 | 715 |
| 574 static bool IsNotKnownUser(const std::string& account_id) { | 716 static bool IsNotKnownUser(const std::string& account_id) { |
| 575 return !IsKnownUser(account_id); | 717 return !IsKnownUser(account_id); |
| 576 } | 718 } |
| 577 | 719 |
| 578 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DevicePolicyChange) { | 720 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, AccountListChange) { |
| 579 AddPublicSessionToDevicePolicy(kAccountId1); | 721 AddPublicSessionToDevicePolicy(kAccountId1); |
| 580 AddPublicSessionToDevicePolicy(kAccountId2); | 722 AddPublicSessionToDevicePolicy(kAccountId2); |
| 581 | 723 |
| 582 // Wait until the login screen is up. | |
| 583 content::WindowedNotificationObserver(chrome::NOTIFICATION_USER_LIST_CHANGED, | 724 content::WindowedNotificationObserver(chrome::NOTIFICATION_USER_LIST_CHANGED, |
| 584 base::Bind(&IsKnownUser, user_id_1_)) | 725 base::Bind(&IsKnownUser, user_id_1_)) |
| 585 .Wait(); | 726 .Wait(); |
| 586 content::WindowedNotificationObserver(chrome::NOTIFICATION_USER_LIST_CHANGED, | 727 EXPECT_TRUE(IsKnownUser(user_id_2_)); |
| 587 base::Bind(&IsKnownUser, user_id_2_)) | |
| 588 .Wait(); | |
| 589 | 728 |
| 590 // Update policy to remove kAccountId2. | 729 // Update policy to remove kAccountId2. |
| 591 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); | 730 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); |
| 592 proto.mutable_device_local_accounts()->clear_account(); | 731 proto.mutable_device_local_accounts()->clear_account(); |
| 593 AddPublicSessionToDevicePolicy(kAccountId1); | 732 AddPublicSessionToDevicePolicy(kAccountId1); |
| 594 | 733 |
| 595 em::ChromeDeviceSettingsProto policy; | 734 em::ChromeDeviceSettingsProto policy; |
| 596 policy.mutable_show_user_names()->set_show_user_names(true); | 735 policy.mutable_show_user_names()->set_show_user_names(true); |
| 597 em::DeviceLocalAccountInfoProto* account1 = | 736 em::DeviceLocalAccountInfoProto* account1 = |
| 598 policy.mutable_device_local_accounts()->add_account(); | 737 policy.mutable_device_local_accounts()->add_account(); |
| 599 account1->set_account_id(kAccountId1); | 738 account1->set_account_id(kAccountId1); |
| 600 account1->set_type( | 739 account1->set_type( |
| 601 em::DeviceLocalAccountInfoProto::ACCOUNT_TYPE_PUBLIC_SESSION); | 740 em::DeviceLocalAccountInfoProto::ACCOUNT_TYPE_PUBLIC_SESSION); |
| 602 | 741 |
| 603 test_server_.UpdatePolicy(dm_protocol::kChromeDevicePolicyType, std::string(), | 742 test_server_.UpdatePolicy(dm_protocol::kChromeDevicePolicyType, std::string(), |
| 604 policy.SerializeAsString()); | 743 policy.SerializeAsString()); |
| 605 g_browser_process->policy_service()->RefreshPolicies(base::Closure()); | 744 g_browser_process->policy_service()->RefreshPolicies(base::Closure()); |
| 606 | 745 |
| 607 // Make sure the second device-local account disappears. | 746 // Make sure the second device-local account disappears. |
| 608 content::WindowedNotificationObserver( | 747 content::WindowedNotificationObserver(chrome::NOTIFICATION_USER_LIST_CHANGED, |
| 609 chrome::NOTIFICATION_USER_LIST_CHANGED, | 748 base::Bind(&IsNotKnownUser, user_id_2_)) |
| 610 base::Bind(&IsNotKnownUser, user_id_2_)).Wait(); | 749 .Wait(); |
| 611 } | 750 } |
| 612 | 751 |
| 613 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, StartSession) { | 752 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, StartSession) { |
| 614 // Specify startup pages. | 753 // Specify startup pages. |
| 615 device_local_account_policy_.payload().mutable_restoreonstartup()->set_value( | 754 device_local_account_policy_.payload().mutable_restoreonstartup()->set_value( |
| 616 SessionStartupPref::kPrefValueURLs); | 755 SessionStartupPref::kPrefValueURLs); |
| 617 em::StringListPolicyProto* startup_urls_proto = | 756 em::StringListPolicyProto* startup_urls_proto = |
| 618 device_local_account_policy_.payload().mutable_restoreonstartupurls(); | 757 device_local_account_policy_.payload().mutable_restoreonstartupurls(); |
| 619 for (size_t i = 0; i < arraysize(kStartupURLs); ++i) | 758 for (size_t i = 0; i < arraysize(kStartupURLs); ++i) |
| 620 startup_urls_proto->mutable_value()->add_entries(kStartupURLs[i]); | 759 startup_urls_proto->mutable_value()->add_entries(kStartupURLs[i]); |
| (...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1424 ASSERT_TRUE(content::ExecuteScript(contents, | 1563 ASSERT_TRUE(content::ExecuteScript(contents, |
| 1425 "$('tos-accept-button').click();")); | 1564 "$('tos-accept-button').click();")); |
| 1426 | 1565 |
| 1427 WaitForSessionStart(); | 1566 WaitForSessionStart(); |
| 1428 } | 1567 } |
| 1429 | 1568 |
| 1430 INSTANTIATE_TEST_CASE_P(TermsOfServiceDownloadTestInstance, | 1569 INSTANTIATE_TEST_CASE_P(TermsOfServiceDownloadTestInstance, |
| 1431 TermsOfServiceDownloadTest, testing::Bool()); | 1570 TermsOfServiceDownloadTest, testing::Bool()); |
| 1432 | 1571 |
| 1433 } // namespace policy | 1572 } // namespace policy |
| OLD | NEW |