background_view.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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/background_view.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <string> 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <vector> 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/l10n_util.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/resource_bundle.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/x11_util.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/helper.h" 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/oobe_progress_bar.h" 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/proxy_settings_dialog.h" 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/rounded_rect_painter.h" 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/shutdown_button.h" 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/wizard_controller.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/clock_menu_button.h" 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/status/input_method_menu_button.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/network_menu_button.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/status_area_view.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_ipc.h" 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h" 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/views/dom_view.h" 30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "gfx/gtk_util.h" 3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "googleurl/src/gurl.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h" 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/theme_resources.h" 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "third_party/cros/chromeos_wm_ipc_enums.h" 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/controls/button/text_button.h" 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h" 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/screen.h" 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget_gtk.h" 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// X Windows headers have "#define Status int". That interferes with 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetworkLibrary header which defines enum "Status". 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <X11/cursorfont.h> // NOLINT 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <X11/Xcursor/Xcursor.h> // NOLINT 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::WidgetGtk; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst SkColor kVersionColor = 0xff5c739f; 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Returns the corresponding step id for step constant. 53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint GetStepId(size_t step) { 54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch switch (step) { 55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch case chromeos::BackgroundView::SELECT_NETWORK: 56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return IDS_OOBE_SELECT_NETWORK; 57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch case chromeos::BackgroundView::EULA: 58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return IDS_OOBE_EULA; 59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch case chromeos::BackgroundView::SIGNIN: 60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return IDS_OOBE_SIGNIN; 61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch case chromeos::BackgroundView::REGISTRATION: 62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return IDS_OOBE_REGISTRATION; 63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch case chromeos::BackgroundView::PICTURE: 64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return IDS_OOBE_PICTURE; 65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch default: 66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch NOTREACHED(); 67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return 0; 68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// The same as TextButton but switches cursor to hand cursor when mouse 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// is over the button. 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TextButtonWithHandCursorOver : public views::TextButton { 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TextButtonWithHandCursorOver(views::ButtonListener* listener, 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::wstring& text) 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : views::TextButton(listener, text) { 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual ~TextButtonWithHandCursorOver() {} 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual gfx::NativeCursor GetCursorForPoint( 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Event::EventType event_type, 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const gfx::Point& p) { 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!IsEnabled()) { 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return NULL; 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return gfx::GetCursor(GDK_HAND2); 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DISALLOW_COPY_AND_ASSIGN(TextButtonWithHandCursorOver); 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This gets rid of the ugly X default cursor. 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void ResetXCursor() { 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(sky): nuke this once new window manager is in place. 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Display* display = x11_util::GetXDisplay(); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Cursor cursor = XCreateFontCursor(display, XC_left_ptr); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch XID root_window = x11_util::GetX11RootWindow(); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch XSetWindowAttributes attr; 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch attr.cursor = cursor; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch XChangeWindowAttributes(display, root_window, CWCursor, &attr); 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} // namespace 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace chromeos { 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/////////////////////////////////////////////////////////////////////////////// 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView public: 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBackgroundView::BackgroundView() 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : status_area_(NULL), 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick os_version_label_(NULL), 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick boot_times_label_(NULL), 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick progress_bar_(NULL), 118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch shutdown_button_(NULL), 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick did_paint_(false), 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OFFICIAL_BUILD) 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_official_build_(true), 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#else 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_official_build_(false), 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_area_(NULL) { 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::Init(const GURL& background_url) { 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick views::Painter* painter = CreateBackgroundPainter(); 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick set_background(views::Background::CreateBackgroundPainter(true, painter)); 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitStatusArea(); 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitInfoLabels(); 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!background_url.is_empty()) { 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Profile* profile = ProfileManager::GetDefaultProfile(); 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_area_ = new DOMView(); 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddChildView(background_area_); 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_area_->Init(profile, NULL); 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_area_->SetVisible(false); 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_area_->LoadURL(background_url); 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BackgroundView::EnableShutdownButton(bool enable) { 144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (enable) { 145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (shutdown_button_) 146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return; 147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch shutdown_button_ = new ShutdownButton(); 148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch shutdown_button_->Init(); 149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AddChildView(shutdown_button_); 150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } else { 151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!shutdown_button_) 152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return; 153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch delete shutdown_button_; 154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch shutdown_button_ = NULL; 155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch SchedulePaint(); 156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::Widget* BackgroundView::CreateWindowContainingView( 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Rect& bounds, 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GURL& background_url, 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackgroundView** view) { 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResetXCursor(); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WidgetGtk* window = new WidgetGtk(WidgetGtk::TYPE_WINDOW); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch window->Init(NULL, bounds); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *view = new BackgroundView(); 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (*view)->Init(background_url); 1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if ((*view)->ScreenSaverEnabled()) 1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (*view)->ShowScreenSaver(); 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch window->SetContentsView(*view); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (*view)->UpdateWindowType(); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This keeps the window from flashing at startup. 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkWindow* gdk_window = window->GetNativeView()->window; 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gdk_window_set_back_pixmap(gdk_window, NULL, false); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return window; 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::SetStatusAreaVisible(bool visible) { 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status_area_->SetVisible(visible); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid BackgroundView::SetStatusAreaEnabled(bool enable) { 1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch status_area_->EnableButtons(enable); 1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::SetOobeProgressBarVisible(bool visible) { 1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!progress_bar_ && visible) 1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitProgressBar(); 1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (progress_bar_) 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick progress_bar_->SetVisible(visible); 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::IsOobeProgressBarVisible() { 2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return progress_bar_ && progress_bar_->IsVisible(); 2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::SetOobeProgress(LoginStep step) { 206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(step < STEPS_COUNT); 2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (progress_bar_) 208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch progress_bar_->SetStep(GetStepId(step)); 2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::ShowScreenSaver() { 2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetStatusAreaVisible(false); 2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_area_->SetVisible(true); 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::HideScreenSaver() { 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SetStatusAreaVisible(true); 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TODO(oshima): we need a way to suspend screen saver 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // to save power when it's not visible. 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_area_->SetVisible(false); 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::IsScreenSaverVisible() { 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return ScreenSaverEnabled() && background_area_->IsVisible(); 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::ScreenSaverEnabled() { 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return background_area_ != NULL; 2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/////////////////////////////////////////////////////////////////////////////// 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView protected: 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::Paint(gfx::Canvas* canvas) { 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::View::Paint(canvas); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!did_paint_) { 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch did_paint_ = true; 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UpdateWindowType(); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::Layout() { 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kCornerPadding = 5; 244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const int kInfoLeftPadding = 15; 245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const int kInfoBottomPadding = 15; 2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kInfoBetweenLinesPadding = 4; 2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kProgressBarBottomPadding = 20; 2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kProgressBarWidth = 750; 2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const int kProgressBarHeight = 70; 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Size status_area_size = status_area_->GetPreferredSize(); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status_area_->SetBounds( 2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick width() - status_area_size.width() - kCornerPadding, 2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kCornerPadding, 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status_area_size.width(), 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status_area_size.height()); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Size version_size = os_version_label_->GetPreferredSize(); 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int os_version_y = height() - version_size.height() - kInfoBottomPadding; 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!is_official_build_) 259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick os_version_y -= version_size.height() - kInfoBetweenLinesPadding; 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch os_version_label_->SetBounds( 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kInfoLeftPadding, 262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick os_version_y, 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch width() - 2 * kInfoLeftPadding, 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch version_size.height()); 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!is_official_build_) { 266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick boot_times_label_->SetBounds( 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick kInfoLeftPadding, 268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick height() - (version_size.height() + kInfoBottomPadding), 269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick width() - 2 * kInfoLeftPadding, 270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick version_size.height()); 271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (progress_bar_) { 2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick progress_bar_->SetBounds( 2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (width() - kProgressBarWidth) / 2, 2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (height() - kProgressBarBottomPadding - kProgressBarHeight), 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kProgressBarWidth, 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kProgressBarHeight); 2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 279513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (shutdown_button_) { 280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch shutdown_button_->LayoutIn(this); 2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (background_area_) 2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick background_area_->SetBounds(this->bounds()); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::ChildPreferredSizeChanged(View* child) { 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Layout(); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SchedulePaint(); 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgfx::NativeWindow BackgroundView::GetNativeWindow() const { 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTK_WINDOW(static_cast<WidgetGtk*>(GetWidget())->GetNativeView()); 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BackgroundView::ShouldOpenButtonOptions( 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const views::View* button_view) const { 298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (button_view == status_area_->network_view()) { 299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return true; 300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (button_view == status_area_->clock_view() || 302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch button_view == status_area_->input_method_view()) { 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 308513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BackgroundView::OpenButtonOptions(const views::View* button_view) { 309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (button_view == status_area_->network_view()) { 310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (proxy_settings_dialog_.get() == NULL) { 311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch proxy_settings_dialog_.reset(new ProxySettingsDialog( 312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch this, GetNativeWindow())); 313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch proxy_settings_dialog_->Show(); 315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BackgroundView::IsBrowserMode() const { 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BackgroundView::IsScreenLockerMode() const { 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Overridden from LoginHtmlDialog::Delegate: 327513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BackgroundView::OnLocaleChanged() { 328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Proxy settings dialog contains localized strings. 329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch proxy_settings_dialog_.reset(); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/////////////////////////////////////////////////////////////////////////////// 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView private: 3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::InitStatusArea() { 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(status_area_ == NULL); 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status_area_ = new StatusAreaView(this); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status_area_->Init(); 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddChildView(status_area_); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::InitInfoLabels() { 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch os_version_label_ = new views::Label(); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch os_version_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch os_version_label_->SetColor(kVersionColor); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch os_version_label_->SetFont(rb.GetFont(ResourceBundle::SmallFont)); 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddChildView(os_version_label_); 350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!is_official_build_) { 351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick boot_times_label_ = new views::Label(); 352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick boot_times_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick boot_times_label_->SetColor(kVersionColor); 354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick boot_times_label_->SetFont(rb.GetFont(ResourceBundle::SmallFont)); 355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AddChildView(boot_times_label_); 356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (CrosLibrary::Get()->EnsureLoaded()) { 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch version_loader_.GetVersion( 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &version_consumer_, 361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &BackgroundView::OnVersion), 362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch is_official_build_? 363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch VersionLoader::VERSION_SHORT_WITH_DATE : 364201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch VersionLoader::VERSION_FULL); 365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!is_official_build_) { 366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick boot_times_loader_.GetBootTimes( 367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &boot_times_consumer_, 368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &BackgroundView::OnBootTimes)); 369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch os_version_label_->SetText( 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToWide(CrosLibrary::Get()->load_error_string())); 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::InitProgressBar() { 3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<int> steps; 378201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch steps.push_back(GetStepId(SELECT_NETWORK)); 3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD) 380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch steps.push_back(GetStepId(EULA)); 3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch steps.push_back(GetStepId(SIGNIN)); 3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD) 384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (WizardController::IsRegisterScreenDefined()) 385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch steps.push_back(GetStepId(REGISTRATION)); 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 387201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch steps.push_back(GetStepId(PICTURE)); 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick progress_bar_ = new OobeProgressBar(steps); 3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddChildView(progress_bar_); 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::UpdateWindowType() { 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<int> params; 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params.push_back(did_paint_ ? 1 : 0); 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WmIpc::instance()->SetWindowType( 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTK_WIDGET(GetNativeWindow()), 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WM_IPC_WINDOW_LOGIN_BACKGROUND, 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ¶ms); 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::OnVersion( 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VersionLoader::Handle handle, std::string version) { 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(jungshik): Is string concatenation OK here? 404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::string version_text = l10n_util::GetStringUTF8(IDS_PRODUCT_OS_NAME); 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch version_text += ' '; 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch version_text += l10n_util::GetStringUTF8(IDS_VERSION_FIELD_PREFIX); 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch version_text += ' '; 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch version_text += version; 409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Workaround over incorrect width calculation in old fonts. 411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // TODO(glotov): remove the following line when new fonts are used. 412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch version_text += ' '; 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch os_version_label_->SetText(UTF8ToWide(version_text)); 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::OnBootTimes( 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BootTimesLoader::Handle handle, BootTimesLoader::BootTimes boot_times) { 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* kBootTimesNoChromeExec = 419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch "Non-firmware boot took %.2f seconds (kernel %.2fs, system %.2fs)"; 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* kBootTimesChromeExec = 421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch "Non-firmware boot took %.2f seconds " 422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch "(kernel %.2fs, system %.2fs, chrome %.2fs)"; 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string boot_times_text; 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (boot_times.chrome > 0) { 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times_text = 4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::StringPrintf( 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kBootTimesChromeExec, 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times.total, 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times.pre_startup, 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times.system, 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times.chrome); 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times_text = 4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::StringPrintf( 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kBootTimesNoChromeExec, 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times.total, 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times.pre_startup, 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times.system); 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Use UTF8ToWide once this string is localized. 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch boot_times_label_->SetText(ASCIIToWide(boot_times_text)); 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace chromeos 446