| 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 #include "components/pairing/bluetooth_host_pairing_controller.h" | 78 #include "components/pairing/bluetooth_host_pairing_controller.h" |
| 79 #include "components/pairing/shark_connection_listener.h" | 79 #include "components/pairing/shark_connection_listener.h" |
| 80 #include "components/user_manager/user_manager.h" | 80 #include "components/user_manager/user_manager.h" |
| 81 #include "content/public/browser/browser_thread.h" | 81 #include "content/public/browser/browser_thread.h" |
| 82 #include "content/public/browser/notification_types.h" | 82 #include "content/public/browser/notification_types.h" |
| 83 #include "ui/base/accelerators/accelerator.h" | 83 #include "ui/base/accelerators/accelerator.h" |
| 84 | 84 |
| 85 using content::BrowserThread; | 85 using content::BrowserThread; |
| 86 | 86 |
| 87 namespace { | 87 namespace { |
| 88 // If reboot didn't happen, ask user to reboot device manually. | |
| 89 const int kWaitForRebootTimeSec = 3; | |
| 90 | |
| 91 // Interval in ms which is used for smooth screen showing. | 88 // Interval in ms which is used for smooth screen showing. |
| 92 static int kShowDelayMs = 400; | 89 static int kShowDelayMs = 400; |
| 93 | 90 |
| 94 // Total timezone resolving process timeout. | 91 // Total timezone resolving process timeout. |
| 95 const unsigned int kResolveTimeZoneTimeoutSeconds = 60; | 92 const unsigned int kResolveTimeZoneTimeoutSeconds = 60; |
| 96 | 93 |
| 97 // Stores the list of all screens that should be shown when resuming OOBE. | 94 // Stores the list of all screens that should be shown when resuming OOBE. |
| 98 const char *kResumableScreens[] = { | 95 const char *kResumableScreens[] = { |
| 99 chromeos::WizardController::kNetworkScreenName, | 96 chromeos::WizardController::kNetworkScreenName, |
| 100 chromeos::WizardController::kUpdateScreenName, | 97 chromeos::WizardController::kUpdateScreenName, |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 bool WizardController::skip_post_login_screens_ = false; | 184 bool WizardController::skip_post_login_screens_ = false; |
| 188 | 185 |
| 189 // static | 186 // static |
| 190 bool WizardController::zero_delay_enabled_ = false; | 187 bool WizardController::zero_delay_enabled_ = false; |
| 191 | 188 |
| 192 /////////////////////////////////////////////////////////////////////////////// | 189 /////////////////////////////////////////////////////////////////////////////// |
| 193 // WizardController, public: | 190 // WizardController, public: |
| 194 | 191 |
| 195 PrefService* WizardController::local_state_for_testing_ = NULL; | 192 PrefService* WizardController::local_state_for_testing_ = NULL; |
| 196 | 193 |
| 197 WizardController::WizardController(chromeos::LoginDisplayHost* host, | 194 WizardController::WizardController(LoginDisplayHost* host, |
| 198 chromeos::OobeDisplay* oobe_display) | 195 OobeDisplay* oobe_display) |
| 199 : current_screen_(NULL), | 196 : current_screen_(NULL), |
| 200 previous_screen_(NULL), | 197 previous_screen_(NULL), |
| 201 #if defined(GOOGLE_CHROME_BUILD) | 198 #if defined(GOOGLE_CHROME_BUILD) |
| 202 is_official_build_(true), | 199 is_official_build_(true), |
| 203 #else | 200 #else |
| 204 is_official_build_(false), | 201 is_official_build_(false), |
| 205 #endif | 202 #endif |
| 206 is_out_of_box_(false), | 203 is_out_of_box_(false), |
| 207 host_(host), | 204 host_(host), |
| 208 oobe_display_(oobe_display), | 205 oobe_display_(oobe_display), |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 first_screen_name == WizardController::kTestNoScreenName)) { | 270 first_screen_name == WizardController::kTestNoScreenName)) { |
| 274 first_screen_name_ = screen_pref; | 271 first_screen_name_ = screen_pref; |
| 275 } | 272 } |
| 276 | 273 |
| 277 AdvanceToScreen(first_screen_name_); | 274 AdvanceToScreen(first_screen_name_); |
| 278 if (!IsMachineHWIDCorrect() && !StartupUtils::IsDeviceRegistered() && | 275 if (!IsMachineHWIDCorrect() && !StartupUtils::IsDeviceRegistered() && |
| 279 first_screen_name_.empty()) | 276 first_screen_name_.empty()) |
| 280 ShowWrongHWIDScreen(); | 277 ShowWrongHWIDScreen(); |
| 281 } | 278 } |
| 282 | 279 |
| 283 chromeos::ErrorScreen* WizardController::GetErrorScreen() { | 280 ErrorScreen* WizardController::GetErrorScreen() { |
| 284 return static_cast<chromeos::ErrorScreen*>(GetScreen(kErrorScreenName)); | 281 return static_cast<ErrorScreen*>(GetScreen(kErrorScreenName)); |
| 285 } | 282 } |
| 286 | 283 |
| 287 BaseScreen* WizardController::CreateScreen(const std::string& screen_name) { | 284 BaseScreen* WizardController::CreateScreen(const std::string& screen_name) { |
| 288 if (screen_name == kNetworkScreenName) { | 285 if (screen_name == kNetworkScreenName) { |
| 289 scoped_ptr<NetworkScreen> screen(new chromeos::NetworkScreen( | 286 scoped_ptr<NetworkScreen> screen( |
| 290 this, this, oobe_display_->GetNetworkView())); | 287 new NetworkScreen(this, this, oobe_display_->GetNetworkView())); |
| 291 screen->Initialize(nullptr /* context */); | 288 screen->Initialize(nullptr /* context */); |
| 292 return screen.release(); | 289 return screen.release(); |
| 293 } else if (screen_name == kErrorScreenName) { | 290 } else if (screen_name == kErrorScreenName) { |
| 294 return new chromeos::ErrorScreen(this, | 291 return new ErrorScreen(this, oobe_display_->GetErrorScreenActor()); |
| 295 oobe_display_->GetErrorScreenActor()); | |
| 296 } else if (screen_name == kUpdateScreenName) { | 292 } else if (screen_name == kUpdateScreenName) { |
| 297 chromeos::UpdateScreen* result = | 293 scoped_ptr<UpdateScreen> screen(new UpdateScreen( |
| 298 new chromeos::UpdateScreen(this, | 294 this, oobe_display_->GetUpdateView(), remora_controller_.get())); |
| 299 oobe_display_->GetUpdateScreenActor(), | 295 screen->Initialize(nullptr /* context */); |
| 300 remora_controller_.get()); | 296 return screen.release(); |
| 301 result->SetRebootCheckDelay(kWaitForRebootTimeSec); | |
| 302 return result; | |
| 303 } else if (screen_name == kUserImageScreenName) { | 297 } else if (screen_name == kUserImageScreenName) { |
| 304 return new chromeos::UserImageScreen(this, | 298 return new UserImageScreen(this, oobe_display_->GetUserImageView()); |
| 305 oobe_display_->GetUserImageView()); | |
| 306 } else if (screen_name == kEulaScreenName) { | 299 } else if (screen_name == kEulaScreenName) { |
| 307 return new chromeos::EulaScreen(this, this, oobe_display_->GetEulaView()); | 300 return new EulaScreen(this, this, oobe_display_->GetEulaView()); |
| 308 } else if (screen_name == kEnrollmentScreenName) { | 301 } else if (screen_name == kEnrollmentScreenName) { |
| 309 return new chromeos::EnrollmentScreen( | 302 return new EnrollmentScreen(this, |
| 310 this, oobe_display_->GetEnrollmentScreenActor()); | 303 oobe_display_->GetEnrollmentScreenActor()); |
| 311 } else if (screen_name == kResetScreenName) { | 304 } else if (screen_name == kResetScreenName) { |
| 312 return new chromeos::ResetScreen(this, | 305 return new ResetScreen(this, oobe_display_->GetResetScreenActor()); |
| 313 oobe_display_->GetResetScreenActor()); | |
| 314 } else if (screen_name == kEnableDebuggingScreenName) { | 306 } else if (screen_name == kEnableDebuggingScreenName) { |
| 315 return new chromeos::EnableDebuggingScreen( | 307 return new EnableDebuggingScreen( |
| 316 this, | 308 this, oobe_display_->GetEnableDebuggingScreenActor()); |
| 317 oobe_display_->GetEnableDebuggingScreenActor()); | |
| 318 } else if (screen_name == kKioskEnableScreenName) { | 309 } else if (screen_name == kKioskEnableScreenName) { |
| 319 return new chromeos::KioskEnableScreen( | 310 return new KioskEnableScreen(this, |
| 320 this, oobe_display_->GetKioskEnableScreenActor()); | 311 oobe_display_->GetKioskEnableScreenActor()); |
| 321 } else if (screen_name == kKioskAutolaunchScreenName) { | 312 } else if (screen_name == kKioskAutolaunchScreenName) { |
| 322 return new chromeos::KioskAutolaunchScreen( | 313 return new KioskAutolaunchScreen( |
| 323 this, oobe_display_->GetKioskAutolaunchScreenActor()); | 314 this, oobe_display_->GetKioskAutolaunchScreenActor()); |
| 324 } else if (screen_name == kTermsOfServiceScreenName) { | 315 } else if (screen_name == kTermsOfServiceScreenName) { |
| 325 return new chromeos::TermsOfServiceScreen( | 316 return new TermsOfServiceScreen( |
| 326 this, oobe_display_->GetTermsOfServiceScreenActor()); | 317 this, oobe_display_->GetTermsOfServiceScreenActor()); |
| 327 } else if (screen_name == kWrongHWIDScreenName) { | 318 } else if (screen_name == kWrongHWIDScreenName) { |
| 328 return new chromeos::WrongHWIDScreen( | 319 return new WrongHWIDScreen(this, oobe_display_->GetWrongHWIDScreenActor()); |
| 329 this, oobe_display_->GetWrongHWIDScreenActor()); | |
| 330 } else if (screen_name == kSupervisedUserCreationScreenName) { | 320 } else if (screen_name == kSupervisedUserCreationScreenName) { |
| 331 return new chromeos::SupervisedUserCreationScreen( | 321 return new SupervisedUserCreationScreen( |
| 332 this, oobe_display_->GetSupervisedUserCreationScreenActor()); | 322 this, oobe_display_->GetSupervisedUserCreationScreenActor()); |
| 333 } else if (screen_name == kHIDDetectionScreenName) { | 323 } else if (screen_name == kHIDDetectionScreenName) { |
| 334 return new chromeos::HIDDetectionScreen( | 324 return new HIDDetectionScreen(this, |
| 335 this, oobe_display_->GetHIDDetectionScreenActor()); | 325 oobe_display_->GetHIDDetectionScreenActor()); |
| 336 } else if (screen_name == kAutoEnrollmentCheckScreenName) { | 326 } else if (screen_name == kAutoEnrollmentCheckScreenName) { |
| 337 return new chromeos::AutoEnrollmentCheckScreen( | 327 return new AutoEnrollmentCheckScreen( |
| 338 this, oobe_display_->GetAutoEnrollmentCheckScreenActor()); | 328 this, oobe_display_->GetAutoEnrollmentCheckScreenActor()); |
| 339 } else if (screen_name == kControllerPairingScreenName) { | 329 } else if (screen_name == kControllerPairingScreenName) { |
| 340 if (!shark_controller_) { | 330 if (!shark_controller_) { |
| 341 shark_controller_.reset( | 331 shark_controller_.reset( |
| 342 new pairing_chromeos::BluetoothControllerPairingController()); | 332 new pairing_chromeos::BluetoothControllerPairingController()); |
| 343 } | 333 } |
| 344 return new ControllerPairingScreen( | 334 return new ControllerPairingScreen( |
| 345 this, | 335 this, |
| 346 this, | 336 this, |
| 347 oobe_display_->GetControllerPairingScreenActor(), | 337 oobe_display_->GetControllerPairingScreenActor(), |
| 348 shark_controller_.get()); | 338 shark_controller_.get()); |
| 349 } else if (screen_name == kHostPairingScreenName) { | 339 } else if (screen_name == kHostPairingScreenName) { |
| 350 if (!remora_controller_) { | 340 if (!remora_controller_) { |
| 351 remora_controller_.reset( | 341 remora_controller_.reset( |
| 352 new pairing_chromeos::BluetoothHostPairingController()); | 342 new pairing_chromeos::BluetoothHostPairingController()); |
| 353 remora_controller_->StartPairing(); | 343 remora_controller_->StartPairing(); |
| 354 } | 344 } |
| 355 return new HostPairingScreen(this, | 345 return new HostPairingScreen(this, |
| 356 this, | 346 this, |
| 357 oobe_display_->GetHostPairingScreenActor(), | 347 oobe_display_->GetHostPairingScreenActor(), |
| 358 remora_controller_.get()); | 348 remora_controller_.get()); |
| 359 } else if (screen_name == kDeviceDisabledScreenName) { | 349 } else if (screen_name == kDeviceDisabledScreenName) { |
| 360 return new chromeos::DeviceDisabledScreen( | 350 return new DeviceDisabledScreen( |
| 361 this, oobe_display_->GetDeviceDisabledScreenActor()); | 351 this, oobe_display_->GetDeviceDisabledScreenActor()); |
| 362 } | 352 } |
| 363 | 353 |
| 364 return NULL; | 354 return NULL; |
| 365 } | 355 } |
| 366 | 356 |
| 367 void WizardController::ShowNetworkScreen() { | 357 void WizardController::ShowNetworkScreen() { |
| 368 VLOG(1) << "Showing network screen."; | 358 VLOG(1) << "Showing network screen."; |
| 369 // Hide the status area initially; it only appears after OOBE first animates | 359 // Hide the status area initially; it only appears after OOBE first animates |
| 370 // in. Keep it visible if the user goes back to the existing network screen. | 360 // in. Keep it visible if the user goes back to the existing network screen. |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 "OOBE.BootToSignInCompleted", | 639 "OOBE.BootToSignInCompleted", |
| 650 delta, | 640 delta, |
| 651 base::TimeDelta::FromMilliseconds(10), | 641 base::TimeDelta::FromMilliseconds(10), |
| 652 base::TimeDelta::FromMinutes(30), | 642 base::TimeDelta::FromMinutes(30), |
| 653 100); | 643 100); |
| 654 time_oobe_started_ = base::Time(); | 644 time_oobe_started_ = base::Time(); |
| 655 } | 645 } |
| 656 | 646 |
| 657 // Launch browser and delete login host controller. | 647 // Launch browser and delete login host controller. |
| 658 BrowserThread::PostTask( | 648 BrowserThread::PostTask( |
| 659 BrowserThread::UI, | 649 BrowserThread::UI, FROM_HERE, |
| 660 FROM_HERE, | 650 base::Bind(&LoginUtils::DoBrowserLaunch, |
| 661 base::Bind(&chromeos::LoginUtils::DoBrowserLaunch, | 651 base::Unretained(LoginUtils::Get()), |
| 662 base::Unretained(chromeos::LoginUtils::Get()), | |
| 663 ProfileManager::GetActiveUserProfile(), host_)); | 652 ProfileManager::GetActiveUserProfile(), host_)); |
| 664 host_ = NULL; | 653 host_ = NULL; |
| 665 } | 654 } |
| 666 | 655 |
| 667 void WizardController::OnUserImageSkipped() { | 656 void WizardController::OnUserImageSkipped() { |
| 668 OnUserImageSelected(); | 657 OnUserImageSelected(); |
| 669 } | 658 } |
| 670 | 659 |
| 671 void WizardController::OnEnrollmentDone() { | 660 void WizardController::OnEnrollmentDone() { |
| 672 // If the enrollment screen was shown as part of OOBE, OOBE is considered | 661 // If the enrollment screen was shown as part of OOBE, OOBE is considered |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 925 } else { | 914 } else { |
| 926 ShowNetworkScreen(); | 915 ShowNetworkScreen(); |
| 927 } | 916 } |
| 928 } else { | 917 } else { |
| 929 ShowLoginScreen(LoginScreenContext()); | 918 ShowLoginScreen(LoginScreenContext()); |
| 930 } | 919 } |
| 931 } | 920 } |
| 932 } | 921 } |
| 933 | 922 |
| 934 /////////////////////////////////////////////////////////////////////////////// | 923 /////////////////////////////////////////////////////////////////////////////// |
| 935 // WizardController, chromeos::BaseScreenDelegate overrides: | 924 // WizardController, BaseScreenDelegate overrides: |
| 936 void WizardController::OnExit(BaseScreen& /* screen */, | 925 void WizardController::OnExit(BaseScreen& /* screen */, |
| 937 ExitCodes exit_code, | 926 ExitCodes exit_code, |
| 938 const ::login::ScreenContext* /* context */) { | 927 const ::login::ScreenContext* /* context */) { |
| 939 VLOG(1) << "Wizard screen exit code: " << exit_code; | 928 VLOG(1) << "Wizard screen exit code: " << exit_code; |
| 940 std::string previous_screen_id = current_screen_->GetName(); | 929 std::string previous_screen_id = current_screen_->GetName(); |
| 941 if (IsOOBEStepToTrack(previous_screen_id)) { | 930 if (IsOOBEStepToTrack(previous_screen_id)) { |
| 942 RecordUMAHistogramForOOBEStepCompletionTime( | 931 RecordUMAHistogramForOOBEStepCompletionTime( |
| 943 previous_screen_id, | 932 previous_screen_id, |
| 944 base::Time::Now() - screen_show_times_[previous_screen_id]); | 933 base::Time::Now() - screen_show_times_[previous_screen_id]); |
| 945 } | 934 } |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1186 | 1175 |
| 1187 if (timezone->status != TimeZoneResponseData::OK) { | 1176 if (timezone->status != TimeZoneResponseData::OK) { |
| 1188 LOG(WARNING) << "Resolve TimeZone: failed to resolve timezone."; | 1177 LOG(WARNING) << "Resolve TimeZone: failed to resolve timezone."; |
| 1189 return; | 1178 return; |
| 1190 } | 1179 } |
| 1191 | 1180 |
| 1192 policy::BrowserPolicyConnectorChromeOS* connector = | 1181 policy::BrowserPolicyConnectorChromeOS* connector = |
| 1193 g_browser_process->platform_part()->browser_policy_connector_chromeos(); | 1182 g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
| 1194 if (connector->IsEnterpriseManaged()) { | 1183 if (connector->IsEnterpriseManaged()) { |
| 1195 std::string policy_timezone; | 1184 std::string policy_timezone; |
| 1196 if (chromeos::CrosSettings::Get()->GetString( | 1185 if (CrosSettings::Get()->GetString(kSystemTimezonePolicy, |
| 1197 chromeos::kSystemTimezonePolicy, &policy_timezone) && | 1186 &policy_timezone) && |
| 1198 !policy_timezone.empty()) { | 1187 !policy_timezone.empty()) { |
| 1199 VLOG(1) << "Resolve TimeZone: TimeZone settings are overridden" | 1188 VLOG(1) << "Resolve TimeZone: TimeZone settings are overridden" |
| 1200 << " by DevicePolicy."; | 1189 << " by DevicePolicy."; |
| 1201 return; | 1190 return; |
| 1202 } | 1191 } |
| 1203 } | 1192 } |
| 1204 | 1193 |
| 1205 if (!timezone->timeZoneId.empty()) { | 1194 if (!timezone->timeZoneId.empty()) { |
| 1206 VLOG(1) << "Resolve TimeZone: setting timezone to '" << timezone->timeZoneId | 1195 VLOG(1) << "Resolve TimeZone: setting timezone to '" << timezone->timeZoneId |
| 1207 << "'"; | 1196 << "'"; |
| 1208 | 1197 |
| 1209 chromeos::system::TimezoneSettings::GetInstance()->SetTimezoneFromID( | 1198 system::TimezoneSettings::GetInstance()->SetTimezoneFromID( |
| 1210 base::UTF8ToUTF16(timezone->timeZoneId)); | 1199 base::UTF8ToUTF16(timezone->timeZoneId)); |
| 1211 } | 1200 } |
| 1212 } | 1201 } |
| 1213 | 1202 |
| 1214 TimeZoneProvider* WizardController::GetTimezoneProvider() { | 1203 TimeZoneProvider* WizardController::GetTimezoneProvider() { |
| 1215 if (!timezone_provider_) { | 1204 if (!timezone_provider_) { |
| 1216 timezone_provider_.reset( | 1205 timezone_provider_.reset( |
| 1217 new TimeZoneProvider(g_browser_process->system_request_context(), | 1206 new TimeZoneProvider(g_browser_process->system_request_context(), |
| 1218 DefaultTimezoneProviderURL())); | 1207 DefaultTimezoneProviderURL())); |
| 1219 } | 1208 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1302 } | 1291 } |
| 1303 | 1292 |
| 1304 EnrollmentScreen* screen = EnrollmentScreen::Get(this); | 1293 EnrollmentScreen* screen = EnrollmentScreen::Get(this); |
| 1305 screen->SetParameters(effective_config, shark_controller_.get(), | 1294 screen->SetParameters(effective_config, shark_controller_.get(), |
| 1306 remora_controller_.get()); | 1295 remora_controller_.get()); |
| 1307 SetStatusAreaVisible(true); | 1296 SetStatusAreaVisible(true); |
| 1308 SetCurrentScreen(screen); | 1297 SetCurrentScreen(screen); |
| 1309 } | 1298 } |
| 1310 | 1299 |
| 1311 } // namespace chromeos | 1300 } // namespace chromeos |
| OLD | NEW |