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