Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/login/wizard_controller.h" | 5 #include "chrome/browser/chromeos/login/wizard_controller.h" |
| 6 | 6 |
| 7 #include <gdk/gdk.h> | 7 #include <gdk/gdk.h> |
| 8 #include <signal.h> | 8 #include <signal.h> |
| 9 #include <sys/types.h> | 9 #include <sys/types.h> |
| 10 | 10 |
| 11 #include <string> | 11 #include <string> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "app/l10n_util.h" | 14 #include "app/l10n_util.h" |
| 15 #include "base/command_line.h" | 15 #include "base/command_line.h" |
| 16 #include "base/logging.h" | 16 #include "base/logging.h" |
| 17 #include "base/file_util.h" | |
| 17 #include "chrome/browser/browser_process.h" | 18 #include "chrome/browser/browser_process.h" |
| 18 #include "chrome/browser/chromeos/cros/cros_library.h" | 19 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 19 #include "chrome/browser/chromeos/cros/login_library.h" | 20 #include "chrome/browser/chromeos/cros/login_library.h" |
| 20 #include "chrome/browser/chromeos/cros/system_library.h" | 21 #include "chrome/browser/chromeos/cros/system_library.h" |
| 21 #include "chrome/browser/chromeos/customization_document.h" | 22 #include "chrome/browser/chromeos/customization_document.h" |
| 22 #include "chrome/browser/chromeos/input_method/input_method_util.h" | 23 #include "chrome/browser/chromeos/input_method/input_method_util.h" |
| 23 #include "chrome/browser/chromeos/login/account_screen.h" | 24 #include "chrome/browser/chromeos/login/account_screen.h" |
| 24 #include "chrome/browser/chromeos/login/background_view.h" | 25 #include "chrome/browser/chromeos/login/background_view.h" |
| 25 #include "chrome/browser/chromeos/login/eula_view.h" | 26 #include "chrome/browser/chromeos/login/eula_view.h" |
| 26 #include "chrome/browser/chromeos/login/existing_user_controller.h" | 27 #include "chrome/browser/chromeos/login/existing_user_controller.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 44 #include "views/accelerator.h" | 45 #include "views/accelerator.h" |
| 45 #include "views/painter.h" | 46 #include "views/painter.h" |
| 46 #include "views/view.h" | 47 #include "views/view.h" |
| 47 #include "views/widget/widget_gtk.h" | 48 #include "views/widget/widget_gtk.h" |
| 48 | 49 |
| 49 namespace { | 50 namespace { |
| 50 | 51 |
| 51 // A boolean pref of the OOBE complete flag. | 52 // A boolean pref of the OOBE complete flag. |
| 52 const wchar_t kOobeComplete[] = L"OobeComplete"; | 53 const wchar_t kOobeComplete[] = L"OobeComplete"; |
| 53 | 54 |
| 55 // Path to OEM partner startup customization manifest. | |
| 56 const char kStartupCustomizationManifestPath[] = | |
| 57 "/mnt/partner_partition/etc/chromeos/startup_manifest.json"; | |
| 58 | |
| 59 // URL where to fetch OEM services customization manifest from. | |
| 60 // TODO(denisromanov): Change this to real URL when it becomes available. | |
|
Nikita (slow)
2010/07/19 12:31:19
Please file issue to track this and mention it her
| |
| 61 const char kServicesCustomizationManifestUrl[] = | |
| 62 "file:///mnt/partner_partition/etc/chromeos/services_manifest.json"; | |
| 63 | |
| 64 // Path to flag file indicating that OOBE was completed successfully. | |
| 65 const char kOobeCompleteFlagFilePath[] = | |
| 66 "/home/chronos/.oobe_completed"; | |
| 67 | |
| 54 // Default size of the OOBE screen. | 68 // Default size of the OOBE screen. |
| 55 const int kWizardScreenWidth = 700; | 69 const int kWizardScreenWidth = 700; |
| 56 const int kWizardScreenHeight = 416; | 70 const int kWizardScreenHeight = 416; |
| 57 | 71 |
| 58 // RootView of the Widget WizardController creates. Contains the contents of the | 72 // RootView of the Widget WizardController creates. Contains the contents of the |
| 59 // WizardController. | 73 // WizardController. |
| 60 class ContentView : public views::View { | 74 class ContentView : public views::View { |
| 61 public: | 75 public: |
| 62 ContentView(int window_x, int window_y, int screen_w, int screen_h) | 76 ContentView(int window_x, int window_y, int screen_w, int screen_h) |
| 63 : window_x_(window_x), | 77 : window_x_(window_x), |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 146 views::Accelerator accel_network_screen_; | 160 views::Accelerator accel_network_screen_; |
| 147 views::Accelerator accel_update_screen_; | 161 views::Accelerator accel_update_screen_; |
| 148 views::Accelerator accel_image_screen_; | 162 views::Accelerator accel_image_screen_; |
| 149 views::Accelerator accel_eula_screen_; | 163 views::Accelerator accel_eula_screen_; |
| 150 | 164 |
| 151 DISALLOW_COPY_AND_ASSIGN(ContentView); | 165 DISALLOW_COPY_AND_ASSIGN(ContentView); |
| 152 }; | 166 }; |
| 153 | 167 |
| 154 void DeleteWizardControllerAndLaunchBrowser(WizardController* controller) { | 168 void DeleteWizardControllerAndLaunchBrowser(WizardController* controller) { |
| 155 delete controller; | 169 delete controller; |
| 170 // Apply OEM partner services customizations. | |
| 171 controller->ApplyPartnerServicesCustomizations(); | |
|
Nikita (slow)
2010/07/19 12:31:19
It seems like a not the best place to apply these
| |
| 156 // Launch browser after controller is deleted and its windows are closed. | 172 // Launch browser after controller is deleted and its windows are closed. |
| 157 chromeos::LoginUtils::Get()->EnableBrowserLaunch(true); | 173 chromeos::LoginUtils::Get()->EnableBrowserLaunch(true); |
| 158 ChromeThread::PostTask( | 174 ChromeThread::PostTask( |
| 159 ChromeThread::UI, | 175 ChromeThread::UI, |
| 160 FROM_HERE, | 176 FROM_HERE, |
| 161 NewRunnableFunction(&chromeos::LoginUtils::DoBrowserLaunch, | 177 NewRunnableFunction(&chromeos::LoginUtils::DoBrowserLaunch, |
| 162 ProfileManager::GetDefaultProfile())); | 178 ProfileManager::GetDefaultProfile())); |
| 163 } | 179 } |
| 164 | 180 |
| 165 } // namespace | 181 } // namespace |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 336 new chromeos::ExistingUserController(users, screen_bounds); | 352 new chromeos::ExistingUserController(users, screen_bounds); |
| 337 controller->OwnBackground(background_widget_, background_view_); | 353 controller->OwnBackground(background_widget_, background_view_); |
| 338 controller->Init(); | 354 controller->Init(); |
| 339 background_widget_ = NULL; | 355 background_widget_ = NULL; |
| 340 background_view_ = NULL; | 356 background_view_ = NULL; |
| 341 MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 357 MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
| 342 return; | 358 return; |
| 343 } | 359 } |
| 344 | 360 |
| 345 SetCurrentScreen(GetLoginScreen()); | 361 SetCurrentScreen(GetLoginScreen()); |
| 362 | |
| 363 LOG(INFO) << "WTF: " << (is_out_of_box_ ? "out" : "in"); | |
|
Nikita (slow)
2010/07/19 12:31:19
Debug info - should be removed?
At least place a d
| |
| 364 | |
| 365 if (is_out_of_box_) { | |
| 366 // Initiate fetching partner services manifest here. | |
| 367 services_manifest_fetcher_.reset(new StringFetcher( | |
|
Nikita (slow)
2010/07/19 12:31:19
We're fetching manifest during OOBE
welcome-update
| |
| 368 kServicesCustomizationManifestUrl)); | |
| 369 } | |
| 346 } | 370 } |
| 347 | 371 |
| 348 void WizardController::ShowAccountScreen() { | 372 void WizardController::ShowAccountScreen() { |
| 349 SetStatusAreaVisible(true); | 373 SetStatusAreaVisible(true); |
| 350 SetCurrentScreen(GetAccountScreen()); | 374 SetCurrentScreen(GetAccountScreen()); |
| 351 } | 375 } |
| 352 | 376 |
| 353 void WizardController::ShowUpdateScreen() { | 377 void WizardController::ShowUpdateScreen() { |
| 354 SetStatusAreaVisible(true); | 378 SetStatusAreaVisible(true); |
| 355 SetCurrentScreen(GetUpdateScreen()); | 379 SetCurrentScreen(GetUpdateScreen()); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 550 ShowLoginScreen(); | 574 ShowLoginScreen(); |
| 551 } | 575 } |
| 552 } | 576 } |
| 553 } | 577 } |
| 554 | 578 |
| 555 void WizardController::MarkOobeCompleted() { | 579 void WizardController::MarkOobeCompleted() { |
| 556 PrefService* prefs = g_browser_process->local_state(); | 580 PrefService* prefs = g_browser_process->local_state(); |
| 557 prefs->SetBoolean(kOobeComplete, true); | 581 prefs->SetBoolean(kOobeComplete, true); |
| 558 // Make sure that changes are reflected immediately. | 582 // Make sure that changes are reflected immediately. |
| 559 prefs->SavePersistentPrefs(); | 583 prefs->SavePersistentPrefs(); |
| 584 // Create flag file for boot-time init scripts. | |
| 585 FilePath oobe_complete_path(kOobeCompleteFlagFilePath); | |
| 586 FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b"); | |
| 587 DCHECK(oobe_flag_file != NULL) << kOobeCompleteFlagFilePath; | |
| 588 if (oobe_flag_file != NULL) | |
| 589 file_util::CloseFile(oobe_flag_file); | |
| 590 } | |
| 591 | |
| 592 void WizardController::ApplyPartnerServicesCustomizations() { | |
| 593 if (services_manifest_fetcher_.get() == NULL || | |
| 594 services_manifest_fetcher_->result().empty()) { | |
| 595 return; | |
| 596 } | |
| 597 scoped_ptr<chromeos::ServicesCustomizationDocument> customization; | |
| 598 bool manifest_loaded; | |
| 599 customization.reset(new chromeos::ServicesCustomizationDocument()); | |
| 600 manifest_loaded = customization->LoadManifestFromString( | |
| 601 services_manifest_fetcher_->result()); | |
| 602 DCHECK(manifest_loaded) << "Customization manifest fetch error: " | |
| 603 << services_manifest_fetcher_->result(); | |
| 604 if (!manifest_loaded) | |
| 605 return; | |
| 606 if (!customization->initial_start_page_url().empty()) { | |
| 607 // Append partner's start page url to command line so it gets opened | |
| 608 // on browser startup. | |
| 609 CommandLine::ForCurrentProcess()->AppendLooseValue( | |
| 610 UTF8ToWide(customization->initial_start_page_url())); | |
| 611 } | |
|
Nikita (slow)
2010/07/19 12:31:19
apps + exts + support page?
| |
| 560 } | 612 } |
| 561 | 613 |
| 562 /////////////////////////////////////////////////////////////////////////////// | 614 /////////////////////////////////////////////////////////////////////////////// |
| 563 // WizardController, chromeos::ScreenObserver overrides: | 615 // WizardController, chromeos::ScreenObserver overrides: |
| 564 void WizardController::OnExit(ExitCodes exit_code) { | 616 void WizardController::OnExit(ExitCodes exit_code) { |
| 565 switch (exit_code) { | 617 switch (exit_code) { |
| 566 case LOGIN_SIGN_IN_SELECTED: | 618 case LOGIN_SIGN_IN_SELECTED: |
| 567 OnLoginSignInSelected(); | 619 OnLoginSignInSelected(); |
| 568 break; | 620 break; |
| 569 case LOGIN_GUEST_SELECTED: | 621 case LOGIN_GUEST_SELECTED: |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 662 switches::kEnableLoginImages)) { | 714 switches::kEnableLoginImages)) { |
| 663 std::vector<chromeos::UserManager::User> users = | 715 std::vector<chromeos::UserManager::User> users = |
| 664 chromeos::UserManager::Get()->GetUsers(); | 716 chromeos::UserManager::Get()->GetUsers(); |
| 665 // ExistingUserController deletes itself. | 717 // ExistingUserController deletes itself. |
| 666 (new chromeos::ExistingUserController(users, screen_bounds))->Init(); | 718 (new chromeos::ExistingUserController(users, screen_bounds))->Init(); |
| 667 return; | 719 return; |
| 668 } | 720 } |
| 669 | 721 |
| 670 scoped_ptr<chromeos::StartupCustomizationDocument> customization; | 722 scoped_ptr<chromeos::StartupCustomizationDocument> customization; |
| 671 | 723 |
| 672 if (!oobe_complete) { | 724 // Load partner customization startup manifest if it is available. |
| 673 // Load partner customization startup manifest if needed. | 725 FilePath startup_manifest_path(kStartupCustomizationManifestPath); |
| 674 if (CommandLine::ForCurrentProcess()->HasSwitch( | 726 if (file_util::PathExists(startup_manifest_path)) { |
|
Nikita (slow)
2010/07/19 12:31:19
Please add check that startup manifest should exis
| |
| 675 switches::kStartupManifest)) { | 727 customization.reset(new chromeos::StartupCustomizationDocument()); |
| 676 customization.reset(new chromeos::StartupCustomizationDocument()); | 728 bool manifest_loaded = customization->LoadManifestFromFile( |
| 677 FilePath manifest_path = | 729 FilePath(kStartupCustomizationManifestPath)); |
| 678 CommandLine::ForCurrentProcess()->GetSwitchValuePath( | 730 DCHECK(manifest_loaded) << kStartupCustomizationManifestPath; |
| 679 switches::kStartupManifest); | 731 if (!manifest_loaded) |
| 680 bool manifest_loaded = customization->LoadManifestFromFile(manifest_path); | 732 customization.reset(NULL); |
| 681 DCHECK(manifest_loaded) << manifest_path.value(); | 733 } |
| 682 } | |
| 683 | 734 |
| 684 // Do UX customizations if needed. | 735 if (chromeos::CrosLibrary::Get()->EnsureLoaded()) |
| 685 if (customization != NULL) { | 736 chromeos::CrosLibrary::Get()->GetLoginLibrary()->EmitLoginPromptReady(); |
|
Nikita (slow)
2010/07/19 12:31:19
We should look deeper into it.
Emitting login_prom
Nikita (slow)
2010/07/19 12:54:26
Possible solution:
1. Change Chrome locale only, s
| |
| 686 // Switch to initial locale if specified by customization. | 737 |
| 738 if (customization.get() != NULL) { | |
| 739 // Switch to initial locale if specified by customization | |
| 740 // and has not been set yet. | |
| 741 const std::string current_locale = | |
| 742 g_browser_process->local_state()->GetString(prefs::kApplicationLocale); | |
| 743 if (current_locale.empty()) { | |
| 687 const std::string locale = customization->initial_locale(); | 744 const std::string locale = customization->initial_locale(); |
| 688 if (!locale.empty()) { | 745 if (!locale.empty()) { |
| 689 chromeos::LanguageSwitchMenu::SwitchLanguage(locale); | 746 chromeos::LanguageSwitchMenu::SwitchLanguage(locale); |
| 690 } | 747 } |
| 748 } | |
| 691 | 749 |
| 692 // Set initial timezone if specified by customization. | 750 // Set initial timezone if specified by customization. |
| 693 const std::string timezone_name = customization->initial_timezone(); | 751 const std::string timezone_name = customization->initial_timezone(); |
| 694 if (!timezone_name.empty()) { | 752 if (!timezone_name.empty()) { |
| 695 icu::TimeZone* timezone = icu::TimeZone::createTimeZone( | 753 icu::TimeZone* timezone = icu::TimeZone::createTimeZone( |
| 696 icu::UnicodeString::fromUTF8(timezone_name)); | 754 icu::UnicodeString::fromUTF8(timezone_name)); |
| 697 chromeos::CrosLibrary::Get()->GetSystemLibrary()->SetTimezone(timezone); | 755 chromeos::CrosLibrary::Get()->GetSystemLibrary()->SetTimezone(timezone); |
| 698 } | |
| 699 } | 756 } |
| 700 } | 757 } |
| 701 | 758 |
| 702 // Create and show the wizard. | 759 // Create and show the wizard. |
| 703 WizardController* controller = new WizardController(); | 760 WizardController* controller = new WizardController(); |
| 704 if (!oobe_complete) | 761 if (customization.get() != NULL) |
| 705 controller->SetCustomization(customization.release()); | 762 controller->SetCustomization(customization.release()); |
| 706 controller->ShowBackground(screen_bounds); | 763 controller->ShowBackground(screen_bounds); |
| 707 controller->Init(first_screen_name, screen_bounds); | 764 controller->Init(first_screen_name, screen_bounds); |
| 708 controller->Show(); | 765 controller->Show(); |
| 709 if (chromeos::CrosLibrary::Get()->EnsureLoaded()) | |
| 710 chromeos::CrosLibrary::Get()->GetLoginLibrary()->EmitLoginPromptReady(); | |
| 711 } | 766 } |
| 712 | 767 |
| 713 } // namespace browser | 768 } // namespace browser |
| OLD | NEW |