| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "chrome/browser/chromeos/arc/arc_session_manager.h" | 5 #include "chrome/browser/chromeos/arc/arc_session_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "ash/common/shelf/shelf_delegate.h" | 9 #include "ash/common/shelf/shelf_delegate.h" |
| 10 #include "ash/common/wm_shell.h" | 10 #include "ash/common/wm_shell.h" |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 // If ARC is being restarted, here do nothing, and just wait for its | 155 // If ARC is being restarted, here do nothing, and just wait for its |
| 156 // next run. | 156 // next run. |
| 157 VLOG(1) << "ARC session is stopped, but being restarted: " << reason; | 157 VLOG(1) << "ARC session is stopped, but being restarted: " << reason; |
| 158 return; | 158 return; |
| 159 } | 159 } |
| 160 | 160 |
| 161 // TODO(crbug.com/625923): Use |reason| to report more detailed errors. | 161 // TODO(crbug.com/625923): Use |reason| to report more detailed errors. |
| 162 if (arc_sign_in_timer_.IsRunning()) | 162 if (arc_sign_in_timer_.IsRunning()) |
| 163 OnProvisioningFinished(ProvisioningResult::ARC_STOPPED); | 163 OnProvisioningFinished(ProvisioningResult::ARC_STOPPED); |
| 164 | 164 |
| 165 if (profile_->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)) { | 165 for (auto& observer : observer_list_) |
| 166 // This should be always true, but just in case as this is looked at | 166 observer.OnArcSessionStopped(reason); |
| 167 // inside RemoveArcData() at first. | 167 |
| 168 VLOG(1) << "ARC had previously requested to remove user data."; | 168 // Transition to the ARC data remove state. |
| 169 DCHECK(arc_session_runner_->IsStopped()); | 169 if (!profile_->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)) { |
| 170 RemoveArcData(); | 170 // TODO(crbug.com/665316): This is the workaround for the bug. |
| 171 } else { | 171 // If it is not necessary to remove the data, MaybeStartArcDataRemoval() |
| 172 // To support special "Stop and enable ARC" procedure for enterprise, | 172 // synchronously calls MaybeReenableArc(), which causes unexpected |
| 173 // here call MaybeReenableArc() asyncronously. | 173 // ARC session stop. (Please see the bug for details). |
| 174 // TODO(hidehiko): Restructure the code. crbug.com/665316 | 174 SetState(State::REMOVING_DATA_DIR); |
| 175 base::ThreadTaskRunnerHandle::Get()->PostTask( | 175 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 176 FROM_HERE, base::Bind(&ArcSessionManager::MaybeReenableArc, | 176 FROM_HERE, base::Bind(&ArcSessionManager::MaybeReenableArc, |
| 177 weak_ptr_factory_.GetWeakPtr())); | 177 weak_ptr_factory_.GetWeakPtr())); |
| 178 } | |
| 179 | |
| 180 for (auto& observer : observer_list_) | |
| 181 observer.OnArcSessionStopped(reason); | |
| 182 } | |
| 183 | |
| 184 void ArcSessionManager::RemoveArcData() { | |
| 185 // Ignore redundant data removal request. | |
| 186 if (state() == State::REMOVING_DATA_DIR) | |
| 187 return; | |
| 188 | |
| 189 // OnArcDataRemoved resets this flag. | |
| 190 profile_->GetPrefs()->SetBoolean(prefs::kArcDataRemoveRequested, true); | |
| 191 | |
| 192 if (!arc_session_runner_->IsStopped()) { | |
| 193 // Just set a flag. On session stopped, this will be re-called, | |
| 194 // then session manager should remove the data. | |
| 195 return; | 178 return; |
| 196 } | 179 } |
| 197 | 180 |
| 198 VLOG(1) << "Starting ARC data removal"; | 181 MaybeStartArcDataRemoval(); |
| 199 | |
| 200 // Remove Play user ID for Active Directory managed devices. | |
| 201 profile_->GetPrefs()->SetString(prefs::kArcActiveDirectoryPlayUserId, | |
| 202 std::string()); | |
| 203 | |
| 204 SetState(State::REMOVING_DATA_DIR); | |
| 205 chromeos::DBusThreadManager::Get()->GetSessionManagerClient()->RemoveArcData( | |
| 206 cryptohome::Identification( | |
| 207 multi_user_util::GetAccountIdFromProfile(profile_)), | |
| 208 base::Bind(&ArcSessionManager::OnArcDataRemoved, | |
| 209 weak_ptr_factory_.GetWeakPtr())); | |
| 210 } | |
| 211 | |
| 212 void ArcSessionManager::OnArcDataRemoved(bool success) { | |
| 213 if (success) | |
| 214 VLOG(1) << "ARC data removal successful"; | |
| 215 else | |
| 216 LOG(ERROR) << "Request for ARC user data removal failed."; | |
| 217 | |
| 218 // TODO(khmel): Browser tests may shutdown profile by itself. Update browser | |
| 219 // tests and remove this check. | |
| 220 if (state() == State::NOT_INITIALIZED) | |
| 221 return; | |
| 222 | |
| 223 for (auto& observer : observer_list_) | |
| 224 observer.OnArcDataRemoved(); | |
| 225 | |
| 226 profile_->GetPrefs()->SetBoolean(prefs::kArcDataRemoveRequested, false); | |
| 227 DCHECK_EQ(state(), State::REMOVING_DATA_DIR); | |
| 228 SetState(State::STOPPED); | |
| 229 | |
| 230 MaybeReenableArc(); | |
| 231 } | |
| 232 | |
| 233 void ArcSessionManager::MaybeReenableArc() { | |
| 234 // Here check if |reenable_arc_| is marked or not. | |
| 235 // The only case this happens should be in the special case for enterprise | |
| 236 // "on managed lost" case. In that case, OnSessionStopped() should trigger | |
| 237 // the RemoveArcData(), then this. | |
| 238 // TODO(hidehiko): It looks necessary to reset |reenable_arc_| regardless of | |
| 239 // |enable_requested_|. Fix it. | |
| 240 if (!reenable_arc_ || !enable_requested_) | |
| 241 return; | |
| 242 | |
| 243 // Restart ARC anyway. Let the enterprise reporting instance decide whether | |
| 244 // the ARC user data wipe is still required or not. | |
| 245 reenable_arc_ = false; | |
| 246 VLOG(1) << "Reenable ARC"; | |
| 247 RequestEnableImpl(); | |
| 248 } | 182 } |
| 249 | 183 |
| 250 void ArcSessionManager::OnProvisioningFinished(ProvisioningResult result) { | 184 void ArcSessionManager::OnProvisioningFinished(ProvisioningResult result) { |
| 251 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 185 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 252 | 186 |
| 253 // If the Mojo message to notify finishing the provisioning is already sent | 187 // If the Mojo message to notify finishing the provisioning is already sent |
| 254 // from the container, it will be processed even after requesting to stop the | 188 // from the container, it will be processed even after requesting to stop the |
| 255 // container. Ignore all |result|s arriving while ARC is disabled, in order to | 189 // container. Ignore all |result|s arriving while ARC is disabled, in order to |
| 256 // avoid popping up an error message triggered below. This code intentionally | 190 // avoid popping up an error message triggered below. This code intentionally |
| 257 // does not support the case of reenabling. | 191 // does not support the case of reenabling. |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 | 318 |
| 385 if (result == ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED || | 319 if (result == ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED || |
| 386 result == ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT || | 320 result == ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT || |
| 387 result == ProvisioningResult::CLOUD_PROVISION_FLOW_INTERNAL_ERROR || | 321 result == ProvisioningResult::CLOUD_PROVISION_FLOW_INTERNAL_ERROR || |
| 388 // OVERALL_SIGN_IN_TIMEOUT might be an indication that ARC believes it is | 322 // OVERALL_SIGN_IN_TIMEOUT might be an indication that ARC believes it is |
| 389 // fully setup, but Chrome does not. | 323 // fully setup, but Chrome does not. |
| 390 result == ProvisioningResult::OVERALL_SIGN_IN_TIMEOUT || | 324 result == ProvisioningResult::OVERALL_SIGN_IN_TIMEOUT || |
| 391 // Just to be safe, remove data if we don't know the cause. | 325 // Just to be safe, remove data if we don't know the cause. |
| 392 result == ProvisioningResult::UNKNOWN_ERROR) { | 326 result == ProvisioningResult::UNKNOWN_ERROR) { |
| 393 VLOG(1) << "ARC provisioning failed permanently. Removing user data"; | 327 VLOG(1) << "ARC provisioning failed permanently. Removing user data"; |
| 394 RemoveArcData(); | 328 RequestArcDataRemoval(); |
| 395 } | 329 } |
| 396 | 330 |
| 397 // We'll delay shutting down the ARC instance in this case to allow people | 331 // We'll delay shutting down the ARC instance in this case to allow people |
| 398 // to send feedback. | 332 // to send feedback. |
| 399 if (support_host_) | 333 if (support_host_) |
| 400 support_host_->ShowError(error, true /* = show send feedback button */); | 334 support_host_->ShowError(error, true /* = show send feedback button */); |
| 401 } | 335 } |
| 402 | 336 |
| 403 void ArcSessionManager::SetState(State state) { | 337 void ArcSessionManager::SetState(State state) { |
| 404 state_ = state; | 338 state_ = state; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 SetState(State::STOPPED); | 375 SetState(State::STOPPED); |
| 442 | 376 |
| 443 context_ = base::MakeUnique<ArcAuthContext>(profile_); | 377 context_ = base::MakeUnique<ArcAuthContext>(profile_); |
| 444 | 378 |
| 445 if (!g_disable_ui_for_testing || | 379 if (!g_disable_ui_for_testing || |
| 446 g_enable_check_android_management_for_testing) { | 380 g_enable_check_android_management_for_testing) { |
| 447 ArcAndroidManagementChecker::StartClient(); | 381 ArcAndroidManagementChecker::StartClient(); |
| 448 } | 382 } |
| 449 | 383 |
| 450 // Chrome may be shut down before completing ARC data removal. | 384 // Chrome may be shut down before completing ARC data removal. |
| 451 // In such a case, start removing the data now. | 385 // For such a case, start removing the data now, if necessary. |
| 452 if (profile_->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)) { | 386 MaybeStartArcDataRemoval(); |
| 453 VLOG(1) << "ARC data removal requested in previous session."; | |
| 454 RemoveArcData(); | |
| 455 } | |
| 456 } | 387 } |
| 457 | 388 |
| 458 void ArcSessionManager::Shutdown() { | 389 void ArcSessionManager::Shutdown() { |
| 459 enable_requested_ = false; | 390 enable_requested_ = false; |
| 460 ShutdownSession(); | 391 ShutdownSession(); |
| 461 if (support_host_) { | 392 if (support_host_) { |
| 462 support_host_->Close(); | 393 support_host_->Close(); |
| 463 support_host_->RemoveObserver(this); | 394 support_host_->RemoveObserver(this); |
| 464 support_host_.reset(); | 395 support_host_.reset(); |
| 465 } | 396 } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 // OnBackgroundAndroidManagementChecked() synchronously (or | 530 // OnBackgroundAndroidManagementChecked() synchronously (or |
| 600 // asynchornously). In the callback, Google Play Store enabled preference | 531 // asynchornously). In the callback, Google Play Store enabled preference |
| 601 // can be set to false if managed, and it triggers RequestDisable() via | 532 // can be set to false if managed, and it triggers RequestDisable() via |
| 602 // ArcPlayStoreEnabledPreferenceHandler. | 533 // ArcPlayStoreEnabledPreferenceHandler. |
| 603 // Thus, StartArc() should be called so that disabling should work even | 534 // Thus, StartArc() should be called so that disabling should work even |
| 604 // if synchronous call case. | 535 // if synchronous call case. |
| 605 StartBackgroundAndroidManagementCheck(); | 536 StartBackgroundAndroidManagementCheck(); |
| 606 return; | 537 return; |
| 607 } | 538 } |
| 608 | 539 |
| 609 StartTermsOfServiceNegotiation(); | 540 MaybeStartTermsOfServiceNegotiation(); |
| 610 } | 541 } |
| 611 | 542 |
| 612 void ArcSessionManager::RequestDisable() { | 543 void ArcSessionManager::RequestDisable() { |
| 613 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 544 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 614 DCHECK(profile_); | 545 DCHECK(profile_); |
| 615 | 546 |
| 616 if (!enable_requested_) { | 547 if (!enable_requested_) { |
| 617 VLOG(1) << "ARC is already disabled. Do nothing."; | 548 VLOG(1) << "ARC is already disabled. Do nothing."; |
| 618 return; | 549 return; |
| 619 } | 550 } |
| 620 enable_requested_ = false; | 551 enable_requested_ = false; |
| 621 | 552 |
| 622 // Reset any pending request to re-enable ARC. | 553 // Reset any pending request to re-enable ARC. |
| 623 VLOG(1) << "ARC opt-out. Removing user data."; | |
| 624 reenable_arc_ = false; | 554 reenable_arc_ = false; |
| 625 StopArc(); | 555 StopArc(); |
| 626 RemoveArcData(); | 556 VLOG(1) << "ARC opt-out. Removing user data."; |
| 557 RequestArcDataRemoval(); |
| 627 } | 558 } |
| 628 | 559 |
| 629 void ArcSessionManager::StartTermsOfServiceNegotiation() { | 560 void ArcSessionManager::RequestArcDataRemoval() { |
| 561 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 562 DCHECK(profile_); |
| 563 // TODO(hidehiko): DCHECK the previous state. This is called for three cases; |
| 564 // 1) Supporting managed user initial disabled case (Please see also |
| 565 // ArcPlayStoreEnabledPreferenceHandler::Start() for details). |
| 566 // 2) Supporting enterprise triggered data removal. |
| 567 // 3) One called in OnProvisioningFinished(). |
| 568 // 4) On request disabling. |
| 569 // After the state machine is fixed, 2) should be replaced by |
| 570 // RequestDisable() immediately followed by RequestEnable(). |
| 571 // 3) and 4) are internal state transition. So, as for public interface, 1) |
| 572 // should be the only use case, and the |state_| should be limited to |
| 573 // STOPPED, then. |
| 574 // TODO(hidehiko): Think a way to get rid of 1), too. |
| 575 |
| 576 // Just remember the request in persistent data. The actual removal |
| 577 // is done via MaybeStartArcDataRemoval(). On completion (in |
| 578 // OnArcDataRemoved()), this flag should be reset. |
| 579 profile_->GetPrefs()->SetBoolean(prefs::kArcDataRemoveRequested, true); |
| 580 |
| 581 // To support 1) case above, maybe start data removal. |
| 582 if (state_ == State::STOPPED && arc_session_runner_->IsStopped()) |
| 583 MaybeStartArcDataRemoval(); |
| 584 } |
| 585 |
| 586 void ArcSessionManager::MaybeStartTermsOfServiceNegotiation() { |
| 630 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 587 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 631 DCHECK(profile_); | 588 DCHECK(profile_); |
| 632 DCHECK(!terms_of_service_negotiator_); | 589 DCHECK(!terms_of_service_negotiator_); |
| 633 // In Kiosk-mode, Terms of Service negotiation should be skipped. | 590 // In Kiosk-mode, Terms of Service negotiation should be skipped. |
| 634 // See also RequestEnableImpl(). | 591 // See also RequestEnableImpl(). |
| 635 DCHECK(!IsArcKioskMode()); | 592 DCHECK(!IsArcKioskMode()); |
| 636 // If opt-in verification is disabled, Terms of Service negotiation should | 593 // If opt-in verification is disabled, Terms of Service negotiation should |
| 637 // be skipped, too. See also RequestEnableImpl(). | 594 // be skipped, too. See also RequestEnableImpl(). |
| 638 DCHECK(!IsArcOptInVerificationDisabled()); | 595 DCHECK(!IsArcOptInVerificationDisabled()); |
| 639 | 596 |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 void ArcSessionManager::StopArc() { | 800 void ArcSessionManager::StopArc() { |
| 844 if (state_ != State::STOPPED) { | 801 if (state_ != State::STOPPED) { |
| 845 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); | 802 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); |
| 846 profile_->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, false); | 803 profile_->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, false); |
| 847 } | 804 } |
| 848 ShutdownSession(); | 805 ShutdownSession(); |
| 849 if (support_host_) | 806 if (support_host_) |
| 850 support_host_->Close(); | 807 support_host_->Close(); |
| 851 } | 808 } |
| 852 | 809 |
| 810 void ArcSessionManager::MaybeStartArcDataRemoval() { |
| 811 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 812 DCHECK(profile_); |
| 813 // Data removal cannot run in parallel with ARC session. |
| 814 DCHECK(arc_session_runner_->IsStopped()); |
| 815 |
| 816 // TODO(hidehiko): DCHECK the previous state, when the state machine is |
| 817 // fixed. |
| 818 SetState(State::REMOVING_DATA_DIR); |
| 819 |
| 820 // TODO(hidehiko): Extract the implementation of data removal, so that |
| 821 // shutdown can cancel the operation not to call OnArcDataRemoved callback. |
| 822 if (!profile_->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)) { |
| 823 // ARC data removal is not requested. Just move to the next state. |
| 824 MaybeReenableArc(); |
| 825 return; |
| 826 } |
| 827 |
| 828 VLOG(1) << "Starting ARC data removal"; |
| 829 |
| 830 // Remove Play user ID for Active Directory managed devices. |
| 831 profile_->GetPrefs()->SetString(prefs::kArcActiveDirectoryPlayUserId, |
| 832 std::string()); |
| 833 |
| 834 chromeos::DBusThreadManager::Get()->GetSessionManagerClient()->RemoveArcData( |
| 835 cryptohome::Identification( |
| 836 multi_user_util::GetAccountIdFromProfile(profile_)), |
| 837 base::Bind(&ArcSessionManager::OnArcDataRemoved, |
| 838 weak_ptr_factory_.GetWeakPtr())); |
| 839 } |
| 840 |
| 841 void ArcSessionManager::OnArcDataRemoved(bool success) { |
| 842 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 843 |
| 844 // TODO(khmel): Browser tests may shutdown profile by itself. Update browser |
| 845 // tests and remove this check. |
| 846 if (state() == State::NOT_INITIALIZED) |
| 847 return; |
| 848 |
| 849 DCHECK_EQ(state_, State::REMOVING_DATA_DIR); |
| 850 DCHECK(profile_); |
| 851 DCHECK(profile_->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)); |
| 852 if (success) { |
| 853 VLOG(1) << "ARC data removal successful"; |
| 854 } else { |
| 855 LOG(ERROR) << "Request for ARC user data removal failed. " |
| 856 << "See session_manager logs for more details."; |
| 857 } |
| 858 profile_->GetPrefs()->SetBoolean(prefs::kArcDataRemoveRequested, false); |
| 859 |
| 860 // Regardless of whether it is successfully done or not, notify observers. |
| 861 for (auto& observer : observer_list_) |
| 862 observer.OnArcDataRemoved(); |
| 863 |
| 864 MaybeReenableArc(); |
| 865 } |
| 866 |
| 867 void ArcSessionManager::MaybeReenableArc() { |
| 868 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 869 DCHECK_EQ(state_, State::REMOVING_DATA_DIR); |
| 870 SetState(State::STOPPED); |
| 871 |
| 872 // Here check if |reenable_arc_| is marked or not. |
| 873 // TODO(hidehiko): Conceptually |reenable_arc_| should be always false |
| 874 // if |enable_requested_| is false. Replace by DCHECK after state machine |
| 875 // fix is done. |
| 876 if (!reenable_arc_ || !enable_requested_) { |
| 877 // Reset the flag, just in case. TODO(hidehiko): Remove this. |
| 878 reenable_arc_ = false; |
| 879 return; |
| 880 } |
| 881 |
| 882 // Restart ARC anyway. Let the enterprise reporting instance decide whether |
| 883 // the ARC user data wipe is still required or not. |
| 884 reenable_arc_ = false; |
| 885 VLOG(1) << "Reenable ARC"; |
| 886 RequestEnableImpl(); |
| 887 } |
| 888 |
| 853 void ArcSessionManager::OnWindowClosed() { | 889 void ArcSessionManager::OnWindowClosed() { |
| 854 DCHECK(support_host_); | 890 DCHECK(support_host_); |
| 855 if (terms_of_service_negotiator_) { | 891 if (terms_of_service_negotiator_) { |
| 856 // In this case, ArcTermsOfServiceNegotiator should handle the case. | 892 // In this case, ArcTermsOfServiceNegotiator should handle the case. |
| 857 // Do nothing. | 893 // Do nothing. |
| 858 return; | 894 return; |
| 859 } | 895 } |
| 860 CancelAuthCode(); | 896 CancelAuthCode(); |
| 861 } | 897 } |
| 862 | 898 |
| 863 void ArcSessionManager::OnTermsAgreed(bool is_metrics_enabled, | 899 void ArcSessionManager::OnTermsAgreed(bool is_metrics_enabled, |
| 864 bool is_backup_and_restore_enabled, | 900 bool is_backup_and_restore_enabled, |
| 865 bool is_location_service_enabled) { | 901 bool is_location_service_enabled) { |
| 866 DCHECK(support_host_); | 902 DCHECK(support_host_); |
| 867 DCHECK(terms_of_service_negotiator_); | 903 DCHECK(terms_of_service_negotiator_); |
| 868 // This should be handled in ArcTermsOfServiceNegotiator. Do nothing here. | 904 // This should be handled in ArcTermsOfServiceNegotiator. Do nothing here. |
| 869 } | 905 } |
| 870 | 906 |
| 871 void ArcSessionManager::OnRetryClicked() { | 907 void ArcSessionManager::OnRetryClicked() { |
| 872 DCHECK(support_host_); | 908 DCHECK(support_host_); |
| 873 | 909 |
| 874 UpdateOptInActionUMA(OptInActionType::RETRY); | 910 UpdateOptInActionUMA(OptInActionType::RETRY); |
| 875 | 911 |
| 876 // TODO(hidehiko): Simplify the retry logic. | 912 // TODO(hidehiko): Simplify the retry logic. |
| 877 if (terms_of_service_negotiator_) { | 913 if (terms_of_service_negotiator_) { |
| 878 // Currently Terms of service is shown. ArcTermsOfServiceNegotiator should | 914 // Currently Terms of service is shown. ArcTermsOfServiceNegotiator should |
| 879 // handle this. | 915 // handle this. |
| 880 } else if (!profile_->GetPrefs()->GetBoolean(prefs::kArcTermsAccepted)) { | 916 } else if (!profile_->GetPrefs()->GetBoolean(prefs::kArcTermsAccepted)) { |
| 881 StartTermsOfServiceNegotiation(); | 917 MaybeStartTermsOfServiceNegotiation(); |
| 882 } else if (support_host_->ui_page() == ArcSupportHost::UIPage::ERROR && | 918 } else if (support_host_->ui_page() == ArcSupportHost::UIPage::ERROR && |
| 883 !arc_session_runner_->IsStopped()) { | 919 !arc_session_runner_->IsStopped()) { |
| 884 // ERROR_WITH_FEEDBACK is set in OnSignInFailed(). In the case, stopping | 920 // ERROR_WITH_FEEDBACK is set in OnSignInFailed(). In the case, stopping |
| 885 // ARC was postponed to contain its internal state into the report. | 921 // ARC was postponed to contain its internal state into the report. |
| 886 // Here, on retry, stop it, then restart. | 922 // Here, on retry, stop it, then restart. |
| 887 DCHECK_EQ(State::ACTIVE, state_); | 923 DCHECK_EQ(State::ACTIVE, state_); |
| 888 support_host_->ShowArcLoading(); | 924 support_host_->ShowArcLoading(); |
| 889 ShutdownSession(); | 925 ShutdownSession(); |
| 890 reenable_arc_ = true; | 926 reenable_arc_ = true; |
| 891 } else if (state_ == State::ACTIVE) { | 927 } else if (state_ == State::ACTIVE) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 | 973 |
| 938 #undef MAP_STATE | 974 #undef MAP_STATE |
| 939 | 975 |
| 940 // Some compilers report an error even if all values of an enum-class are | 976 // Some compilers report an error even if all values of an enum-class are |
| 941 // covered exhaustively in a switch statement. | 977 // covered exhaustively in a switch statement. |
| 942 NOTREACHED() << "Invalid value " << static_cast<int>(state); | 978 NOTREACHED() << "Invalid value " << static_cast<int>(state); |
| 943 return os; | 979 return os; |
| 944 } | 980 } |
| 945 | 981 |
| 946 } // namespace arc | 982 } // namespace arc |
| OLD | NEW |