172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 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/eula_view.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <signal.h> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <sys/types.h> 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/basictypes.h" 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/message_loop.h" 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/task.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/values.h" 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/browser_process.h" 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/cros/cros_library.h" 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/cros/cryptohome_library.h" 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/customization_document.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/login/background_view.h" 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/help_app_launcher.h" 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/helper.h" 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/login/login_utils.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/network_screen_delegate.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/rounded_rect_painter.h" 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/wizard_controller.h" 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h" 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/dom_view.h" 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/window.h" 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/url_constants.h" 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/site_instance.h" 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/native_web_keyboard_event.h" 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h" 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/locale_settings.h" 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h" 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h" 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/button/checkbox.h" 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/button/native_button_gtk.h" 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h" 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "views/controls/throbber.h" 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/events/event.h" 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/grid_layout.h" 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/layout_constants.h" 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/layout_manager.h" 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/widget/widget_gtk.h" 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/window/dialog_delegate.h" 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/window/window.h" 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickusing views::WidgetGtk; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kBorderSize = 10; 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kCheckboxWidth = 26; 58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kLastButtonHorizontalMargin = 10; 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kMargin = 20; 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kTextMargin = 10; 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kTpmCheckIntervalMs = 500; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// TODO(glotov): this URL should be changed to actual Google ChromeOS EULA. 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// See crbug.com/4647 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kGoogleEulaUrl[] = "about:terms"; 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochenum kLayoutColumnsets { 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SINGLE_CONTROL_ROW, 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SINGLE_CONTROL_WITH_SHIFT_ROW, 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SINGLE_LINK_WITH_SHIFT_ROW, 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LAST_ROW 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Helper class that disables using native label for subclassed GTK control. 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass EULANativeCheckboxGtk : public views::NativeCheckboxGtk { 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen explicit EULANativeCheckboxGtk(views::Checkbox* checkbox) 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : views::NativeCheckboxGtk(checkbox) { 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_fast_resize(true); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~EULANativeCheckboxGtk() { } 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool UsesNativeLabel() const { return false; } 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void UpdateLabel() { } 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// views::Checkbox specialization that uses its internal views::Label 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// instead of native one. We need this because native label does not 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// support multiline property and we need it for certain languages. 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass EULACheckbox : public views::Checkbox { 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EULACheckbox() { } 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~EULACheckbox() { } 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual views::NativeButtonWrapper* CreateWrapper() { 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen views::NativeButtonWrapper* native_wrapper = 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new EULANativeCheckboxGtk(this); 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen native_wrapper->UpdateChecked(); 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return native_wrapper; 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// A simple LayoutManager that causes the associated view's one child to be 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// sized to match the bounds of its parent except the bounds, if set. 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct FillLayoutWithBorder : public views::LayoutManager { 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Overridden from LayoutManager: 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void Layout(views::View* host) { 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(host->has_children()); 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host->GetChildViewAt(0)->SetBoundsRect(host->GetContentsBounds()); 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual gfx::Size GetPreferredSize(views::View* host) { 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return gfx::Size(host->width(), host->height()); 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// System security setting dialog. 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TpmInfoView : public views::View, 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public views::DialogDelegate { 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick explicit TpmInfoView(std::string* password) 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : ALLOW_THIS_IN_INITIALIZER_LIST(runnable_method_factory_(this)), 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_(password) { 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(password_); 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void Init(); 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected: 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // views::DialogDelegate overrides: 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool Accept() { return true; } 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool IsModal() const { return true; } 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual views::View* GetContentsView() { return this; } 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual int GetDialogButtons() const { 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return MessageBoxFlags::DIALOGBUTTON_OK; 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // views::View overrides: 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual std::wstring GetWindowTitle() const { 1393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return UTF16ToWide( 1403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen l10n_util::GetStringUTF16(IDS_EULA_SYSTEM_SECURITY_SETTING)); 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick gfx::Size GetPreferredSize() { 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return gfx::Size(views::Window::GetLocalizedContentsSize( 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_TPM_INFO_DIALOG_WIDTH_CHARS, 1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_TPM_INFO_DIALOG_HEIGHT_LINES)); 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void PullPassword(); 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ScopedRunnableMethodFactory<TpmInfoView> runnable_method_factory_; 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Holds pointer to the password storage. 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string* password_; 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick views::Label* busy_label_; 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick views::Label* password_label_; 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick views::Throbber* throbber_; 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DISALLOW_COPY_AND_ASSIGN(TpmInfoView); 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TpmInfoView::Init() { 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::GridLayout* layout = views::GridLayout::CreatePanel(this); 1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetLayoutManager(layout); 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::ColumnSet* column_set = layout->AddColumnSet(0); 1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::GridLayout::USE_PREF, 0, 0); 1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->StartRow(0, 0); 1713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen views::Label* label = new views::Label(UTF16ToWide( 1723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen l10n_util::GetStringUTF16(IDS_EULA_SYSTEM_SECURITY_SETTING_DESCRIPTION))); 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick label->SetMultiLine(true); 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick layout->AddView(label); 17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick layout->StartRow(0, 0); 1793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen label = new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( 1803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen IDS_EULA_SYSTEM_SECURITY_SETTING_DESCRIPTION_KEY))); 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick label->SetMultiLine(true); 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->AddView(label); 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick column_set = layout->AddColumnSet(1); 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::GridLayout::USE_PREF, 0, 0); 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->StartRow(0, 1); 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick gfx::Font password_font = 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick rb.GetFont(ResourceBundle::MediumFont).DeriveFont(0, gfx::Font::BOLD); 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Password will be set later. 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_label_ = new views::Label(L"", password_font); 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_label_->SetVisible(false); 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick layout->AddView(password_label_); 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick column_set = layout->AddColumnSet(2); 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick column_set->AddPaddingColumn(1, 0); 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Resize of the throbber and label is not allowed, since we want they to be 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // placed in the center. 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick views::GridLayout::USE_PREF, 0, 0); 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick views::GridLayout::USE_PREF, 0, 0); 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick column_set->AddPaddingColumn(1, 0); 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Border padding columns should have the same width. It guaranties that 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // throbber and label will be placed in the center. 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick column_set->LinkColumnSizes(0, 4, -1); 212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick layout->StartRow(0, 2); 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throbber_ = chromeos::CreateDefaultThrobber(); 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throbber_->Start(); 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick layout->AddView(throbber_); 2173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen busy_label_ = new views::Label( 2183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen UTF16ToWide(l10n_util::GetStringUTF16(IDS_EULA_TPM_BUSY))); 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick layout->AddView(busy_label_); 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlHorizontalSpacing); 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PullPassword(); 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TpmInfoView::PullPassword() { 226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Since this method is also called directly. 227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick runnable_method_factory_.RevokeAll(); 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::CryptohomeLibrary* cryptohome = 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::CrosLibrary::Get()->GetCryptohomeLibrary(); 231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 2324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool password_acquired = false; 233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (password_->empty() && cryptohome->TpmIsReady()) { 2344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch password_acquired = cryptohome->TpmGetPassword(password_); 2354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!password_acquired) { 236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_->clear(); 2374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } else if (password_->empty()) { 2384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // For a fresh OOBE flow TPM is uninitialized, 2394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // ownership process is started at the EULA screen, 2404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // password is cleared after EULA is accepted. 2414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch LOG(ERROR) << "TPM returned an empty password."; 242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 2444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (password_->empty() && !password_acquired) { 245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Password hasn't been acquired, reschedule pulling. 246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoop::current()->PostDelayedTask( 247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FROM_HERE, 248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick runnable_method_factory_.NewRunnableMethod(&TpmInfoView::PullPassword), 249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick kTpmCheckIntervalMs); 250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_label_->SetText(ASCIIToWide(*password_)); 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_label_->SetVisible(true); 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick busy_label_->SetVisible(false); 254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throbber_->Stop(); 255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick throbber_->SetVisible(false); 256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos { 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//////////////////////////////////////////////////////////////////////////////// 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// EulaView, public: 2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochEulaView::EulaView(chromeos::ScreenObserver* observer) 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : google_eula_label_(NULL), 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick google_eula_view_(NULL), 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch usage_statistics_checkbox_(NULL), 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch learn_more_link_(NULL), 2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick oem_eula_label_(NULL), 2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick oem_eula_view_(NULL), 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch system_security_settings_link_(NULL), 2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick back_button_(NULL), 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch continue_button_(NULL), 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick observer_(observer), 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bubble_(NULL) { 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochEulaView::~EulaView() { 2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // bubble_ will be set to NULL in callback. 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (bubble_) 2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bubble_->Close(); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Convenience function to set layout's columnsets for this screen. 2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstatic void SetUpGridLayout(views::GridLayout* layout) { 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int kPadding = kBorderSize + kMargin; 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::ColumnSet* column_set = layout->AddColumnSet(SINGLE_CONTROL_ROW); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddPaddingColumn(0, kPadding); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout::USE_PREF, 0, 0); 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddPaddingColumn(0, kPadding); 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set = layout->AddColumnSet(SINGLE_CONTROL_WITH_SHIFT_ROW); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddPaddingColumn(0, kPadding + kTextMargin); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout::USE_PREF, 0, 0); 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddPaddingColumn(0, kPadding); 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set = layout->AddColumnSet(SINGLE_LINK_WITH_SHIFT_ROW); 302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch column_set->AddPaddingColumn(0, kPadding + kTextMargin + kCheckboxWidth); 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1, 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout::USE_PREF, 0, 0); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddPaddingColumn(0, kPadding); 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set = layout->AddColumnSet(LAST_ROW); 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddPaddingColumn(0, kPadding + kTextMargin); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1, 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout::USE_PREF, 0, 0); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout::USE_PREF, 0, 0); 31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout::USE_PREF, 0, 0); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddPaddingColumn(0, kLastButtonHorizontalMargin + kBorderSize); 3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Convenience function. Returns URL of the OEM EULA page that should be 3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// displayed using current locale and manifest. Returns empty URL otherwise. 3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstatic GURL GetOemEulaPagePath() { 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const StartupCustomizationDocument* customization = 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen StartupCustomizationDocument::GetInstance(); 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (customization->IsReady()) { 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string locale = customization->initial_locale(); 326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string eula_page = customization->GetEULAPage(locale); 327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!eula_page.empty()) 328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return GURL(eula_page); 329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(1) << "No eula found for locale: " << locale; 3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LOG(ERROR) << "No manifest found."; 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return GURL(); 3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid EulaView::Init() { 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // First, command to own the TPM. 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (chromeos::CrosLibrary::Get()->EnsureLoaded()) { 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chromeos::CrosLibrary::Get()-> 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetCryptohomeLibrary()->TpmCanAttemptOwnership(); 342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(ERROR) << "Cros library not loaded. " 344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick << "We must have disabled the link that led here."; 345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Use rounded rect background. 3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Painter* painter = CreateWizardPainter( 3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &BorderDefinition::kScreenBorder); 3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick set_background( 3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Background::CreateBackgroundPainter(true, painter)); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Layout created controls. 3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::GridLayout* layout = new views::GridLayout(this); 3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetLayoutManager(layout); 3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetUpGridLayout(layout); 3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const int kPadding = kBorderSize + kMargin; 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddPaddingRow(0, kPadding); 3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->StartRow(0, SINGLE_CONTROL_ROW); 3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick gfx::Font label_font = 3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick rb.GetFont(ResourceBundle::MediumFont).DeriveFont(0, gfx::Font::NORMAL); 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick google_eula_label_ = new views::Label(std::wstring(), label_font); 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->AddView(google_eula_label_, 1, 1, 3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::GridLayout::LEADING, views::GridLayout::FILL); 3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 36872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->StartRow(1, SINGLE_CONTROL_ROW); 3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::View* box_view = new views::View(); 3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick box_view->set_border(views::Border::CreateSolidBorder(1, SK_ColorBLACK)); 3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick box_view->SetLayoutManager(new FillLayoutWithBorder()); 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->AddView(box_view); 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick google_eula_view_ = new DOMView(); 3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick box_view->AddChildView(google_eula_view_); 3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->StartRow(0, SINGLE_CONTROL_WITH_SHIFT_ROW); 380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen usage_statistics_checkbox_ = new EULACheckbox(); 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch usage_statistics_checkbox_->SetMultiLine(true); 382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen usage_statistics_checkbox_->SetChecked( 383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen observer_->usage_statistics_reporting()); 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(usage_statistics_checkbox_); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->StartRow(0, SINGLE_LINK_WITH_SHIFT_ROW); 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch learn_more_link_ = new views::Link(); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch learn_more_link_->SetController(this); 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(learn_more_link_); 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->StartRow(0, SINGLE_CONTROL_ROW); 3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick oem_eula_label_ = new views::Label(std::wstring(), label_font); 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->AddView(oem_eula_label_, 1, 1, 3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::GridLayout::LEADING, views::GridLayout::FILL); 3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick oem_eula_page_ = GetOemEulaPagePath(); 3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!oem_eula_page_.is_empty()) { 39972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->StartRow(1, SINGLE_CONTROL_ROW); 4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick box_view = new views::View(); 4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick box_view->SetLayoutManager(new FillLayoutWithBorder()); 4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick box_view->set_border(views::Border::CreateSolidBorder(1, SK_ColorBLACK)); 4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->AddView(box_view); 4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick oem_eula_view_ = new DOMView(); 4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick box_view->AddChildView(oem_eula_view_); 4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->StartRow(0, LAST_ROW); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch system_security_settings_link_ = new views::Link(); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch system_security_settings_link_->SetController(this); 414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!chromeos::CrosLibrary::Get()->EnsureLoaded() || 416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick !chromeos::CrosLibrary::Get()->GetCryptohomeLibrary()-> 417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TpmIsEnabled()) { 4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick system_security_settings_link_->SetEnabled(false); 4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(system_security_settings_link_); 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 423201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch back_button_ = new login::WideButton(this, std::wstring()); 4243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick layout->AddView(back_button_); 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 426201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch continue_button_ = new login::WideButton(this, std::wstring()); 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(continue_button_); 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddPaddingRow(0, kPadding); 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UpdateLocalizedStrings(); 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid EulaView::UpdateLocalizedStrings() { 4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Load Google EULA and its title. 4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LoadEulaView(google_eula_view_, google_eula_label_, GURL(kGoogleEulaUrl)); 4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Load OEM EULA and its title. 4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!oem_eula_page_.is_empty()) 4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LoadEulaView(oem_eula_view_, oem_eula_label_, oem_eula_page_); 4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set tooltip for usage statistics checkbox if the metric is unmanaged. 4423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!usage_statistics_checkbox_->IsEnabled()) { 4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick usage_statistics_checkbox_->SetTooltipText( 4443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen UTF16ToWide(l10n_util::GetStringUTF16(IDS_OPTION_DISABLED_BY_POLICY))); 4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Set tooltip for system security settings link if TPM is disabled. 448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!system_security_settings_link_->IsEnabled()) { 449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick system_security_settings_link_->SetTooltipText( 4503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen UTF16ToWide(l10n_util::GetStringUTF16(IDS_EULA_TPM_DISABLED))); 451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Load other labels from resources. 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch usage_statistics_checkbox_->SetLabel( 4553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen UTF16ToWide(l10n_util::GetStringUTF16(IDS_EULA_CHECKBOX_ENABLE_LOGGING))); 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch learn_more_link_->SetText( 4573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen UTF16ToWide(l10n_util::GetStringUTF16(IDS_LEARN_MORE))); 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch system_security_settings_link_->SetText( 4593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen UTF16ToWide(l10n_util::GetStringUTF16(IDS_EULA_SYSTEM_SECURITY_SETTING))); 4603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen continue_button_->SetLabel(UTF16ToWide( 4613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen l10n_util::GetStringUTF16(IDS_EULA_ACCEPT_AND_CONTINUE_BUTTON))); 4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick back_button_->SetLabel( 4633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen UTF16ToWide(l10n_util::GetStringUTF16(IDS_EULA_BACK_BUTTON))); 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 4673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// EulaView, protected, views::View implementation: 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid EulaView::OnLocaleChanged() { 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UpdateLocalizedStrings(); 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Layout(); 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// views::ButtonListener implementation: 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid EulaView::ButtonPressed(views::Button* sender, const views::Event& event) { 478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (usage_statistics_checkbox_) { 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen observer_->set_usage_statistics_reporting( 480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen usage_statistics_checkbox_->checked()); 481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (sender == continue_button_) { 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_->OnExit(ScreenObserver::EULA_ACCEPTED); 4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (sender == back_button_) { 4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick observer_->OnExit(ScreenObserver::EULA_BACK); 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// views::LinkController implementation: 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid EulaView::LinkActivated(views::Link* source, int event_flags) { 49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gfx::NativeWindow parent_window = 49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoginUtils::Get()->GetBackgroundView()->GetNativeWindow(); 4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (source == learn_more_link_) { 4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!help_app_.get()) 49772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen help_app_ = new HelpAppLauncher(parent_window); 4983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick help_app_->ShowHelpTopic(HelpAppLauncher::HELP_STATS_USAGE); 4993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (source == system_security_settings_link_) { 500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TpmInfoView* view = new TpmInfoView(&tpm_password_); 501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick view->Init(); 50272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::Window* window = browser::CreateViewsWindow(parent_window, 50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gfx::Rect(), 50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen view); 505731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick window->SetIsAlwaysOnTop(true); 506731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick window->Show(); 5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//////////////////////////////////////////////////////////////////////////////// 5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// TabContentsDelegate implementation: 5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Convenience function. Queries |eula_view| for HTML title and, if it 5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// is ready, assigns it to |eula_label| and returns true so the caller 5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// view calls Layout(). 5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstatic bool PublishTitleIfReady(const TabContents* contents, 5173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DOMView* eula_view, 5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Label* eula_label) { 5193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (contents != eula_view->tab_contents()) 5203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick eula_label->SetText(UTF16ToWide(eula_view->tab_contents()->GetTitle())); 5223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 5233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid EulaView::NavigationStateChanged(const TabContents* contents, 5263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned changed_flags) { 5273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (changed_flags & TabContents::INVALIDATE_TITLE) { 5283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (PublishTitleIfReady(contents, google_eula_view_, google_eula_label_) || 5293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick PublishTitleIfReady(contents, oem_eula_view_, oem_eula_label_)) { 5303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Layout(); 5313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid EulaView::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Widget* widget = GetWidget(); 537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (widget && event.os_event && !event.skip_in_browser) { 538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen views::KeyEvent views_event(reinterpret_cast<GdkEvent*>(event.os_event)); 539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<views::WidgetGtk*>(widget)->HandleKeyboardEvent(views_event); 540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//////////////////////////////////////////////////////////////////////////////// 5443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// EulaView, private: 5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid EulaView::LoadEulaView(DOMView* eula_view, 5473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Label* eula_label, 5483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GURL& eula_url) { 5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Profile* profile = ProfileManager::GetDefaultProfile(); 5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick eula_view->Init(profile, 5513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SiteInstance::CreateSiteInstanceForURL(profile, eula_url)); 5523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick eula_view->LoadURL(eula_url); 5533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick eula_view->tab_contents()->set_delegate(this); 5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//////////////////////////////////////////////////////////////////////////////// 5573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// EulaView, private, views::View implementation: 5583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool EulaView::OnKeyPressed(const views::KeyEvent&) { 5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Close message bubble if shown. bubble_ will be set to NULL in callback. 5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (bubble_) { 5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bubble_->Close(); 5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace chromeos 569