| Index: chrome/browser/chromeos/login/wizard_controller.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/login/wizard_controller.cc (revision 53758)
|
| +++ chrome/browser/chromeos/login/wizard_controller.cc (working copy)
|
| @@ -12,8 +12,10 @@
|
| #include <vector>
|
|
|
| #include "app/l10n_util.h"
|
| +#include "app/resource_bundle.h"
|
| #include "base/command_line.h"
|
| #include "base/logging.h"
|
| +#include "base/file_util.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/chromeos/cros/cros_library.h"
|
| #include "chrome/browser/chromeos/cros/login_library.h"
|
| @@ -51,6 +53,19 @@
|
| // A boolean pref of the OOBE complete flag.
|
| const wchar_t kOobeComplete[] = L"OobeComplete";
|
|
|
| +// Path to OEM partner startup customization manifest.
|
| +const char kStartupCustomizationManifestPath[] =
|
| + "/mnt/partner_partition/etc/chromeos/startup_manifest.json";
|
| +
|
| +// URL where to fetch OEM services customization manifest from.
|
| +// TODO(denisromanov): Change this to real URL when it becomes available.
|
| +const char kServicesCustomizationManifestUrl[] =
|
| + "file:///mnt/partner_partition/etc/chromeos/services_manifest.json";
|
| +
|
| +// Path to flag file indicating that OOBE was completed successfully.
|
| +const char kOobeCompleteFlagFilePath[] =
|
| + "/home/chronos/.oobe_completed";
|
| +
|
| // Default size of the OOBE screen.
|
| const int kWizardScreenWidth = 700;
|
| const int kWizardScreenHeight = 416;
|
| @@ -162,6 +177,11 @@
|
| ProfileManager::GetDefaultProfile()));
|
| }
|
|
|
| +void DeleteWizardControllerAndApplyCustomization(WizardController* controller) {
|
| + controller->ApplyPartnerServicesCustomizations();
|
| + delete controller;
|
| +}
|
| +
|
| } // namespace
|
|
|
| const char WizardController::kNetworkScreenName[] = "network";
|
| @@ -237,7 +257,7 @@
|
| NULL);
|
| window->SetContentsView(contents_);
|
|
|
| - bool oobe_complete = IsOobeComplete();
|
| + bool oobe_complete = IsOobeCompleted();
|
|
|
| if (!oobe_complete || first_screen_name == kOutOfBoxScreenName) {
|
| is_out_of_box_ = true;
|
| @@ -340,7 +360,18 @@
|
| controller->Init();
|
| background_widget_ = NULL;
|
| background_view_ = NULL;
|
| - MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| +
|
| + FilePath startup_manifest_path(kStartupCustomizationManifestPath);
|
| + if (file_util::PathExists(startup_manifest_path)) {
|
| + services_manifest_fetcher_.reset(new StringFetcher(
|
| + kServicesCustomizationManifestUrl));
|
| + }
|
| + ChromeThread::PostTask(
|
| + ChromeThread::UI,
|
| + FROM_HERE,
|
| + NewRunnableFunction(&DeleteWizardControllerAndApplyCustomization,
|
| + this));
|
| +
|
| return;
|
| }
|
|
|
| @@ -450,7 +481,7 @@
|
| if (!password_.empty()) {
|
| login->view()->SetPassword(password_);
|
| // TODO(dpolukhin): clear password memory for real. Now it is not
|
| - // a problem becuase we can't extract password from the form.
|
| + // a problem because we can't extract password from the form.
|
| password_.clear();
|
| login->view()->Login();
|
| }
|
| @@ -506,6 +537,7 @@
|
| }
|
|
|
| void WizardController::OnRegistrationSuccess() {
|
| + MarkDeviceRegistered();
|
| // TODO(nkostylev): Registration screen should be shown on first sign in.
|
| ShowLoginScreen();
|
| }
|
| @@ -571,6 +603,42 @@
|
| prefs->SavePersistentPrefs();
|
| }
|
|
|
| +void WizardController::MarkDeviceRegistered() {
|
| + // Create flag file for boot-time init scripts.
|
| + FilePath oobe_complete_path(kOobeCompleteFlagFilePath);
|
| + FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b");
|
| + DCHECK(oobe_flag_file != NULL) << kOobeCompleteFlagFilePath;
|
| + if (oobe_flag_file != NULL)
|
| + file_util::CloseFile(oobe_flag_file);
|
| +}
|
| +
|
| +void WizardController::ApplyPartnerServicesCustomizations() {
|
| + if (services_manifest_fetcher_.get() == NULL ||
|
| + services_manifest_fetcher_->result().empty()) {
|
| + return;
|
| + }
|
| + scoped_ptr<chromeos::ServicesCustomizationDocument> customization;
|
| + bool manifest_loaded;
|
| + customization.reset(new chromeos::ServicesCustomizationDocument());
|
| + manifest_loaded = customization->LoadManifestFromString(
|
| + services_manifest_fetcher_->result());
|
| + DCHECK(manifest_loaded) << "Customization manifest fetch error: "
|
| + << services_manifest_fetcher_->result();
|
| + if (!manifest_loaded)
|
| + return;
|
| + LOG(INFO) << "partner services customizations manifest loaded successfully";
|
| + if (!customization->initial_start_page_url().empty()) {
|
| + // Append partner's start page url to command line so it gets opened
|
| + // on browser startup.
|
| + CommandLine::ForCurrentProcess()->AppendLooseValue(
|
| + UTF8ToWide(customization->initial_start_page_url()));
|
| + LOG(INFO) << "initial_start_page_url: "
|
| + << customization->initial_start_page_url();
|
| + }
|
| + // TODO(dpolukhin): apply customized apps, exts and support page.
|
| + MarkDeviceRegistered();
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // WizardController, chromeos::ScreenObserver overrides:
|
| void WizardController::OnExit(ExitCodes exit_code) {
|
| @@ -639,10 +707,15 @@
|
| return observer_ ? observer_ : this;
|
| }
|
|
|
| -bool WizardController::IsOobeComplete() {
|
| +bool WizardController::IsOobeCompleted() {
|
| return g_browser_process->local_state()->GetBoolean(kOobeComplete);
|
| }
|
|
|
| +bool WizardController::IsDeviceRegistered() {
|
| + FilePath oobe_complete_flag_file_path(kOobeCompleteFlagFilePath);
|
| + return file_util::PathExists(oobe_complete_flag_file_path);
|
| +}
|
| +
|
| namespace browser {
|
|
|
| // Declared in browser_dialogs.h so that others don't need to depend on our .h.
|
| @@ -668,7 +741,7 @@
|
| gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(size));
|
|
|
| // Check whether we need to execute OOBE process.
|
| - bool oobe_complete = WizardController::IsOobeComplete();
|
| + bool oobe_complete = WizardController::IsOobeCompleted();
|
|
|
| if (first_screen_name.empty() &&
|
| oobe_complete &&
|
| @@ -682,47 +755,61 @@
|
| return;
|
| }
|
|
|
| - scoped_ptr<chromeos::StartupCustomizationDocument> customization;
|
| + // Create and show the wizard.
|
| + WizardController* controller = new WizardController();
|
|
|
| - if (!oobe_complete) {
|
| - // Load partner customization startup manifest if needed.
|
| - if (CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kStartupManifest)) {
|
| - customization.reset(new chromeos::StartupCustomizationDocument());
|
| - FilePath manifest_path =
|
| - CommandLine::ForCurrentProcess()->GetSwitchValuePath(
|
| - switches::kStartupManifest);
|
| - bool manifest_loaded = customization->LoadManifestFromFile(manifest_path);
|
| - DCHECK(manifest_loaded) << manifest_path.value();
|
| - }
|
| -
|
| - // Do UX customizations if needed.
|
| - if (customization != NULL) {
|
| - // Switch to initial locale if specified by customization.
|
| - const std::string locale = customization->initial_locale();
|
| - if (!locale.empty()) {
|
| - chromeos::LanguageSwitchMenu::SwitchLanguage(locale);
|
| + // Load partner customization startup manifest if it is available.
|
| + FilePath startup_manifest_path(kStartupCustomizationManifestPath);
|
| + std::string locale;
|
| + if (file_util::PathExists(startup_manifest_path)) {
|
| + scoped_ptr<chromeos::StartupCustomizationDocument> customization(
|
| + new chromeos::StartupCustomizationDocument());
|
| + bool manifest_loaded = customization->LoadManifestFromFile(
|
| + FilePath(kStartupCustomizationManifestPath));
|
| + DCHECK(manifest_loaded) << kStartupCustomizationManifestPath;
|
| + if (manifest_loaded) {
|
| + LOG(INFO) << "startup manifest loaded successfully";
|
| + // Switch to initial locale if specified by customization
|
| + // and has not been set yet. We cannot call
|
| + // chromeos::LanguageSwitchMenu::SwitchLanguage here before
|
| + // EmitLoginPromptReady.
|
| + const std::string current_locale =
|
| + g_browser_process->local_state()->GetString(
|
| + prefs::kApplicationLocale);
|
| + LOG(INFO) << "current locale: " << current_locale;
|
| + if (current_locale.empty()) {
|
| + locale = customization->initial_locale();
|
| + LOG(INFO) << "initial locale: " << locale;
|
| + if (!locale.empty()) {
|
| + ResourceBundle::ReloadSharedInstance(UTF8ToWide(locale));
|
| + }
|
| }
|
|
|
| - // Set initial timezone if specified by customization.
|
| - const std::string timezone_name = customization->initial_timezone();
|
| - if (!timezone_name.empty()) {
|
| - icu::TimeZone* timezone = icu::TimeZone::createTimeZone(
|
| - icu::UnicodeString::fromUTF8(timezone_name));
|
| - chromeos::CrosLibrary::Get()->GetSystemLibrary()->SetTimezone(timezone);
|
| - }
|
| + controller->SetCustomization(customization.release());
|
| }
|
| }
|
|
|
| - // Create and show the wizard.
|
| - WizardController* controller = new WizardController();
|
| - if (!oobe_complete)
|
| - controller->SetCustomization(customization.release());
|
| controller->ShowBackground(screen_bounds);
|
| controller->Init(first_screen_name, screen_bounds);
|
| controller->Show();
|
| +
|
| if (chromeos::CrosLibrary::Get()->EnsureLoaded())
|
| chromeos::CrosLibrary::Get()->GetLoginLibrary()->EmitLoginPromptReady();
|
| +
|
| + if (controller->GetCustomization() != NULL) {
|
| + if (!locale.empty())
|
| + chromeos::LanguageSwitchMenu::SwitchLanguage(locale);
|
| +
|
| + // Set initial timezone if specified by customization.
|
| + const std::string timezone_name =
|
| + controller->GetCustomization()->initial_timezone();
|
| + LOG(INFO) << "initial time zone: " << timezone_name;
|
| + if (!timezone_name.empty()) {
|
| + icu::TimeZone* timezone = icu::TimeZone::createTimeZone(
|
| + icu::UnicodeString::fromUTF8(timezone_name));
|
| + chromeos::CrosLibrary::Get()->GetSystemLibrary()->SetTimezone(timezone);
|
| + }
|
| + }
|
| }
|
|
|
| } // namespace browser
|
|
|