wizard_controller.cc revision 201ade2fbba22bfb27ae029f4d23fca6ded109a0
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/wizard_controller.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gdk/gdk.h> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <signal.h> 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <sys/types.h> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "app/resource_bundle.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h" 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_util.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/cros_library.h" 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/chromeos/cros/cryptohome_library.h" 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/cros/input_method_library.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/login_library.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/system_library.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/customization_document.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/input_method/input_method_util.h" 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/language_preferences.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/account_screen.h" 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/apply_services_customization.h" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/background_view.h" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/eula_view.h" 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/existing_user_controller.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/helper.h" 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/html_page_screen.h" 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/language_switch_menu.h" 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/login_screen.h" 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/login_utils.h" 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/network_screen.h" 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/registration_screen.h" 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/rounded_rect_painter.h" 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/update_screen.h" 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_image_screen.h" 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_manager.h" 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h" 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_ipc.h" 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/profile_manager.h" 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h" 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_service.h" 49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/notification_type.h" 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/pref_names.h" 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "cros/chromeos_wm_ipc_enums.h" 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "unicode/timezone.h" 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/accelerator.h" 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/painter.h" 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/view.h" 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget_gtk.h" 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// A boolean pref of the EULA accepted flag. 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char kEulaAccepted[] = "EulaAccepted"; 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A boolean pref of the OOBE complete flag. 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kOobeComplete[] = "OobeComplete"; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Path to OEM partner startup customization manifest. 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kStartupCustomizationManifestPath[] = 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "/mnt/partner_partition/etc/chromeos/startup_manifest.json"; 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Path to flag file indicating that OOBE was completed successfully. 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kOobeCompleteFlagFilePath[] = 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "/home/chronos/.oobe_completed"; 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Time in seconds that we wait for the device to reboot. 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// If reboot didn't happen, ask user to reboot device manually. 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kWaitForRebootTimeSec = 3; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RootView of the Widget WizardController creates. Contains the contents of the 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController. 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ContentView : public views::View { 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ContentView() 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : accel_enable_accessibility_( 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::WizardAccessibilityHelper::GetAccelerator()) { 85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OFFICIAL_BUILD) 86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch accel_cancel_update_ = views::Accelerator(app::VKEY_ESCAPE, 87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch true, true, true); 88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#else 89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch accel_cancel_update_ = views::Accelerator(app::VKEY_ESCAPE, 90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch false, false, false); 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick accel_account_screen_ = views::Accelerator(app::VKEY_A, 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false, true, true); 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick accel_login_screen_ = views::Accelerator(app::VKEY_L, 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false, true, true); 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick accel_network_screen_ = views::Accelerator(app::VKEY_N, 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false, true, true); 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick accel_update_screen_ = views::Accelerator(app::VKEY_U, 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false, true, true); 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick accel_image_screen_ = views::Accelerator(app::VKEY_I, 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false, true, true); 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick accel_eula_screen_ = views::Accelerator(app::VKEY_E, 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false, true, true); 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick accel_register_screen_ = views::Accelerator(app::VKEY_R, 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false, true, true); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddAccelerator(accel_account_screen_); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddAccelerator(accel_login_screen_); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddAccelerator(accel_network_screen_); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddAccelerator(accel_update_screen_); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddAccelerator(accel_image_screen_); 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddAccelerator(accel_eula_screen_); 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddAccelerator(accel_register_screen_); 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AddAccelerator(accel_enable_accessibility_); 114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AddAccelerator(accel_cancel_update_); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~ContentView() { 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::WIZARD_CONTENT_VIEW_DESTROYED, 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources(), 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::NoDetails()); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool AcceleratorPressed(const views::Accelerator& accel) { 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WizardController* controller = WizardController::default_controller(); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!controller) 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (accel == accel_enable_accessibility_) { 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::WizardAccessibilityHelper::GetInstance()->EnableAccessibility( 131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch controller->contents()); } 132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch else if (accel == accel_cancel_update_) { 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch controller->CancelOOBEUpdate(); 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD) 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (accel == accel_account_screen_) { 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->ShowAccountScreen(); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (accel == accel_login_screen_) { 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->ShowLoginScreen(); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (accel == accel_network_screen_) { 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->ShowNetworkScreen(); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (accel == accel_update_screen_) { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->ShowUpdateScreen(); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (accel == accel_image_screen_) { 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->ShowUserImageScreen(); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (accel == accel_eula_screen_) { 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->ShowEulaScreen(); 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (accel == accel_register_screen_) { 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick controller->ShowRegistrationScreen(); 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Layout() { 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < GetChildViewCount(); ++i) { 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::View* cur = GetChildViewAt(i); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (cur->IsVisible()) 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cur->SetBounds(0, 0, width(), height()); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<views::Painter> painter_; 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD) 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Accelerator accel_account_screen_; 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Accelerator accel_login_screen_; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Accelerator accel_network_screen_; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Accelerator accel_update_screen_; 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Accelerator accel_image_screen_; 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Accelerator accel_eula_screen_; 1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Accelerator accel_register_screen_; 1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Accelerator accel_enable_accessibility_; 178201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch views::Accelerator accel_cancel_update_; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(ContentView); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DeleteWizardControllerAndLaunchBrowser(WizardController* controller) { 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete controller; 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Launch browser after controller is deleted and its windows are closed. 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::LoginUtils::Get()->EnableBrowserLaunch(true); 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::UI, 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableFunction(&chromeos::LoginUtils::DoBrowserLaunch, 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileManager::GetDefaultProfile())); 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst chromeos::StartupCustomizationDocument* LoadStartupManifest() { 1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Load partner customization startup manifest if it is available. 1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick FilePath startup_manifest_path(kStartupCustomizationManifestPath); 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (file_util::PathExists(startup_manifest_path)) { 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<chromeos::StartupCustomizationDocument> customization( 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new chromeos::StartupCustomizationDocument()); 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool manifest_loaded = customization->LoadManifestFromFile( 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick startup_manifest_path); 2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (manifest_loaded) { 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Startup manifest loaded successfully"; 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return customization.release(); 2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(ERROR) << "Error loading startup manifest: " 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick << kStartupCustomizationManifestPath; 2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return NULL; 2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Returns true if startup manifest defines valid registration URL. 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool IsRegistrationScreenValid( 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const chromeos::StartupCustomizationDocument* startup_manifest) { 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return startup_manifest != NULL && 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GURL(startup_manifest->registration_url()).is_valid(); 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Saves boolean "Local State" preference and forces it's persistence to disk. 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SaveBoolPreferenceForced(const char* pref_name, bool value) { 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PrefService* prefs = g_browser_process->local_state(); 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick prefs->SetBoolean(pref_name, value); 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick prefs->SavePersistentPrefs(); 225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kNetworkScreenName[] = "network"; 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kLoginScreenName[] = "login"; 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kAccountScreenName[] = "account"; 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kUpdateScreenName[] = "update"; 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kUserImageScreenName[] = "image"; 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kEulaScreenName[] = "eula"; 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kRegistrationScreenName[] = "register"; 2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char WizardController::kHTMLPageScreenName[] = "html"; 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Passing this parameter as a "first screen" initiates full OOBE flow. 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kOutOfBoxScreenName[] = "oobe"; 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Special test value that commands not to create any window yet. 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kTestNoScreenName[] = "test:nowindow"; 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Initialize default controller. 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController* WizardController::default_controller_ = NULL; 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, public: 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController::WizardController() 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : widget_(NULL), 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_widget_(NULL), 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_view_(NULL), 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents_(NULL), 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_screen_(NULL), 2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD) 2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick is_official_build_(true), 2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick is_official_build_(false), 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_out_of_box_(false), 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_test_mode_(false), 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_(NULL) { 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(default_controller_ == NULL); 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default_controller_ = this; 267201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch registrar_.Add( 268201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch this, 269201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch NotificationType::APP_TERMINATING, 270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch NotificationService::AllSources()); 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController::~WizardController() { 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Close ends up deleting the widget. 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (background_widget_) 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_widget_->Close(); 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (widget_) 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch widget_->Close(); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default_controller_ = NULL; 282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::WizardAccessibilityHelper::GetInstance()-> 283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UnregisterNotifications(); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::Init(const std::string& first_screen_name, 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Rect& screen_bounds) { 288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Starting OOBE wizard with screen: " << first_screen_name; 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!contents_); 2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick first_screen_name_ = first_screen_name; 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // When device is not registered yet we need to load startup manifest as well. 2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // In case of OOBE (network-EULA-update) manifest has been loaded in 2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // ShowLoginWizard(). 2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (IsOobeCompleted() && !IsDeviceRegistered()) 2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCustomization(LoadStartupManifest()); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick screen_bounds_ = screen_bounds; 2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick contents_ = new ContentView(); 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool oobe_complete = IsOobeCompleted(); 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!oobe_complete || first_screen_name == kOutOfBoxScreenName) { 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_out_of_box_ = true; 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowFirstScreen(first_screen_name); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::Show() { 3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // In tests we might startup without initial screen 3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // so widget_ hasn't been created yet. 3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (first_screen_name_ != kTestNoScreenName) 3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(widget_); 3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (widget_) 3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick widget_->Show(); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowBackground(const gfx::Rect& bounds) { 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!background_widget_); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_widget_ = 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::BackgroundView::CreateWindowContainingView(bounds, 3223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL(), 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &background_view_); 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgressBarVisible(true); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_widget_->Show(); 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OwnBackground( 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Widget* background_widget, 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::BackgroundView* background_view) { 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!background_widget_); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_widget_ = background_widget; 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_view_ = background_view; 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 336201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid WizardController::CancelOOBEUpdate() { 337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (update_screen_.get() && 338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch update_screen_.get() == current_screen_) { 339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch GetUpdateScreen()->CancelUpdate(); 340201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 341201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 342201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::NetworkScreen* WizardController::GetNetworkScreen() { 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!network_screen_.get()) 3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick network_screen_.reset(new chromeos::NetworkScreen(this)); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return network_screen_.get(); 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::LoginScreen* WizardController::GetLoginScreen() { 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!login_screen_.get()) 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch login_screen_.reset(new chromeos::LoginScreen(this)); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return login_screen_.get(); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::AccountScreen* WizardController::GetAccountScreen() { 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!account_screen_.get()) 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch account_screen_.reset(new chromeos::AccountScreen(this)); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return account_screen_.get(); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::UpdateScreen* WizardController::GetUpdateScreen() { 3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!update_screen_.get()) { 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch update_screen_.reset(new chromeos::UpdateScreen(this)); 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick update_screen_->SetRebootCheckDelay(kWaitForRebootTimeSec); 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return update_screen_.get(); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::UserImageScreen* WizardController::GetUserImageScreen() { 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!user_image_screen_.get()) 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch user_image_screen_.reset(new chromeos::UserImageScreen(this)); 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return user_image_screen_.get(); 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::EulaScreen* WizardController::GetEulaScreen() { 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!eula_screen_.get()) 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch eula_screen_.reset(new chromeos::EulaScreen(this)); 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return eula_screen_.get(); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::RegistrationScreen* WizardController::GetRegistrationScreen() { 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!registration_screen_.get()) 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registration_screen_.reset(new chromeos::RegistrationScreen(this)); 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return registration_screen_.get(); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickchromeos::HTMLPageScreen* WizardController::GetHTMLPageScreen() { 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!html_page_screen_.get()) { 3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CommandLine* command_line = CommandLine::ForCurrentProcess(); 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string url; 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // It's strange but args may contains empty strings. 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < command_line->args().size(); i++) { 3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!command_line->args()[i].empty()) { 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(url.empty()) << "More than one URL in command line"; 3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick url = command_line->args()[i]; 3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(!url.empty()) << "No URL in commane line"; 3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick html_page_screen_.reset(new chromeos::HTMLPageScreen(this, url)); 4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return html_page_screen_.get(); 4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowNetworkScreen() { 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetStatusAreaVisible(false); 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentScreen(GetNetworkScreen()); 4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgress(chromeos::BackgroundView::SELECT_NETWORK); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickchromeos::ExistingUserController* WizardController::ShowLoginScreen() { 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetStatusAreaVisible(true); 4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgress(chromeos::BackgroundView::SIGNIN); 4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Initiate services customization. 4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::ApplyServicesCustomization::StartIfNeeded(); 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // When run under automation test show plain login screen. 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!is_test_mode_ && 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::CrosLibrary::Get()->EnsureLoaded() && 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CommandLine::ForCurrentProcess()->HasSwitch( 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switches::kEnableLoginImages)) { 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<chromeos::UserManager::User> users = 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::UserManager::Get()->GetUsers(); 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ExistingUserController deletes itself. 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect screen_bounds; 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_widget_->GetBounds(&screen_bounds, true); 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::ExistingUserController* controller = 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new chromeos::ExistingUserController(users, screen_bounds); 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->OwnBackground(background_widget_, background_view_); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->Init(); 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_widget_ = NULL; 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_view_ = NULL; 4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->DeleteSoon(FROM_HERE, this); 4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return controller; 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentScreen(GetLoginScreen()); 4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return NULL; 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowAccountScreen() { 444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Showing create account screen."; 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetStatusAreaVisible(true); 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentScreen(GetAccountScreen()); 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowUpdateScreen() { 450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Showing update screen."; 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetStatusAreaVisible(true); 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentScreen(GetUpdateScreen()); 4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // There is no special step for update. 4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD) 4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgress(chromeos::BackgroundView::EULA); 4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else 4573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgress(chromeos::BackgroundView::SELECT_NETWORK); 4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowUserImageScreen() { 462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Showing user image screen."; 4633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetStatusAreaVisible(false); 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentScreen(GetUserImageScreen()); 4653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgress(chromeos::BackgroundView::PICTURE); 466201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch background_view_->EnableShutdownButton(false); 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowEulaScreen() { 470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Showing EULA screen."; 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetStatusAreaVisible(false); 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentScreen(GetEulaScreen()); 4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD) 4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgress(chromeos::BackgroundView::EULA); 4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowRegistrationScreen() { 479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!IsRegistrationScreenValid(GetCustomization())) { 480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Skipping registration screen: manifest not defined or invalid " 481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "URL."; 4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OnRegistrationSkipped(); 4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Showing registration screen."; 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetStatusAreaVisible(true); 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCurrentScreen(GetRegistrationScreen()); 4883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD) 4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgress(chromeos::BackgroundView::REGISTRATION); 4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::ShowHTMLPageScreen() { 494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Showing HTML page screen."; 4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetStatusAreaVisible(true); 4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetOobeProgressBarVisible(false); 4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetCurrentScreen(GetHTMLPageScreen()); 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::SetCustomization( 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const chromeos::StartupCustomizationDocument* customization) { 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch customization_.reset(customization); 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst chromeos::StartupCustomizationDocument* 5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WizardController::GetCustomization() const { 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return customization_.get(); 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::SkipRegistration() { 5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (current_screen_ == GetRegistrationScreen()) 5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OnRegistrationSkipped(); 5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick else 5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LOG(ERROR) << "Registration screen is not active."; 5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 517201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid WizardController::Observe(NotificationType type, 518201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const NotificationSource& source, 519201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const NotificationDetails& details) { 520201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch CHECK(type == NotificationType::APP_TERMINATING); 521201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 522201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch MessageLoop::current()->DeleteSoon(FROM_HERE, this); 523201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch MessageLoop::current()->Quit(); 524201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch registrar_.Remove(this, 525201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch NotificationType::APP_TERMINATING, 526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch NotificationService::AllSources()); 527201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 528201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::RegisterPrefs(PrefService* local_state) { 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch local_state->RegisterBooleanPref(kOobeComplete, false); 532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick local_state->RegisterBooleanPref(kEulaAccepted, false); 5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Check if the pref is already registered in case 5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Preferences::RegisterUserPrefs runs before this code in the future. 5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (local_state->FindPreference(prefs::kAccessibilityEnabled) == NULL) { 5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick local_state->RegisterBooleanPref(prefs::kAccessibilityEnabled, false); 5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, ExitHandlers: 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginSignInSelected() { 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't show user image screen in case of automated testing. 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (is_test_mode_) { 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->DeleteSoon(FROM_HERE, this); 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't launch browser until we pass image screen. 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::LoginUtils::Get()->EnableBrowserLaunch(false); 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowUserImageScreen(); 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginGuestUser() { 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We're on the stack, so don't try and delete us now. 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->DeleteSoon(FROM_HERE, this); 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginCreateAccount() { 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowAccountScreen(); 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnNetworkConnected() { 5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (is_official_build_) { 564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!IsEulaAccepted()) { 565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowEulaScreen(); 566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Possible cases: 568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // 1. EULA was accepted, forced shutdown/reboot during update. 569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // 2. EULA was accepted, planned reboot after update. 570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Make sure that device is up-to-date. 571731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InitiateOOBEUpdate(); 572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InitiateOOBEUpdate(); 575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnNetworkOffline() { 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(dpolukhin): if(is_out_of_box_) we cannot work offline and 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // should report some error message here and stay on the same screen. 581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowLoginScreen(); 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnAccountCreateBack() { 5853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::ExistingUserController* controller = ShowLoginScreen(); 5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (controller) 5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick controller->SelectNewUser(); 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnAccountCreated() { 5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::ExistingUserController* controller = ShowLoginScreen(); 5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (controller) 5933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick controller->LoginNewUser(username_, password_); 5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick else 5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Login(username_, password_); 5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TODO(dpolukhin): clear password memory for real. Now it is not 5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // a problem because we can't extract password from the form. 5983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick password_.clear(); 599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnConnectionFailed() { 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(dpolukhin): show error message after login screen is displayed. 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowLoginScreen(); 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateCompleted() { 6073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OnOOBECompleted(); 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnEulaAccepted() { 611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MarkEulaAccepted(); 6124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (chromeos::CrosLibrary::Get()->EnsureLoaded()) { 6134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // TPM password could be seen on EULA screen, now it's safe to clear it. 6144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch chromeos::CrosLibrary::Get()-> 6154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GetCryptohomeLibrary()->TpmClearStoredPassword(); 6164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 617731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InitiateOOBEUpdate(); 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateErrorCheckingForUpdate() { 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(nkostylev): Update should be required during OOBE. 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We do not want to block users from being able to proceed to the login 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // screen if there is any error checking for an update. 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // They could use "browse without sign-in" feature to set up the network to be 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // able to perform the update later. 6263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OnOOBECompleted(); 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateErrorUpdating() { 630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If there was an error while getting or applying the update, 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return to network selection screen. 632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(nkostylev): Show message to the user explaining update error. 633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(nkostylev): Update should be required during OOBE. 634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Temporary fix, need to migrate to new API. http://crosbug.com/4321 6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OnOOBECompleted(); 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUserImageSelected() { 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We're on the stack, so don't try and delete us now. 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We should launch browser only after we delete the controller and close 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // its windows. 642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::UI, 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableFunction(&DeleteWizardControllerAndLaunchBrowser, 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this)); 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(avayvod): Sync image with Google Sync. 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUserImageSkipped() { 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnUserImageSelected(); 652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnRegistrationSuccess() { 6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MarkDeviceRegistered(); 6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (chromeos::UserManager::Get()->logged_in_user().email().empty()) { 6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::LoginUtils::Get()->CompleteOffTheRecordLogin(start_url_); 6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ShowUserImageScreen(); 6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnRegistrationSkipped() { 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(nkostylev): Track in a histogram? 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnRegistrationSuccess(); 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::OnOOBECompleted() { 6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MarkOobeCompleted(); 6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ShowLoginScreen(); 6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WizardController::InitiateOOBEUpdate() { 674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowUpdateScreen(); 675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetUpdateScreen()->StartUpdate(); 676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, private: 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickviews::WidgetGtk* WizardController::CreateScreenWindow( 6823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const gfx::Rect& bounds, bool initial_show) { 6833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::WidgetGtk* window = 6843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW); 6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick widget_ = window; 6863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window->MakeTransparent(); 6873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Window transparency makes background flicker through controls that 6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // are constantly updating its contents (like image view with video 6893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // stream). Hence enabling double buffer. 6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window->EnableDoubleBuffer(true); 6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window->Init(NULL, bounds); 6923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<int> params; 6933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // For initial show WM would animate background window. 6943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Otherwise it stays unchaged. 6953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick params.push_back(initial_show); 6963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::WmIpc::instance()->SetWindowType( 6973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window->GetNativeView(), 6983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::WM_IPC_WINDOW_LOGIN_GUEST, 6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ¶ms); 7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window->SetContentsView(contents_); 7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return window; 7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickgfx::Rect WizardController::GetWizardScreenBounds(int screen_width, 7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int screen_height) const { 7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int offset_x = (screen_bounds_.width() - screen_width) / 2; 7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int offset_y = (screen_bounds_.height() - screen_height) / 2; 7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int window_x = screen_bounds_.x() + offset_x; 7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int window_y = screen_bounds_.y() + offset_y; 7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return gfx::Rect(window_x, window_y, screen_width, screen_height); 7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::SetCurrentScreen(WizardScreen* new_current) { 7153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (current_screen_ == new_current || 7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new_current == NULL) 717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool initial_show = true; 7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (current_screen_) { 7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick initial_show = false; 722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_screen_->Hide(); 7233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_screen_ = new_current; 7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool force_widget_show = false; 7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::WidgetGtk* window = NULL; 7283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick gfx::Rect current_bounds; 7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (widget_) 7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick widget_->GetBounds(¤t_bounds, false); 7323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick gfx::Size new_screen_size = current_screen_->GetScreenSize(); 7333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick gfx::Rect new_bounds = GetWizardScreenBounds(new_screen_size.width(), 7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new_screen_size.height()); 7353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (new_bounds != current_bounds) { 7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (widget_) 7373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick widget_->Close(); 7383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick force_widget_show = true; 7393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window = CreateScreenWindow(new_bounds, initial_show); 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick current_screen_->Show(); 7423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick contents_->Layout(); 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contents_->SchedulePaint(); 7443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (force_widget_show) { 7453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // This keeps the window from flashing at startup. 7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GdkWindow* gdk_window = window->GetNativeView()->window; 7473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick gdk_window_set_back_pixmap(gdk_window, NULL, false); 7483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (widget_) 7493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick widget_->Show(); 7503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::SetStatusAreaVisible(bool visible) { 7543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // When ExistingUserController passes background ownership 7553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // to WizardController it happens after screen is shown. 7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (background_view_) { 7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_view_->SetStatusAreaVisible(visible); 7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowFirstScreen(const std::string& first_screen_name) { 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (first_screen_name == kNetworkScreenName) { 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowNetworkScreen(); 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (first_screen_name == kLoginScreenName) { 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This flag is passed if we're running under automation test. 766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_test_mode_ = true; 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowLoginScreen(); 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (first_screen_name == kAccountScreenName) { 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowAccountScreen(); 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (first_screen_name == kUpdateScreenName) { 771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InitiateOOBEUpdate(); 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (first_screen_name == kUserImageScreenName) { 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowUserImageScreen(); 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (first_screen_name == kEulaScreenName) { 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowEulaScreen(); 776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (first_screen_name == kRegistrationScreenName) { 7773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (is_official_build_) { 7783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ShowRegistrationScreen(); 7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 7803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Just proceed to image screen. 7813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OnRegistrationSuccess(); 7823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 7833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (first_screen_name == kHTMLPageScreenName) { 7843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ShowHTMLPageScreen(); 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (first_screen_name != kTestNoScreenName) { 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (is_out_of_box_) { 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowNetworkScreen(); 788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowLoginScreen(); 790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::Login(const std::string& username, 7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& password) { 7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::LoginScreen* login = GetLoginScreen(); 7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (username.empty()) 7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick login->view()->SetUsername(username); 8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (password.empty()) 8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick login->view()->SetPassword(password); 8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick login->view()->Login(); 8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static 808731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool WizardController::IsEulaAccepted() { 809731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return g_browser_process->local_state()->GetBoolean(kEulaAccepted); 810731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 811731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 812731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static 8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WizardController::IsOobeCompleted() { 8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return g_browser_process->local_state()->GetBoolean(kOobeComplete); 8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static 818731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WizardController::MarkEulaAccepted() { 819731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SaveBoolPreferenceForced(kEulaAccepted, true); 820731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 821731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 822731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static 823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::MarkOobeCompleted() { 824731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SaveBoolPreferenceForced(kOobeComplete, true); 825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static 8283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WizardController::IsDeviceRegistered() { 8293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick FilePath oobe_complete_flag_file_path(kOobeCompleteFlagFilePath); 8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return file_util::PathExists(oobe_complete_flag_file_path); 8313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static 834731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool WizardController::IsRegisterScreenDefined() { 835731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const chromeos::StartupCustomizationDocument* manifest = NULL; 836731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This method will be called from ExistingUserController too 837731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // when Wizard instance doesn't exist. 838731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (default_controller()) 839731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manifest = default_controller()->GetCustomization(); 840731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else 841731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manifest = LoadStartupManifest(); 842731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return IsRegistrationScreenValid(manifest); 843731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 844731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 845731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static 8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::MarkDeviceRegistered() { 8473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Create flag file for boot-time init scripts. 8483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick FilePath oobe_complete_path(kOobeCompleteFlagFilePath); 8493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b"); 8503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(oobe_flag_file != NULL) << kOobeCompleteFlagFilePath; 8513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (oobe_flag_file != NULL) 8523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick file_util::CloseFile(oobe_flag_file); 8533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, chromeos::ScreenObserver overrides: 857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnExit(ExitCodes exit_code) { 858201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(INFO) << "Wizard screen exit code: " << exit_code; 859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (exit_code) { 860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case LOGIN_SIGN_IN_SELECTED: 861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnLoginSignInSelected(); 862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case LOGIN_GUEST_SELECTED: 864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnLoginGuestUser(); 865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case LOGIN_CREATE_ACCOUNT: 867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnLoginCreateAccount(); 868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NETWORK_CONNECTED: 870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnNetworkConnected(); 871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NETWORK_OFFLINE: 873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnNetworkOffline(); 874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case ACCOUNT_CREATE_BACK: 876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnAccountCreateBack(); 877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case ACCOUNT_CREATED: 879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnAccountCreated(); 880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case CONNECTION_FAILED: 882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnConnectionFailed(); 883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case UPDATE_INSTALLED: 885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case UPDATE_NOUPDATE: 886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnUpdateCompleted(); 887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case UPDATE_ERROR_CHECKING_FOR_UPDATE: 889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnUpdateErrorCheckingForUpdate(); 890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case UPDATE_ERROR_UPDATING: 892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnUpdateErrorUpdating(); 893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case USER_IMAGE_SELECTED: 895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnUserImageSelected(); 896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case USER_IMAGE_SKIPPED: 898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnUserImageSkipped(); 899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case EULA_ACCEPTED: 901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnEulaAccepted(); 902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 9033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case EULA_BACK: 9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ShowNetworkScreen(); 9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick break; 906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case REGISTRATION_SUCCESS: 907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnRegistrationSuccess(); 908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case REGISTRATION_SKIPPED: 910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnRegistrationSkipped(); 911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::OnSetUserNamePassword(const std::string& username, 9183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& password) { 9193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick username_ = username; 9203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick password_ = password; 9213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, WizardScreen overrides: 925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* WizardController::GetWizardView() { 926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return contents_; 927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::ScreenObserver* WizardController::GetObserver(WizardScreen* screen) { 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return observer_ ? observer_ : this; 931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser { 934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declared in browser_dialogs.h so that others don't need to depend on our .h. 936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ShowLoginWizard(const std::string& first_screen_name, 937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Size& size) { 938731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Showing login screen: " << first_screen_name; 939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The login screen will enable alternate keyboard layouts, but we don't want 9413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // to start the IME process unless one is selected. 9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::CrosLibrary::Get()->GetInputMethodLibrary()-> 9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetDeferImeStartup(true); 944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tell the window manager that the user isn't logged in. 945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::WmIpc::instance()->SetLoggedInProperty(false); 946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty 948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // and US dvorak keyboard layouts. 949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (g_browser_process && g_browser_process->local_state()) { 950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string locale = g_browser_process->GetApplicationLocale(); 951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string initial_input_method_id = 952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process->local_state()->GetString( 9533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::language_prefs::kPreferredKeyboardLayout); 954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::input_method::EnableInputMethods( 955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locale, chromeos::input_method::kKeyboardLayoutsOnly, 956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch initial_input_method_id); 957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(size)); 960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check whether we need to execute OOBE process. 9623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool oobe_complete = WizardController::IsOobeCompleted(); 963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (first_screen_name.empty() && 965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch oobe_complete && 966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::CrosLibrary::Get()->EnsureLoaded() && 967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CommandLine::ForCurrentProcess()->HasSwitch( 968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switches::kEnableLoginImages)) { 969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<chromeos::UserManager::User> users = 970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::UserManager::Get()->GetUsers(); 9713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Fix for users who updated device and thus never passed register screen. 9733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // If we already have user we assume that it is not a second part of OOBE. 9743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // See http://crosbug.com/6289 9753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!WizardController::IsDeviceRegistered() && !users.empty()) { 976731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Mark device registered because there are remembered users: " 977731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick << users.size(); 9783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WizardController::MarkDeviceRegistered(); 9793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ExistingUserController deletes itself. 982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (new chromeos::ExistingUserController(users, screen_bounds))->Init(); 9833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Initiate services customization. 9853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::ApplyServicesCustomization::StartIfNeeded(); 9863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Create and show the wizard. 9913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WizardController* controller = new WizardController(); 992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Load startup manifest. 9943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick controller->SetCustomization(LoadStartupManifest()); 995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string locale; 9973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (controller->GetCustomization()) { 9983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Switch to initial locale if specified by customization 9993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // and has not been set yet. We cannot call 10003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // chromeos::LanguageSwitchMenu::SwitchLanguage here before 10013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // EmitLoginPromptReady. 10023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string current_locale = 10033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick g_browser_process->local_state()->GetString( 10043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick prefs::kApplicationLocale); 1005731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Current locale: " << current_locale; 10063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (current_locale.empty()) { 10073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick locale = controller->GetCustomization()->initial_locale(); 1008731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Initial locale: " << locale; 10093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!locale.empty()) { 1010201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::string loaded_locale = 1011201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ResourceBundle::ReloadSharedInstance(locale); 1012201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch CHECK(!loaded_locale.empty()) << "Locale could not be found for " 1013201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch << locale; 1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->ShowBackground(screen_bounds); 1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->Init(first_screen_name, screen_bounds); 1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controller->Show(); 10213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1022513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch chromeos::LoginUtils::Get()->PrewarmAuthentication(); 1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (chromeos::CrosLibrary::Get()->EnsureLoaded()) 1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chromeos::CrosLibrary::Get()->GetLoginLibrary()->EmitLoginPromptReady(); 10253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (controller->GetCustomization()) { 10273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!locale.empty()) 10283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::LanguageSwitchMenu::SwitchLanguage(locale); 10293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set initial timezone if specified by customization. 10313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string timezone_name = 10323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick controller->GetCustomization()->initial_timezone(); 1033731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "Initial time zone: " << timezone_name; 10343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Apply locale customizations only once so preserve whatever locale 10353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // user has changed to during OOBE. 10363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!timezone_name.empty()) { 10373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick icu::TimeZone* timezone = icu::TimeZone::createTimeZone( 10383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick icu::UnicodeString::fromUTF8(timezone_name)); 10393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chromeos::CrosLibrary::Get()->GetSystemLibrary()->SetTimezone(timezone); 10403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 10413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1042c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace browser 1045