Chromium Code Reviews| Index: chrome/browser/chromeos/login/eula_view.cc |
| diff --git a/chrome/browser/chromeos/login/eula_view.cc b/chrome/browser/chromeos/login/eula_view.cc |
| index 6d6d207508606b5a178791c1066c690c5559671a..202af00711817f7d30e86e1b67d42674aeaf4541 100644 |
| --- a/chrome/browser/chromeos/login/eula_view.cc |
| +++ b/chrome/browser/chromeos/login/eula_view.cc |
| @@ -13,6 +13,7 @@ |
| #include "base/basictypes.h" |
| #include "base/utf_string_conversions.h" |
| #include "chrome/browser/browser_process.h" |
| +#include "chrome/browser/chromeos/cros/cros_library.h" |
| #include "chrome/browser/chromeos/customization_document.h" |
| #include "chrome/browser/chromeos/login/help_app_launcher.h" |
| #include "chrome/browser/chromeos/login/network_screen_delegate.h" |
| @@ -26,8 +27,10 @@ |
| #include "chrome/common/native_web_keyboard_event.h" |
| #include "chrome/common/url_constants.h" |
| #include "chrome/installer/util/google_update_settings.h" |
| +#include "cros/chromeos_cryptohome.h" |
| #include "grit/chromium_strings.h" |
| #include "grit/generated_resources.h" |
| +#include "grit/locale_settings.h" |
| #include "grit/theme_resources.h" |
| #include "views/controls/button/checkbox.h" |
| #include "views/controls/button/native_button.h" |
| @@ -36,6 +39,8 @@ |
| #include "views/layout_manager.h" |
| #include "views/standard_layout.h" |
| #include "views/widget/widget_gtk.h" |
| +#include "views/window/dialog_delegate.h" |
| +#include "views/window/window.h" |
| #if defined(USE_LINUX_BREAKPAD) |
| #include "chrome/app/breakpad_linux.h" |
| @@ -75,6 +80,63 @@ struct FillLayoutWithBorder : public views::LayoutManager { |
| } |
| }; |
| +// System security setting dialog. |
| +class TpmInfoView : public views::View, |
| + public views::DialogDelegate { |
| + public: |
| + explicit TpmInfoView(std::wstring password) : password_(password) { } |
| + void Init(); |
| + |
| + protected: |
| + // views::DialogDelegate overrides: |
| + virtual bool Accept() { return true; } |
| + virtual bool IsModal() const { return true; } |
| + virtual views::View* GetContentsView() { return this; } |
| + virtual int GetDialogButtons() const { |
| + return MessageBoxFlags::DIALOGBUTTON_OK; |
| + } |
| + |
| + // views::View overrides: |
| + virtual std::wstring GetWindowTitle() const { |
| + return l10n_util::GetString(IDS_EULA_SYSTEM_SECURITY_SETTING); |
| + } |
| + |
| + gfx::Size GetPreferredSize() { |
| + return gfx::Size(views::Window::GetLocalizedContentsSize( |
| + IDS_TPM_INFO_DIALOG_WIDTH_CHARS, |
| + IDS_TPM_INFO_DIALOG_HEIGHT_LINES)); |
| + } |
| + |
| + private: |
| + std::wstring password_; |
| + DISALLOW_COPY_AND_ASSIGN(TpmInfoView); |
| +}; |
| + |
| +void TpmInfoView::Init() { |
| + views::GridLayout* layout = CreatePanelGridLayout(this); |
| + SetLayoutManager(layout); |
| + views::ColumnSet* column_set = layout->AddColumnSet(0); |
| + column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, |
| + views::GridLayout::USE_PREF, 0, 0); |
| + layout->StartRow(0, 0); |
| + views::Label* label = new views::Label( |
| + l10n_util::GetString(IDS_EULA_SYSTEM_SECURITY_SETTING_DESCRIPTION)); |
| + label->SetMultiLine(true); |
| + layout->AddView(label); |
| + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); |
| + |
| + column_set = layout->AddColumnSet(1); |
| + column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, |
| + views::GridLayout::USE_PREF, 0, 0); |
| + layout->StartRow(0, 1); |
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| + gfx::Font password_font = |
| + rb.GetFont(ResourceBundle::MediumFont).DeriveFont(0, gfx::Font::BOLD); |
| + label = new views::Label(password_, password_font); |
| + layout->AddView(label); |
| + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); |
| +} |
| + |
| } // namespace |
| namespace chromeos { |
| @@ -92,10 +154,14 @@ EulaView::EulaView(chromeos::ScreenObserver* observer) |
| system_security_settings_link_(NULL), |
| back_button_(NULL), |
| continue_button_(NULL), |
| - observer_(observer) { |
| + observer_(observer), |
| + bubble_(NULL) { |
| } |
| EulaView::~EulaView() { |
| + // bubble_ will be set to NULL in callback. |
| + if (bubble_) |
| + bubble_->Close(); |
| } |
| // Convenience function to set layout's columnsets for this screen. |
| @@ -229,6 +295,11 @@ void EulaView::Init() { |
| layout->StartRow(0, LAST_ROW); |
| system_security_settings_link_ = new views::Link(); |
| system_security_settings_link_->SetController(this); |
| + if (!chromeos::CrosLibrary::Get()->EnsureLoaded() || |
| + !chromeos::CryptohomeTpmIsEnabled()) { |
| + system_security_settings_link_->SetEnabled(false); |
| + // TODO(glotov): add tooltip with description. |
| + } |
| layout->AddView(system_security_settings_link_); |
| back_button_ = new views::NativeButton(this, std::wstring()); |
| @@ -261,7 +332,7 @@ void EulaView::UpdateLocalizedStrings() { |
| learn_more_link_->SetText( |
| l10n_util::GetString(IDS_LEARN_MORE)); |
| system_security_settings_link_->SetText( |
| - l10n_util::GetString(IDS_EULA_SYSTEM_SECURITY_SETTINGS_LINK)); |
| + l10n_util::GetString(IDS_EULA_SYSTEM_SECURITY_SETTING)); |
| continue_button_->SetLabel( |
| l10n_util::GetString(IDS_EULA_ACCEPT_AND_CONTINUE_BUTTON)); |
| back_button_->SetLabel( |
| @@ -305,7 +376,30 @@ void EulaView::LinkActivated(views::Link* source, int event_flags) { |
| help_app_.reset(new HelpAppLauncher(GetNativeWindow())); |
| help_app_->ShowHelpTopic(HelpAppLauncher::HELP_STATS_USAGE); |
| } else if (source == system_security_settings_link_) { |
| - // TODO(glotov): Handle TPM link click. |
| + // Pull the password from TPM. |
| + std::string password; |
| + if (!chromeos::CrosLibrary::Get()->EnsureLoaded()) { |
| + LOG(ERROR) << "Cros library not loaded. " |
| + << "We must have disabled the link that led here."; |
| + return; |
| + } else if (chromeos::CryptohomeTpmIsReady() && |
| + chromeos::CryptohomeTpmGetPassword(&password)) { |
| + TpmInfoView* view = new TpmInfoView(ASCIIToWide(password)); |
| + view->Init(); |
| + views::Window* window = views::Window::CreateChromeWindow( |
| + GetNativeWindow(), gfx::Rect(), view); |
| + window->SetIsAlwaysOnTop(true); |
| + window->Show(); |
| + } else { |
| + if (!bubble_) |
|
Nikita (slow)
2010/09/27 17:51:01
indent
glotov
2010/09/27 18:52:01
Done.
|
| + bubble_ = MessageBubble::Show( |
| + system_security_settings_link_->GetWidget(), |
| + system_security_settings_link_->GetScreenBounds(), |
| + BubbleBorder::LEFT_TOP, |
| + ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_WARNING), |
| + l10n_util::GetString(IDS_EULA_TPM_BUSY), |
| + std::wstring(), this); |
| + } |
| } |
| } |
| @@ -357,4 +451,16 @@ void EulaView::LoadEulaView(DOMView* eula_view, |
| eula_view->tab_contents()->set_delegate(this); |
| } |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// EulaView, private, views::View implementation: |
| + |
| +bool EulaView::OnKeyPressed(const views::KeyEvent&) { |
| + // Close message bubble if shown. bubble_ will be set to NULL in callback. |
| + if (bubble_) { |
| + bubble_->Close(); |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| } // namespace chromeos |