diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/app/generated_resources.grd | 3 | ||||
-rw-r--r-- | chrome/browser/browser_main.cc | 2 | ||||
-rw-r--r-- | chrome/browser/chromeos/login_manager_view.cc | 131 | ||||
-rw-r--r-- | chrome/browser/chromeos/login_manager_view.h | 22 | ||||
-rw-r--r-- | chrome/browser/chromeos/login_wizard_view.cc | 156 | ||||
-rw-r--r-- | chrome/browser/chromeos/login_wizard_view.h | 49 | ||||
-rw-r--r-- | chrome/browser/views/browser_dialogs.h | 4 | ||||
-rwxr-xr-x | chrome/chrome_browser.gypi | 2 |
8 files changed, 255 insertions, 114 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index b9acb02..58f2c95 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -6744,6 +6744,9 @@ Keep your key file in a safe place. You will need it to create new versions of y <message name="IDS_LOGIN_DISABLED_NO_LIBCROS" desc="On the login screen, the text we put on the screen in the event that we cannot load the Chromium OS shared library and must therefore disable login."> libcros.so cannot be loaded. Login disabled. </message> + <message name="IDS_LOGIN_TITLE"> + Sign in with your Google Account + </message> <message name="IDS_OPTIONS_SETTINGS_SECTION_TITLE_DATETIME"> Date and Time </message> diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc index 5a1f984..42d2c14 100644 --- a/chrome/browser/browser_main.cc +++ b/chrome/browser/browser_main.cc @@ -576,7 +576,7 @@ int BrowserMain(const MainFunctionParams& parameters) { #if defined(OS_CHROMEOS) if (parsed_command_line.HasSwitch(switches::kLoginManager)) { - browser::ShowLoginManager(); + browser::ShowLoginWizard(); } #endif // OS_CHROMEOS diff --git a/chrome/browser/chromeos/login_manager_view.cc b/chrome/browser/chromeos/login_manager_view.cc index 4d6a76c..d19e92a 100644 --- a/chrome/browser/chromeos/login_manager_view.cc +++ b/chrome/browser/chromeos/login_manager_view.cc @@ -4,7 +4,6 @@ #include "chrome/browser/chromeos/login_manager_view.h" -#include <gdk/gdk.h> #include <signal.h> #include <sys/types.h> @@ -33,107 +32,34 @@ using views::Textfield; using views::View; using views::Widget; -const int kUsernameY = 386; +const int kTitleY = 50; const int kPanelSpacing = 36; const int kVersionPad = 4; const int kTextfieldWidth = 286; const SkColor kVersionColor = 0xFF7691DA; const SkColor kErrorColor = 0xFF8F384F; +const SkColor kBackground = SK_ColorWHITE; const char *kDefaultDomain = "@gmail.com"; -// There's a GdkBlankCursor defined in a later version of gdk. -// The version in cros is late enough to support it. -#define BlankCursor static_cast<GdkCursorType>(-2) - -namespace browser { - -// Acts as a frame view with no UI. -class LoginManagerNonClientFrameView : public views::NonClientFrameView { - public: - explicit LoginManagerNonClientFrameView() : views::NonClientFrameView() {} - - // Returns just the bounds of the window. - virtual gfx::Rect GetBoundsForClientView() const { return bounds(); } - - // Doesn't add any size to the client bounds. - virtual gfx::Rect GetWindowBoundsForClientBounds( - const gfx::Rect& client_bounds) const { - return client_bounds; - } - - // There is no system menu. - virtual gfx::Point GetSystemMenuPoint() const { return gfx::Point(); } - // There is no non client area. - virtual int NonClientHitTest(const gfx::Point& point) { return 0; } - - // There is no non client area. - virtual void GetWindowMask(const gfx::Size& size, - gfx::Path* window_mask) {} - virtual void EnableClose(bool enable) {} - virtual void ResetWindowControls() {} - - DISALLOW_COPY_AND_ASSIGN(LoginManagerNonClientFrameView); -}; - -// Subclass of WindowGtk, for use as the top level login window. -class LoginManagerWindow : public views::WindowGtk { - public: - static LoginManagerWindow* CreateLoginManagerWindow() { - LoginManagerWindow* login_manager_window = - new LoginManagerWindow(); - login_manager_window->GetNonClientView()->SetFrameView( - new LoginManagerNonClientFrameView()); - login_manager_window->Init(NULL, gfx::Rect()); - - // This keeps the window from flashing at startup. - GdkWindow* gdk_window = - GTK_WIDGET(login_manager_window->GetNativeWindow())->window; - gdk_window_set_back_pixmap(gdk_window, NULL, false); - // Hide the cursor initially. - gdk_window_set_cursor(gdk_window, gdk_cursor_new(BlankCursor)); - return login_manager_window; - } - - private: - LoginManagerWindow() : views::WindowGtk(new LoginManagerView) { - } - - DISALLOW_COPY_AND_ASSIGN(LoginManagerWindow); -}; - -// Declared in browser_dialogs.h so that others don't need to depend on our .h. -void ShowLoginManager() { - // if we can't load the library, we'll tell the user in LoginManagerView. - views::WindowGtk* window = - LoginManagerWindow::CreateLoginManagerWindow(); - window->Show(); - if (chromeos::LoginLibrary::EnsureLoaded()) - chromeos::LoginLibrary::Get()->EmitLoginPromptReady(); - bool old_state = MessageLoop::current()->NestableTasksAllowed(); - MessageLoop::current()->SetNestableTasksAllowed(true); - MessageLoop::current()->Run(); - MessageLoop::current()->SetNestableTasksAllowed(old_state); -} -} // namespace browser - -LoginManagerView::LoginManagerView() { +LoginManagerView::LoginManagerView(int width, int height) { + dialog_dimensions_.SetSize(width, height); Init(); } LoginManagerView::~LoginManagerView() { - MessageLoop::current()->Quit(); } void LoginManagerView::Init() { username_field_ = new views::Textfield; - username_field_->RemoveBorder(); password_field_ = new views::Textfield(views::Textfield::STYLE_PASSWORD); - password_field_->RemoveBorder(); os_version_label_ = new views::Label(); os_version_label_->SetColor(kVersionColor); os_version_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + title_label_ = new views::Label(); + title_label_->SetText(l10n_util::GetString(IDS_LOGIN_TITLE)); + error_label_ = new views::Label(); error_label_->SetColor(kErrorColor); error_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); @@ -155,26 +81,21 @@ gfx::Size LoginManagerView::GetPreferredSize() { } void LoginManagerView::BuildWindow() { - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - panel_pixbuf_ = rb.GetPixbufNamed(IDR_LOGIN_PANEL); - background_pixbuf_ = rb.GetPixbufNamed(IDR_LOGIN_BACKGROUND); - - // --------------------- Get attributes of images ----------------------- - dialog_dimensions_.SetSize(gdk_pixbuf_get_width(background_pixbuf_), - gdk_pixbuf_get_height(background_pixbuf_)); - - int panel_height = gdk_pixbuf_get_height(panel_pixbuf_); - int panel_width = gdk_pixbuf_get_width(panel_pixbuf_); - - // ---------------------- Set up root View ------------------------------ - set_background(new views::ImageBackground(background_pixbuf_)); - View* login_prompt = new View(); - login_prompt->set_background(new views::ImageBackground(panel_pixbuf_)); - login_prompt->SetBounds(0, 0, panel_width, panel_height); - - int x = (panel_width - kTextfieldWidth) / 2; - int y = kUsernameY; + login_prompt->set_background( + views::Background::CreateSolidBackground(kBackground)); + login_prompt->SetBounds(0, + 0, + dialog_dimensions_.width(), + dialog_dimensions_.height()); + + int x = (dialog_dimensions_.width() - kTextfieldWidth) / 2; + int y = kTitleY; + title_label_->SetBounds(x, + y, + kTextfieldWidth, + title_label_->GetPreferredSize().height()); + y += kPanelSpacing; username_field_->SetBounds(x, y, kTextfieldWidth, kPanelSpacing); y += 2 * kPanelSpacing; password_field_->SetBounds(x, y, kTextfieldWidth, kPanelSpacing); @@ -182,15 +103,16 @@ void LoginManagerView::BuildWindow() { os_version_label_->SetBounds( x, y, - panel_width - (x + kVersionPad), + dialog_dimensions_.width() - (x + kVersionPad), os_version_label_->GetPreferredSize().height()); y += kPanelSpacing; error_label_->SetBounds( x, y, - panel_width - (x + kVersionPad), + dialog_dimensions_.width() - (x + kVersionPad), error_label_->GetPreferredSize().height()); + login_prompt->AddChildView(title_label_); login_prompt->AddChildView(username_field_); login_prompt->AddChildView(password_field_); login_prompt->AddChildView(os_version_label_); @@ -228,8 +150,8 @@ bool LoginManagerView::Authenticate(const std::string& username, } void LoginManagerView::SetupSession(const std::string& username) { - if (window()) { - window()->Close(); + if (observer_) { + observer_->OnLogin(); } if (username.find("@google.com") != std::string::npos) { // This isn't thread-safe. However, the login window is specifically @@ -240,6 +162,7 @@ void LoginManagerView::SetupSession(const std::string& username) { } if (chromeos::LoginLibrary::EnsureLoaded()) chromeos::LoginLibrary::Get()->StartSession(username, ""); + } bool LoginManagerView::HandleKeystroke(views::Textfield* s, diff --git a/chrome/browser/chromeos/login_manager_view.h b/chrome/browser/chromeos/login_manager_view.h index 03b2c6f..c74eb53 100644 --- a/chrome/browser/chromeos/login_manager_view.h +++ b/chrome/browser/chromeos/login_manager_view.h @@ -15,13 +15,18 @@ #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_MANAGER_VIEW_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_MANAGER_VIEW_H_ -class FilePath; - class LoginManagerView : public views::View, public views::WindowDelegate, public views::Textfield::Controller { public: - LoginManagerView(); + // Observer for login related events. + class LoginObserver { + public: + virtual ~LoginObserver() {} + virtual void OnLogin() = 0; + }; + + LoginManagerView(int width, int height); virtual ~LoginManagerView(); // Initialize the controls on the dialog. @@ -33,7 +38,6 @@ class LoginManagerView : public views::View, // Overridden from views::WindowDelegate: virtual views::View* GetContentsView(); - // Overridden from views::Textfield::Controller // Not thread-safe, by virtue of using SetupSession(). virtual bool HandleKeystroke(views::Textfield* sender, @@ -42,25 +46,29 @@ class LoginManagerView : public views::View, virtual void ContentsChanged(views::Textfield* sender, const string16& new_contents) {} + void set_observer(LoginObserver* observer) { + observer_ = observer; + } + // Creates all examples and start UI event loop. private: views::Textfield* username_field_; views::Textfield* password_field_; views::Label* os_version_label_; + views::Label* title_label_; views::Label* error_label_; // The dialog dimensions. gfx::Size dialog_dimensions_; - GdkPixbuf* background_pixbuf_; - GdkPixbuf* panel_pixbuf_; - // Handles asynchronously loading the version. chromeos::VersionLoader loader_; // Used to request the version. CancelableRequestConsumer consumer_; + LoginObserver* observer_; + // Helper functions to modularize class void BuildWindow(); diff --git a/chrome/browser/chromeos/login_wizard_view.cc b/chrome/browser/chromeos/login_wizard_view.cc new file mode 100644 index 0000000..295f7e5 --- /dev/null +++ b/chrome/browser/chromeos/login_wizard_view.cc @@ -0,0 +1,156 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/login_wizard_view.h" + +#include <gdk/gdk.h> +#include <signal.h> +#include <sys/types.h> + +#include "app/l10n_util.h" +#include "app/resource_bundle.h" +#include "base/file_path.h" +#include "base/logging.h" +#include "base/process_util.h" +#include "chrome/browser/chromeos/image_background.h" +#include "chrome/browser/chromeos/login_library.h" +#include "chrome/browser/views/browser_dialogs.h" +#include "grit/generated_resources.h" +#include "grit/theme_resources.h" +#include "views/window/non_client_view.h" +#include "views/window/window.h" +#include "views/window/window_gtk.h" + +using views::Background; +using views::View; +using views::Widget; + +// There's a GdkBlankCursor defined in a later version of gdk. +// The version in cros is late enough to support it. +#define BlankCursor static_cast<GdkCursorType>(-2) + +namespace browser { + +// Acts as a frame view with no UI. +class LoginWizardNonClientFrameView : public views::NonClientFrameView { + public: + explicit LoginWizardNonClientFrameView() : views::NonClientFrameView() {} + + // Returns just the bounds of the window. + virtual gfx::Rect GetBoundsForClientView() const { return bounds(); } + + // Doesn't add any size to the client bounds. + virtual gfx::Rect GetWindowBoundsForClientBounds( + const gfx::Rect& client_bounds) const { + return client_bounds; + } + + // There is no system menu. + virtual gfx::Point GetSystemMenuPoint() const { return gfx::Point(); } + // There is no non client area. + virtual int NonClientHitTest(const gfx::Point& point) { return 0; } + + // There is no non client area. + virtual void GetWindowMask(const gfx::Size& size, + gfx::Path* window_mask) {} + virtual void EnableClose(bool enable) {} + virtual void ResetWindowControls() {} + + DISALLOW_COPY_AND_ASSIGN(LoginWizardNonClientFrameView); +}; + +// Subclass of WindowGtk, for use as the top level login window. +class LoginWizardWindow : public views::WindowGtk { + public: + static LoginWizardWindow* CreateLoginWizardWindow() { + LoginWizardWindow* login_wizard_window = + new LoginWizardWindow(); + login_wizard_window->GetNonClientView()->SetFrameView( + new LoginWizardNonClientFrameView()); + login_wizard_window->Init(NULL, gfx::Rect()); + + // This keeps the window from flashing at startup. + GdkWindow* gdk_window = + GTK_WIDGET(login_wizard_window->GetNativeWindow())->window; + gdk_window_set_back_pixmap(gdk_window, NULL, false); + // Hide the cursor initially. + // TODO(nkostylev): Fix cursor setting. + //gdk_window_set_cursor(gdk_window, gdk_cursor_new(BlankCursor)); + return login_wizard_window; + } + + private: + LoginWizardWindow() : views::WindowGtk(new LoginWizardView) { + } + + DISALLOW_COPY_AND_ASSIGN(LoginWizardWindow); +}; + +// Declared in browser_dialogs.h so that others don't need to depend on our .h. +void ShowLoginWizard() { + views::WindowGtk* window = + LoginWizardWindow::CreateLoginWizardWindow(); + window->Show(); + if (chromeos::LoginLibrary::EnsureLoaded()) { + chromeos::LoginLibrary::Get()->EmitLoginPromptReady(); + } + bool old_state = MessageLoop::current()->NestableTasksAllowed(); + MessageLoop::current()->SetNestableTasksAllowed(true); + MessageLoop::current()->Run(); + MessageLoop::current()->SetNestableTasksAllowed(old_state); +} + +} // namespace browser + +LoginWizardView::LoginWizardView() { + Init(); +} + +LoginWizardView::~LoginWizardView() { + MessageLoop::current()->Quit(); +} + +void LoginWizardView::Init() { + InitWizardWindow(); + // TODO(nkostylev): Select initial wizard view based on OOBE switch. + InitLoginWindow(); +} + +gfx::Size LoginWizardView::GetPreferredSize() { + return dimensions_; +} + +void LoginWizardView::OnLogin() { + if (window()) { + window()->Close(); + } +} + +void LoginWizardView::InitLoginWindow() { + int login_width = dimensions_.width() / 2; + int login_height = dimensions_.height() / 2; + LoginManagerView* login_view = new LoginManagerView(login_width, + login_height); + login_view->set_observer(this); + login_view->SetBounds(dimensions_.width() / 4, + dimensions_.height() / 4, + login_width, + login_height); + AddChildView(login_view); +} + +void LoginWizardView::InitWizardWindow() { + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + background_pixbuf_ = rb.GetPixbufNamed(IDR_LOGIN_BACKGROUND); + int width = gdk_pixbuf_get_width(background_pixbuf_); + int height = gdk_pixbuf_get_height(background_pixbuf_); + dimensions_.SetSize(width, height); + set_background(new views::ImageBackground(background_pixbuf_)); + // TODO(nkostylev): Add status bar (language, network, battery, clock). +} + +views::View* LoginWizardView::GetContentsView() { + return this; +} + diff --git a/chrome/browser/chromeos/login_wizard_view.h b/chrome/browser/chromeos/login_wizard_view.h new file mode 100644 index 0000000..f0f28e6 --- /dev/null +++ b/chrome/browser/chromeos/login_wizard_view.h @@ -0,0 +1,49 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "app/gfx/canvas.h" +#include "chrome/browser/chromeos/login_manager_view.h" +#include "views/view.h" +#include "views/window/window_delegate.h" + +#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_VIEW_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_VIEW_H_ + +// View for the wizard that will launch OOBE steps or login screen. +class LoginWizardView : public views::View, + public views::WindowDelegate, + public LoginManagerView::LoginObserver { + public: + LoginWizardView(); + virtual ~LoginWizardView(); + + // Initializes wizard windows and controls (status bar). + void Init(); + + // Overridden from views::View: + virtual gfx::Size GetPreferredSize(); + + // Overridden from views::WindowDelegate: + virtual views::View* GetContentsView(); + + // LoginObserver notification. + virtual void OnLogin(); + + private: + // Creates login window. + void InitLoginWindow(); + + // Creates main wizard window with status bar. + void InitWizardWindow(); + + // Background for the wizard view. + GdkPixbuf* background_pixbuf_; + + // Wizard view dimensions. + gfx::Size dimensions_; + + DISALLOW_COPY_AND_ASSIGN(LoginWizardView); +}; + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_VIEW_H_ diff --git a/chrome/browser/views/browser_dialogs.h b/chrome/browser/views/browser_dialogs.h index 62e25e0..37c73cc6 100644 --- a/chrome/browser/views/browser_dialogs.h +++ b/chrome/browser/views/browser_dialogs.h @@ -89,8 +89,8 @@ void ShowNewProfileDialog(); void ShowTaskManager(); #if defined(OS_CHROMEOS) -// Shows the Login Manager. -void ShowLoginManager(); +// Shows the Login Wizard. +void ShowLoginWizard(); #endif // Shows a dialog box that allows a search engine to be edited. |template_url| diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 61d40f3..91da6e8 100755 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -289,6 +289,8 @@ 'browser/chromeos/login_library.h', 'browser/chromeos/login_manager_view.cc', 'browser/chromeos/login_manager_view.h', + 'browser/chromeos/login_wizard_view.cc', + 'browser/chromeos/login_wizard_view.h', 'browser/chromeos/main_menu.cc', 'browser/chromeos/main_menu.h', 'browser/chromeos/mount_library.cc', |