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 |