| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/login/wizard_controller.h" | 5 #include "chrome/browser/chromeos/login/wizard_controller.h" |
| 6 | 6 |
| 7 #include <signal.h> | 7 #include <signal.h> |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 #include <sys/types.h> | 9 #include <sys/types.h> |
| 10 | 10 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 #include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_sc
reen.h" | 34 #include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_sc
reen.h" |
| 35 #include "chrome/browser/chromeos/login/oobe_display.h" | 35 #include "chrome/browser/chromeos/login/oobe_display.h" |
| 36 #include "chrome/browser/chromeos/login/screens/error_screen.h" | 36 #include "chrome/browser/chromeos/login/screens/error_screen.h" |
| 37 #include "chrome/browser/chromeos/login/screens/eula_screen.h" | 37 #include "chrome/browser/chromeos/login/screens/eula_screen.h" |
| 38 #include "chrome/browser/chromeos/login/screens/network_screen.h" | 38 #include "chrome/browser/chromeos/login/screens/network_screen.h" |
| 39 #include "chrome/browser/chromeos/login/screens/reset_screen.h" | 39 #include "chrome/browser/chromeos/login/screens/reset_screen.h" |
| 40 #include "chrome/browser/chromeos/login/screens/terms_of_service_screen.h" | 40 #include "chrome/browser/chromeos/login/screens/terms_of_service_screen.h" |
| 41 #include "chrome/browser/chromeos/login/screens/update_screen.h" | 41 #include "chrome/browser/chromeos/login/screens/update_screen.h" |
| 42 #include "chrome/browser/chromeos/login/screens/user_image_screen.h" | 42 #include "chrome/browser/chromeos/login/screens/user_image_screen.h" |
| 43 #include "chrome/browser/chromeos/login/screens/wrong_hwid_screen.h" | 43 #include "chrome/browser/chromeos/login/screens/wrong_hwid_screen.h" |
| 44 #include "chrome/browser/chromeos/login/startup_utils.h" |
| 44 #include "chrome/browser/chromeos/login/user_manager.h" | 45 #include "chrome/browser/chromeos/login/user_manager.h" |
| 45 #include "chrome/browser/chromeos/net/network_portal_detector.h" | 46 #include "chrome/browser/chromeos/net/network_portal_detector.h" |
| 46 #include "chrome/browser/chromeos/settings/cros_settings.h" | 47 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 47 #include "chrome/browser/chromeos/settings/cros_settings_names.h" | 48 #include "chrome/browser/chromeos/settings/cros_settings_names.h" |
| 48 #include "chrome/browser/profiles/profile.h" | 49 #include "chrome/browser/profiles/profile.h" |
| 49 #include "chrome/browser/profiles/profile_manager.h" | 50 #include "chrome/browser/profiles/profile_manager.h" |
| 50 #include "chrome/browser/ui/options/options_util.h" | 51 #include "chrome/browser/ui/options/options_util.h" |
| 51 #include "chrome/common/chrome_notification_types.h" | 52 #include "chrome/common/chrome_notification_types.h" |
| 52 #include "chrome/common/pref_names.h" | 53 #include "chrome/common/pref_names.h" |
| 53 #include "chromeos/dbus/dbus_thread_manager.h" | 54 #include "chromeos/dbus/dbus_thread_manager.h" |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 NOTREACHED() << "More than one controller are alive."; | 169 NOTREACHED() << "More than one controller are alive."; |
| 169 } | 170 } |
| 170 } | 171 } |
| 171 | 172 |
| 172 void WizardController::Init(const std::string& first_screen_name, | 173 void WizardController::Init(const std::string& first_screen_name, |
| 173 base::DictionaryValue* screen_parameters) { | 174 base::DictionaryValue* screen_parameters) { |
| 174 VLOG(1) << "Starting OOBE wizard with screen: " << first_screen_name; | 175 VLOG(1) << "Starting OOBE wizard with screen: " << first_screen_name; |
| 175 first_screen_name_ = first_screen_name; | 176 first_screen_name_ = first_screen_name; |
| 176 screen_parameters_.reset(screen_parameters); | 177 screen_parameters_.reset(screen_parameters); |
| 177 | 178 |
| 178 bool oobe_complete = IsOobeCompleted(); | 179 bool oobe_complete = StartupUtils::IsOobeCompleted(); |
| 179 if (!oobe_complete || first_screen_name == kOutOfBoxScreenName) { | 180 if (!oobe_complete || first_screen_name == kOutOfBoxScreenName) { |
| 180 is_out_of_box_ = true; | 181 is_out_of_box_ = true; |
| 181 } | 182 } |
| 182 | 183 |
| 183 AdvanceToScreen(first_screen_name); | 184 AdvanceToScreen(first_screen_name); |
| 184 content::NotificationService::current()->Notify( | 185 content::NotificationService::current()->Notify( |
| 185 chrome::NOTIFICATION_WIZARD_FIRST_SCREEN_SHOWN, | 186 chrome::NOTIFICATION_WIZARD_FIRST_SCREEN_SHOWN, |
| 186 content::NotificationService::AllSources(), | 187 content::NotificationService::AllSources(), |
| 187 content::NotificationService::NoDetails()); | 188 content::NotificationService::NoDetails()); |
| 188 if (!IsMachineHWIDCorrect() && !IsDeviceRegistered() && | 189 if (!IsMachineHWIDCorrect() && !StartupUtils::IsDeviceRegistered() && |
| 189 first_screen_name.empty()) | 190 first_screen_name.empty()) |
| 190 ShowWrongHWIDScreen(); | 191 ShowWrongHWIDScreen(); |
| 191 } | 192 } |
| 192 | 193 |
| 193 chromeos::NetworkScreen* WizardController::GetNetworkScreen() { | 194 chromeos::NetworkScreen* WizardController::GetNetworkScreen() { |
| 194 if (!network_screen_.get()) | 195 if (!network_screen_.get()) |
| 195 network_screen_.reset(new chromeos::NetworkScreen( | 196 network_screen_.reset(new chromeos::NetworkScreen( |
| 196 this, oobe_display_->GetNetworkScreenActor())); | 197 this, oobe_display_->GetNetworkScreenActor())); |
| 197 return network_screen_.get(); | 198 return network_screen_.get(); |
| 198 } | 199 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 | 384 |
| 384 void WizardController::ShowLocallyManagedUserCreationScreen() { | 385 void WizardController::ShowLocallyManagedUserCreationScreen() { |
| 385 VLOG(1) << "Showing Locally managed user creation screen screen."; | 386 VLOG(1) << "Showing Locally managed user creation screen screen."; |
| 386 SetStatusAreaVisible(true); | 387 SetStatusAreaVisible(true); |
| 387 LocallyManagedUserCreationScreen* screen = | 388 LocallyManagedUserCreationScreen* screen = |
| 388 GetLocallyManagedUserCreationScreen(); | 389 GetLocallyManagedUserCreationScreen(); |
| 389 SetCurrentScreen(screen); | 390 SetCurrentScreen(screen); |
| 390 } | 391 } |
| 391 | 392 |
| 392 void WizardController::SkipToLoginForTesting() { | 393 void WizardController::SkipToLoginForTesting() { |
| 393 MarkEulaAccepted(); | 394 StartupUtils::MarkEulaAccepted(); |
| 394 PerformPostEulaActions(); | 395 PerformPostEulaActions(); |
| 395 PerformPostUpdateActions(); | 396 PerformPostUpdateActions(); |
| 396 ShowLoginScreen(); | 397 ShowLoginScreen(); |
| 397 } | 398 } |
| 398 | 399 |
| 399 void WizardController::SkipPostLoginScreensForTesting() { | 400 void WizardController::SkipPostLoginScreensForTesting() { |
| 400 skip_post_login_screens_ = true; | 401 skip_post_login_screens_ = true; |
| 401 } | 402 } |
| 402 | 403 |
| 403 void WizardController::AddObserver(Observer* observer) { | 404 void WizardController::AddObserver(Observer* observer) { |
| 404 observer_list_.AddObserver(observer); | 405 observer_list_.AddObserver(observer); |
| 405 } | 406 } |
| 406 | 407 |
| 407 void WizardController::RemoveObserver(Observer* observer) { | 408 void WizardController::RemoveObserver(Observer* observer) { |
| 408 observer_list_.RemoveObserver(observer); | 409 observer_list_.RemoveObserver(observer); |
| 409 } | 410 } |
| 410 | 411 |
| 411 void WizardController::OnSessionStart() { | 412 void WizardController::OnSessionStart() { |
| 412 FOR_EACH_OBSERVER(Observer, observer_list_, OnSessionStart()); | 413 FOR_EACH_OBSERVER(Observer, observer_list_, OnSessionStart()); |
| 413 } | 414 } |
| 414 | 415 |
| 415 void WizardController::SkipUpdateEnrollAfterEula() { | 416 void WizardController::SkipUpdateEnrollAfterEula() { |
| 416 skip_update_enroll_after_eula_ = true; | 417 skip_update_enroll_after_eula_ = true; |
| 417 } | 418 } |
| 418 | 419 |
| 419 // static | |
| 420 void WizardController::RegisterPrefs(PrefRegistrySimple* registry) { | |
| 421 registry->RegisterBooleanPref(kOobeComplete, false); | |
| 422 registry->RegisterIntegerPref(kDeviceRegistered, -1); | |
| 423 registry->RegisterBooleanPref(prefs::kEulaAccepted, false); | |
| 424 registry->RegisterStringPref(kInitialLocale, "en-US"); | |
| 425 } | |
| 426 | |
| 427 /////////////////////////////////////////////////////////////////////////////// | 420 /////////////////////////////////////////////////////////////////////////////// |
| 428 // WizardController, ExitHandlers: | 421 // WizardController, ExitHandlers: |
| 429 void WizardController::OnNetworkConnected() { | 422 void WizardController::OnNetworkConnected() { |
| 430 if (is_official_build_) { | 423 if (is_official_build_) { |
| 431 if (!IsEulaAccepted()) { | 424 if (!StartupUtils::IsEulaAccepted()) { |
| 432 ShowEulaScreen(); | 425 ShowEulaScreen(); |
| 433 } else { | 426 } else { |
| 434 // Possible cases: | 427 // Possible cases: |
| 435 // 1. EULA was accepted, forced shutdown/reboot during update. | 428 // 1. EULA was accepted, forced shutdown/reboot during update. |
| 436 // 2. EULA was accepted, planned reboot after update. | 429 // 2. EULA was accepted, planned reboot after update. |
| 437 // Make sure that device is up-to-date. | 430 // Make sure that device is up-to-date. |
| 438 InitiateOOBEUpdate(); | 431 InitiateOOBEUpdate(); |
| 439 } | 432 } |
| 440 } else { | 433 } else { |
| 441 InitiateOOBEUpdate(); | 434 InitiateOOBEUpdate(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 452 // TODO(dpolukhin): show error message after login screen is displayed. | 445 // TODO(dpolukhin): show error message after login screen is displayed. |
| 453 ShowLoginScreen(); | 446 ShowLoginScreen(); |
| 454 } | 447 } |
| 455 | 448 |
| 456 void WizardController::OnUpdateCompleted() { | 449 void WizardController::OnUpdateCompleted() { |
| 457 OnOOBECompleted(); | 450 OnOOBECompleted(); |
| 458 } | 451 } |
| 459 | 452 |
| 460 void WizardController::OnEulaAccepted() { | 453 void WizardController::OnEulaAccepted() { |
| 461 time_eula_accepted_ = base::Time::Now(); | 454 time_eula_accepted_ = base::Time::Now(); |
| 462 MarkEulaAccepted(); | 455 StartupUtils::MarkEulaAccepted(); |
| 463 bool uma_enabled = | 456 bool uma_enabled = |
| 464 OptionsUtil::ResolveMetricsReportingEnabled(usage_statistics_reporting_); | 457 OptionsUtil::ResolveMetricsReportingEnabled(usage_statistics_reporting_); |
| 465 | 458 |
| 466 content::NotificationService::current()->Notify( | 459 content::NotificationService::current()->Notify( |
| 467 chrome::NOTIFICATION_WIZARD_EULA_ACCEPTED, | 460 chrome::NOTIFICATION_WIZARD_EULA_ACCEPTED, |
| 468 content::NotificationSource(content::Source<WizardController>(this)), | 461 content::NotificationSource(content::Source<WizardController>(this)), |
| 469 content::NotificationService::NoDetails()); | 462 content::NotificationService::NoDetails()); |
| 470 | 463 |
| 471 CrosSettings::Get()->SetBoolean(kStatsReportingPref, uma_enabled); | 464 CrosSettings::Get()->SetBoolean(kStatsReportingPref, uma_enabled); |
| 472 if (uma_enabled) { | 465 if (uma_enabled) { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 // ChromiumOS builds would go though this code path too. | 575 // ChromiumOS builds would go though this code path too. |
| 583 chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> | 576 chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> |
| 584 SetDefaultCheckPortalList(); | 577 SetDefaultCheckPortalList(); |
| 585 host_->CheckForAutoEnrollment(); | 578 host_->CheckForAutoEnrollment(); |
| 586 NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance(); | 579 NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance(); |
| 587 if (NetworkPortalDetector::IsEnabledInCommandLine() && detector) | 580 if (NetworkPortalDetector::IsEnabledInCommandLine() && detector) |
| 588 detector->Enable(true); | 581 detector->Enable(true); |
| 589 } | 582 } |
| 590 | 583 |
| 591 void WizardController::PerformPostUpdateActions() { | 584 void WizardController::PerformPostUpdateActions() { |
| 592 MarkOobeCompleted(); | 585 StartupUtils::MarkOobeCompleted(); |
| 593 } | 586 } |
| 594 | 587 |
| 595 void WizardController::SetCurrentScreen(WizardScreen* new_current) { | 588 void WizardController::SetCurrentScreen(WizardScreen* new_current) { |
| 596 SetCurrentScreenSmooth(new_current, false); | 589 SetCurrentScreenSmooth(new_current, false); |
| 597 } | 590 } |
| 598 | 591 |
| 599 void WizardController::ShowCurrentScreen() { | 592 void WizardController::ShowCurrentScreen() { |
| 600 // ShowCurrentScreen may get called by smooth_show_timer_ even after | 593 // ShowCurrentScreen may get called by smooth_show_timer_ even after |
| 601 // flow has been switched to sign in screen (ExistingUserController). | 594 // flow has been switched to sign in screen (ExistingUserController). |
| 602 if (!oobe_display_) | 595 if (!oobe_display_) |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 670 ShowLocallyManagedUserCreationScreen(); | 663 ShowLocallyManagedUserCreationScreen(); |
| 671 } else if (screen_name != kTestNoScreenName) { | 664 } else if (screen_name != kTestNoScreenName) { |
| 672 if (is_out_of_box_) { | 665 if (is_out_of_box_) { |
| 673 ShowNetworkScreen(); | 666 ShowNetworkScreen(); |
| 674 } else { | 667 } else { |
| 675 ShowLoginScreen(); | 668 ShowLoginScreen(); |
| 676 } | 669 } |
| 677 } | 670 } |
| 678 } | 671 } |
| 679 | 672 |
| 680 // static | |
| 681 bool WizardController::IsEulaAccepted() { | |
| 682 return g_browser_process->local_state()->GetBoolean(prefs::kEulaAccepted); | |
| 683 } | |
| 684 | |
| 685 // static | |
| 686 bool WizardController::IsOobeCompleted() { | |
| 687 return g_browser_process->local_state()->GetBoolean(kOobeComplete); | |
| 688 } | |
| 689 | |
| 690 // static | |
| 691 void WizardController::MarkEulaAccepted() { | |
| 692 SaveBoolPreferenceForced(prefs::kEulaAccepted, true); | |
| 693 } | |
| 694 | |
| 695 // static | |
| 696 void WizardController::MarkOobeCompleted() { | |
| 697 SaveBoolPreferenceForced(kOobeComplete, true); | |
| 698 } | |
| 699 | |
| 700 // Returns the path to flag file indicating that both parts of OOBE were | |
| 701 // completed. | |
| 702 // On chrome device, returns /home/chronos/.oobe_completed. | |
| 703 // On Linux desktop, returns $HOME/.oobe_completed. | |
| 704 static base::FilePath GetOobeCompleteFlagPath() { | |
| 705 // The constant is defined here so it won't be referenced directly. | |
| 706 const char kOobeCompleteFlagFilePath[] = "/home/chronos/.oobe_completed"; | |
| 707 | |
| 708 if (base::chromeos::IsRunningOnChromeOS()) { | |
| 709 return base::FilePath(kOobeCompleteFlagFilePath); | |
| 710 } else { | |
| 711 const char* home = getenv("HOME"); | |
| 712 // Unlikely but if HOME is not defined, use the current directory. | |
| 713 if (!home) | |
| 714 home = ""; | |
| 715 return base::FilePath(home).AppendASCII(".oobe_completed"); | |
| 716 } | |
| 717 } | |
| 718 | |
| 719 static void CreateOobeCompleteFlagFile() { | |
| 720 // Create flag file for boot-time init scripts. | |
| 721 base::FilePath oobe_complete_path = GetOobeCompleteFlagPath(); | |
| 722 if (!file_util::PathExists(oobe_complete_path)) { | |
| 723 FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b"); | |
| 724 if (oobe_flag_file == NULL) | |
| 725 DLOG(WARNING) << oobe_complete_path.value() << " doesn't exist."; | |
| 726 else | |
| 727 file_util::CloseFile(oobe_flag_file); | |
| 728 } | |
| 729 } | |
| 730 | |
| 731 // static | |
| 732 bool WizardController::IsDeviceRegistered() { | |
| 733 int value = g_browser_process->local_state()->GetInteger(kDeviceRegistered); | |
| 734 if (value > 0) { | |
| 735 // Recreate flag file in case it was lost. | |
| 736 BrowserThread::PostTask( | |
| 737 BrowserThread::FILE, | |
| 738 FROM_HERE, | |
| 739 base::Bind(&CreateOobeCompleteFlagFile)); | |
| 740 return true; | |
| 741 } else if (value == 0) { | |
| 742 return false; | |
| 743 } else { | |
| 744 // Pref is not set. For compatibility check flag file. It causes blocking | |
| 745 // IO on UI thread. But it's required for update from old versions. | |
| 746 base::ThreadRestrictions::ScopedAllowIO allow_io; | |
| 747 base::FilePath oobe_complete_flag_file_path = GetOobeCompleteFlagPath(); | |
| 748 bool file_exists = file_util::PathExists(oobe_complete_flag_file_path); | |
| 749 SaveIntegerPreferenceForced(kDeviceRegistered, file_exists ? 1 : 0); | |
| 750 return file_exists; | |
| 751 } | |
| 752 } | |
| 753 | |
| 754 // static | |
| 755 void WizardController::MarkDeviceRegistered() { | |
| 756 SaveIntegerPreferenceForced(kDeviceRegistered, 1); | |
| 757 BrowserThread::PostTask( | |
| 758 BrowserThread::FILE, | |
| 759 FROM_HERE, | |
| 760 base::Bind(&CreateOobeCompleteFlagFile)); | |
| 761 } | |
| 762 | |
| 763 // static | |
| 764 std::string WizardController::GetInitialLocale() { | |
| 765 std::string locale = | |
| 766 g_browser_process->local_state()->GetString(kInitialLocale); | |
| 767 if (!l10n_util::IsValidLocaleSyntax(locale)) | |
| 768 locale = "en-US"; | |
| 769 return locale; | |
| 770 } | |
| 771 | |
| 772 // static | |
| 773 void WizardController::SetInitialLocale(const std::string& locale) { | |
| 774 if (l10n_util::IsValidLocaleSyntax(locale)) | |
| 775 SaveStringPreferenceForced(kInitialLocale, locale); | |
| 776 else | |
| 777 NOTREACHED(); | |
| 778 } | |
| 779 | |
| 780 /////////////////////////////////////////////////////////////////////////////// | 673 /////////////////////////////////////////////////////////////////////////////// |
| 781 // WizardController, chromeos::ScreenObserver overrides: | 674 // WizardController, chromeos::ScreenObserver overrides: |
| 782 void WizardController::OnExit(ExitCodes exit_code) { | 675 void WizardController::OnExit(ExitCodes exit_code) { |
| 783 LOG(INFO) << "Wizard screen exit code: " << exit_code; | 676 LOG(INFO) << "Wizard screen exit code: " << exit_code; |
| 784 switch (exit_code) { | 677 switch (exit_code) { |
| 785 case NETWORK_CONNECTED: | 678 case NETWORK_CONNECTED: |
| 786 OnNetworkConnected(); | 679 OnNetworkConnected(); |
| 787 break; | 680 break; |
| 788 case CONNECTION_FAILED: | 681 case CONNECTION_FAILED: |
| 789 OnConnectionFailed(); | 682 OnConnectionFailed(); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 return zero_delay_enabled_; | 761 return zero_delay_enabled_; |
| 869 } | 762 } |
| 870 | 763 |
| 871 // static | 764 // static |
| 872 void WizardController::SetZeroDelays() { | 765 void WizardController::SetZeroDelays() { |
| 873 kShowDelayMs = 0; | 766 kShowDelayMs = 0; |
| 874 zero_delay_enabled_ = true; | 767 zero_delay_enabled_ = true; |
| 875 } | 768 } |
| 876 | 769 |
| 877 } // namespace chromeos | 770 } // namespace chromeos |
| OLD | NEW |