diff options
author | rogerta@chromium.org <rogerta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-25 19:18:45 +0000 |
---|---|---|
committer | rogerta@chromium.org <rogerta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-25 19:18:45 +0000 |
commit | 265c9273579373e786607d2ac363475dcf4d8c83 (patch) | |
tree | 60854c4655e2e51cd1cc04e6dc9a8f4fe71fb14a | |
parent | fa48ca4477594053812f8128b24f55604c6bc53a (diff) | |
download | chromium_src-265c9273579373e786607d2ac363475dcf4d8c83.zip chromium_src-265c9273579373e786607d2ac363475dcf4d8c83.tar.gz chromium_src-265c9273579373e786607d2ac363475dcf4d8c83.tar.bz2 |
Change the one-click sign in confirmation bubble into a modal dialog
BUG=171330
TEST=One-click sign in process should end with this modal dialog instead of
non-modal bubble. See image attached to bug.
Review URL: https://chromiumcodereview.appspot.com/11896021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178868 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/app/chromium_strings.grd | 3 | ||||
-rw-r--r-- | chrome/app/generated_resources.grd | 26 | ||||
-rw-r--r-- | chrome/app/google_chrome_strings.grd | 3 | ||||
-rw-r--r-- | chrome/browser/ui/browser_window.h | 6 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/browser_window_cocoa.h | 1 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/browser_window_cocoa.mm | 3 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/browser_window_gtk.cc | 3 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/browser_window_gtk.h | 1 | ||||
-rw-r--r-- | chrome/browser/ui/sync/one_click_signin_helper.cc | 2 | ||||
-rw-r--r-- | chrome/browser/ui/views/frame/browser_view.cc | 4 | ||||
-rw-r--r-- | chrome/browser/ui/views/frame/browser_view.h | 1 | ||||
-rw-r--r-- | chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc | 244 | ||||
-rw-r--r-- | chrome/browser/ui/views/sync/one_click_signin_bubble_view.h | 49 | ||||
-rw-r--r-- | chrome/browser/ui/views/sync/one_click_signin_bubble_view_browsertest.cc | 1 | ||||
-rw-r--r-- | chrome/test/base/test_browser_window.h | 1 |
15 files changed, 279 insertions, 69 deletions
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index cd85b75..847fabe 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd @@ -831,6 +831,9 @@ For Chromium, processes used to display diagnostics information (such as this "a <!-- One click sign in infobar --> <if expr="not pp_ifdef('chromeos')"> + <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE" desc="The title of the modal dialog window that opens when the user chooses to use one click sign in."> + You're signed in to Chromium! + </message> <message name="IDS_ONE_CLICK_SIGNIN_INFOBAR_MESSAGE" desc="The string shown in the infobar explaining that the user can connect his profile to a Google account instead of logging in only here."> Use this Google Account to sync all your Chromium stuff? </message> diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index b5b5b3f..3d97224 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -11181,25 +11181,23 @@ experiment id: "<ph name="EXPERIMENT_ID">$5<ex>ar1</ex></ph>" <message name="IDS_ONE_CLICK_SIGNIN_INFOBAR_CANCEL_BUTTON" desc="The string used in the infobar button that the user presses to never see this infobar again."> No thanks </message> - <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE" desc="The title of the modal dialog window that opens when the user chooses to use one click sign in."> - Sign in + + <!-- One click sign in bubble and dialog --> + <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE" desc="The message of the one click sign in dialog."> + Now you can access your bookmarks, history, and other settings on all of your signed in devices. </message> <message name="IDS_ONE_CLICK_BUBBLE_UNDO" desc="The text for the undo button in the one click signin bubble."> Undo </message> - <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE" desc="The message of the one click sign in dialog."> - Signing in will sync your data with your Google Account so you can access your bookmarks, history, and other settings on any device. + <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON" desc="The text of the OK button of the one click sign in dialog."> + OK, got it! + </message> + <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON" desc="The text of the undo button of the one click sign in dialog."> + Undo + </message> + <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED" desc="The advanced link in the one click sign in dialog. Clicking the link will take the user to advanced settings."> + Advanced </message> - <if expr="pp_ifdef('use_titlecase')"> - <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON" desc="In Title Case: The text of the OK button of the one click sign in dialog."> - Start Syncing - </message> - </if> - <if expr="not pp_ifdef('use_titlecase')"> - <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON" desc="The text of the OK button of the one click sign in dialog."> - Start syncing - </message> - </if> <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_CHECKBOX" desc="The text of checkbox in the one click sign in dialog indicating that default sync settings will be used."> Use default settings </message> diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index 5b8ac43..b2b12a7 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd @@ -755,6 +755,9 @@ For Google Chrome, processes used to display diagnostics information (such as th <!-- One click sign in infobar --> <if expr="not pp_ifdef('chromeos')"> + <message name="IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE" desc="The title of the modal dialog window that opens when the user chooses to use one click sign in."> + You're signed in to Chrome! + </message> <message name="IDS_ONE_CLICK_SIGNIN_INFOBAR_MESSAGE" desc="The string shown in the infobar explaining that the user can connect his profile to a Google account instead of logging in only here."> Use this Google Account to sync all your Chrome stuff? </message> diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h index ad1184f..d6d2fce 100644 --- a/chrome/browser/ui/browser_window.h +++ b/chrome/browser/ui/browser_window.h @@ -218,6 +218,11 @@ class BrowserWindow : public BaseWindow { virtual void ShowChromeToMobileBubble() = 0; #if defined(ENABLE_ONE_CLICK_SIGNIN) + enum OneClickSigninBubbleType { + ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE, + ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG + }; + // Callback type used with the ShowOneClickSigninBubble() method. If the // user chooses to accept the sign in, the callback is called to start the // sync process. @@ -226,6 +231,7 @@ class BrowserWindow : public BaseWindow { // Shows the one-click sign in bubble. virtual void ShowOneClickSigninBubble( + OneClickSigninBubbleType type, const StartSyncCallback& start_sync_callback) = 0; #endif diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.h b/chrome/browser/ui/cocoa/browser_window_cocoa.h index f667251..060972d 100644 --- a/chrome/browser/ui/cocoa/browser_window_cocoa.h +++ b/chrome/browser/ui/cocoa/browser_window_cocoa.h @@ -100,6 +100,7 @@ class BrowserWindowCocoa : virtual void ShowChromeToMobileBubble() OVERRIDE; #if defined(ENABLE_ONE_CLICK_SIGNIN) virtual void ShowOneClickSigninBubble( + OneClickSigninBubbleType type, const StartSyncCallback& start_sync_callback) OVERRIDE; #endif virtual bool IsDownloadShelfVisible() const OVERRIDE; diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.mm b/chrome/browser/ui/cocoa/browser_window_cocoa.mm index 0b45d03..9ea43b82 100644 --- a/chrome/browser/ui/cocoa/browser_window_cocoa.mm +++ b/chrome/browser/ui/cocoa/browser_window_cocoa.mm @@ -476,7 +476,8 @@ void BrowserWindowCocoa::ShowChromeToMobileBubble() { #if defined(ENABLE_ONE_CLICK_SIGNIN) void BrowserWindowCocoa::ShowOneClickSigninBubble( - const StartSyncCallback& start_sync_callback) { + OneClickSigninBubbleType type, + const StartSyncCallback& start_sync_callback) { OneClickSigninBubbleController* bubble_controller = [[OneClickSigninBubbleController alloc] initWithBrowserWindowController:cocoa_controller() diff --git a/chrome/browser/ui/gtk/browser_window_gtk.cc b/chrome/browser/ui/gtk/browser_window_gtk.cc index 7924bee..ad2da1d 100644 --- a/chrome/browser/ui/gtk/browser_window_gtk.cc +++ b/chrome/browser/ui/gtk/browser_window_gtk.cc @@ -968,7 +968,8 @@ void BrowserWindowGtk::ShowChromeToMobileBubble() { #if defined(ENABLE_ONE_CLICK_SIGNIN) void BrowserWindowGtk::ShowOneClickSigninBubble( - const StartSyncCallback& start_sync_callback) { + OneClickSigninBubbleType type, + const StartSyncCallback& start_sync_callback) { new OneClickSigninBubbleGtk(this, start_sync_callback); } #endif diff --git a/chrome/browser/ui/gtk/browser_window_gtk.h b/chrome/browser/ui/gtk/browser_window_gtk.h index cfceac8..5c2204b 100644 --- a/chrome/browser/ui/gtk/browser_window_gtk.h +++ b/chrome/browser/ui/gtk/browser_window_gtk.h @@ -134,6 +134,7 @@ class BrowserWindowGtk virtual void ShowChromeToMobileBubble() OVERRIDE; #if defined(ENABLE_ONE_CLICK_SIGNIN) virtual void ShowOneClickSigninBubble( + OneClickSigninBubbleType type, const StartSyncCallback& start_sync_callback) OVERRIDE; #endif virtual bool IsDownloadShelfVisible() const OVERRIDE; diff --git a/chrome/browser/ui/sync/one_click_signin_helper.cc b/chrome/browser/ui/sync/one_click_signin_helper.cc index 94b9116..b6436b7 100644 --- a/chrome/browser/ui/sync/one_click_signin_helper.cc +++ b/chrome/browser/ui/sync/one_click_signin_helper.cc @@ -350,6 +350,7 @@ bool OneClickInfoBarDelegateImpl::Accept() { RecordHistogramAction(one_click_signin::HISTOGRAM_ACCEPTED); chrome::FindBrowserWithWebContents(web_contents)->window()-> ShowOneClickSigninBubble( + BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE, base::Bind(&StartSync, browser, OneClickSigninHelper::AUTO_ACCEPT_NONE, session_index_, email_, password_)); @@ -904,6 +905,7 @@ void OneClickSigninHelper::DidStopLoading( case AUTO_ACCEPT_ACCEPTED: SigninManager::DisableOneClickSignIn(profile); browser->window()->ShowOneClickSigninBubble( + BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG, base::Bind(&StartSync, browser, auto_accept_, session_index_, email_, password_)); break; diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 7f857b2..895c2f2 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc @@ -1125,9 +1125,9 @@ void BrowserView::ShowChromeToMobileBubble() { #if defined(ENABLE_ONE_CLICK_SIGNIN) void BrowserView::ShowOneClickSigninBubble( + OneClickSigninBubbleType type, const StartSyncCallback& start_sync_callback) { - OneClickSigninBubbleView::ShowBubble(toolbar_->app_menu(), - start_sync_callback); + OneClickSigninBubbleView::ShowBubble(type, toolbar_, start_sync_callback); } #endif diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index c6fd649..5569734 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h @@ -318,6 +318,7 @@ class BrowserView : public BrowserWindow, virtual void ShowChromeToMobileBubble() OVERRIDE; #if defined(ENABLE_ONE_CLICK_SIGNIN) virtual void ShowOneClickSigninBubble( + OneClickSigninBubbleType type, const StartSyncCallback& start_sync_callback) OVERRIDE; #endif // TODO(beng): Not an override, move somewhere else. diff --git a/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc b/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc index 3b9ec08..273d446 100644 --- a/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc +++ b/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc @@ -10,12 +10,17 @@ #include "chrome/browser/google/google_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/url_constants.h" +#include "content/public/browser/web_contents.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" +#include "grit/theme_resources.h" +#include "grit/ui_resources.h" #include "ui/base/keycodes/keyboard_codes.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/text_button.h" +#include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/controls/link.h" #include "ui/views/layout/grid_layout.h" @@ -23,7 +28,163 @@ #include "ui/views/widget/widget.h" // Minimum width for the mutli-line label. +const int kMinimumDialogLabelWidth = 400; const int kMinimumLabelWidth = 240; +const int kDialogMargin = 16; + +namespace { + +// The column set constants that can be used in the InitContent() function +// to layout views. +enum OneClickSigninBubbleColumnTypes { + COLUMN_SET_FILL_ALIGN, + COLUMN_SET_CONTROLS, + COLUMN_SET_TITLE_BAR +}; + +class OneClickSigninDialogView : public OneClickSigninBubbleView { + public: + OneClickSigninDialogView( + content::WebContents* web_content, + views::View* anchor_view, + const BrowserWindow::StartSyncCallback& start_sync_callback); + + private: + // Overridden from views::WidgetDelegate: + virtual ui::ModalType GetModalType() const OVERRIDE; + + // Overridden from OneClickSigninBubbleView: + virtual void InitContent(views::GridLayout* layout) OVERRIDE; + virtual void GetButtons(views::TextButton** ok_button, + views::TextButton** undo_button) OVERRIDE; + virtual views::Link* GetAdvancedLink() OVERRIDE; + + // Overridden from views::LinkListener: + virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; + + content::WebContents* web_content_; + views::Link* learn_more_link_; + views::ImageButton* close_button_; + + DISALLOW_COPY_AND_ASSIGN(OneClickSigninDialogView); +}; + +OneClickSigninDialogView::OneClickSigninDialogView( + content::WebContents* web_content, + views::View* anchor_view, + const BrowserWindow::StartSyncCallback& start_sync_callback) + : OneClickSigninBubbleView(anchor_view, start_sync_callback), + web_content_(web_content), + learn_more_link_(NULL), + close_button_(NULL) { + set_arrow_location(views::BubbleBorder::NONE); + set_anchor_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0)); + set_close_on_deactivate(false); + set_margins(gfx::Insets(kDialogMargin, kDialogMargin, kDialogMargin, + kDialogMargin)); +} + +ui::ModalType OneClickSigninDialogView::GetModalType() const { + return ui::MODAL_TYPE_CHILD; +} + +void OneClickSigninDialogView::InitContent(views::GridLayout* layout) { + // Column set for title bar. + views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_TITLE_BAR); + cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, + views::GridLayout::USE_PREF, 0, 0); + cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); + cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, + views::GridLayout::USE_PREF, 0, 0); + + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + + { + layout->StartRow(0, COLUMN_SET_TITLE_BAR); + + views::Label* label = new views::Label( + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE)); + label->SetHorizontalAlignment(gfx::ALIGN_LEFT); + label->SetFont(label->font().DeriveFont(3, gfx::Font::BOLD)); + layout->AddView(label); + + close_button_ = new views::ImageButton(this); + close_button_->SetImage(views::ImageButton::STATE_NORMAL, + rb.GetImageNamed(IDR_CLOSE_BAR).ToImageSkia()); + close_button_->SetImage(views::ImageButton::STATE_HOVERED, + rb.GetImageNamed(IDR_CLOSE_BAR_H).ToImageSkia()); + close_button_->SetImage(views::ImageButton::STATE_PRESSED, + rb.GetImageNamed(IDR_CLOSE_BAR_P).ToImageSkia()); + layout->AddView(close_button_); + } + + layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); + + { + layout->StartRow(0, COLUMN_SET_FILL_ALIGN); + + views::Label* label = new views::Label( + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE)); + label->SetMultiLine(true); + label->SetHorizontalAlignment(gfx::ALIGN_LEFT); + label->SizeToFit(kMinimumDialogLabelWidth); + layout->AddView(label); + + layout->StartRow(0, COLUMN_SET_FILL_ALIGN); + + learn_more_link_ = new views::Link( + l10n_util::GetStringUTF16(IDS_LEARN_MORE)); + learn_more_link_->set_listener(this); + learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); + layout->AddView(learn_more_link_, 1, 1, views::GridLayout::TRAILING, + views::GridLayout::CENTER); + } + + layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); +} + +void OneClickSigninDialogView::GetButtons(views::TextButton** ok_button, + views::TextButton** undo_button) { + *ok_button = new views::NativeTextButton(this); + *undo_button = new views::NativeTextButton(this); + + // The default size of the buttons is too large. To allow them to be smaller + // ignore the minimum default size. Furthermore, to make sure they are the + // same size, SetText() is called with both strings on both buttons. + (*ok_button)->set_ignore_minimum_size(true); + (*undo_button)->set_ignore_minimum_size(true); + string16 ok_label = + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON); + string16 undo_label = + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON); + (*ok_button)->SetText(undo_label); + (*ok_button)->SetText(ok_label); + (*undo_button)->SetText(ok_label); + (*undo_button)->SetText(undo_label); +} + +views::Link* OneClickSigninDialogView::GetAdvancedLink() { + views::Link* advanced_link= new views::Link( + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED)); + advanced_link->set_listener(this); + advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); + return advanced_link; +} + +void OneClickSigninDialogView::LinkClicked(views::Link* source, + int event_flags) { + if (source == learn_more_link_) { + content::OpenURLParams params( + GURL(chrome::kChromeSyncLearnMoreURL), content::Referrer(), + NEW_WINDOW, content::PAGE_TRANSITION_LINK, false); + web_content_->OpenURL(params); + return; + } + + OneClickSigninBubbleView::LinkClicked(source, event_flags); +} + +} // namespace // OneClickSigninBubbleView ---------------------------------------------------- @@ -32,13 +193,17 @@ OneClickSigninBubbleView* OneClickSigninBubbleView::bubble_view_ = NULL; // static void OneClickSigninBubbleView::ShowBubble( - views::View* anchor_view, + BrowserWindow::OneClickSigninBubbleType type, + ToolbarView* toolbar_view, const BrowserWindow::StartSyncCallback& start_sync) { if (IsShowing()) return; - bubble_view_ = - new OneClickSigninBubbleView(anchor_view, start_sync); + bubble_view_ = type == BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE ? + new OneClickSigninBubbleView(toolbar_view->app_menu(), start_sync) : + new OneClickSigninDialogView(toolbar_view->GetWebContents(), + toolbar_view->location_bar(), start_sync); + views::BubbleDelegateView::CreateBubble(bubble_view_); bubble_view_->Show(); } @@ -80,17 +245,13 @@ void OneClickSigninBubbleView::Init() { SetLayoutManager(layout); set_border(views::Border::CreateEmptyBorder(8, 8, 8, 8)); - enum { - kColumnSetFillAlign, - kColumnSetControls - }; - // Column set for descriptive text and link. - views::ColumnSet* cs = layout->AddColumnSet(kColumnSetFillAlign); - cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 0, - views::GridLayout::USE_PREF, 0, kMinimumLabelWidth); + views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_FILL_ALIGN); + cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1, + views::GridLayout::USE_PREF, 0, 0); - cs = layout->AddColumnSet(kColumnSetControls); + // Column set for buttons at bottom of bubble. + cs = layout->AddColumnSet(COLUMN_SET_CONTROLS); cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0); cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); @@ -100,6 +261,22 @@ void OneClickSigninBubbleView::Init() { cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0); + InitContent(layout); + + // Add controls at the bottom. + advanced_link_= GetAdvancedLink(); + GetButtons(&ok_button_, &undo_button_); + ok_button_->SetIsDefault(true); + + layout->StartRow(0, COLUMN_SET_CONTROLS); + layout->AddView(advanced_link_); + layout->AddView(ok_button_); + layout->AddView(undo_button_); + + AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0)); +} + +void OneClickSigninBubbleView::InitContent(views::GridLayout* layout) { // Add main text description. views::Label* label = new views::Label( l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE)); @@ -107,41 +284,36 @@ void OneClickSigninBubbleView::Init() { label->SetHorizontalAlignment(gfx::ALIGN_LEFT); label->SizeToFit(kMinimumLabelWidth); - layout->StartRow(0, kColumnSetFillAlign); + layout->StartRow(0, COLUMN_SET_FILL_ALIGN); layout->AddView(label); layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); +} - // Add link for user to do advanced config of sync. - advanced_link_= new views::Link( - l10n_util::GetStringUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED)); - advanced_link_->set_listener(this); - advanced_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); - - // Add controls at the bottom. - ok_button_ = new views::NativeTextButton(this); - ok_button_->SetIsDefault(true); - - undo_button_ = new views::NativeTextButton(this); +void OneClickSigninBubbleView::GetButtons(views::TextButton** ok_button, + views::TextButton** undo_button) { + *ok_button = new views::NativeTextButton(this); + *undo_button = new views::NativeTextButton(this); // The default size of the buttons is too large. To allow them to be smaller // ignore the minimum default size. Furthermore, to make sure they are the // same size, SetText() is called with both strings on both buttons. - ok_button_->set_ignore_minimum_size(true); - undo_button_->set_ignore_minimum_size(true); + (*ok_button)->set_ignore_minimum_size(true); + (*undo_button)->set_ignore_minimum_size(true); string16 ok_label = l10n_util::GetStringUTF16(IDS_OK); string16 undo_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_BUBBLE_UNDO); - ok_button_->SetText(undo_label); - ok_button_->SetText(ok_label); - undo_button_->SetText(ok_label); - undo_button_->SetText(undo_label); - - layout->StartRow(0, kColumnSetControls); - layout->AddView(advanced_link_); - layout->AddView(ok_button_); - layout->AddView(undo_button_); + (*ok_button)->SetText(undo_label); + (*ok_button)->SetText(ok_label); + (*undo_button)->SetText(ok_label); + (*undo_button)->SetText(undo_label); +} - AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0)); +views::Link* OneClickSigninBubbleView::GetAdvancedLink() { + views::Link* advanced_link= new views::Link( + l10n_util::GetStringUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED)); + advanced_link->set_listener(this); + advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); + return advanced_link; } void OneClickSigninBubbleView::WindowClosing() { diff --git a/chrome/browser/ui/views/sync/one_click_signin_bubble_view.h b/chrome/browser/ui/views/sync/one_click_signin_bubble_view.h index 1d5b660..720d7c4 100644 --- a/chrome/browser/ui/views/sync/one_click_signin_bubble_view.h +++ b/chrome/browser/ui/views/sync/one_click_signin_bubble_view.h @@ -11,6 +11,7 @@ #include "base/gtest_prod_util.h" #include "base/string16.h" #include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/views/toolbar_view.h" #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/link_listener.h" @@ -18,6 +19,7 @@ class MessageLoop; namespace views { +class GridLayout; class TextButton; } @@ -31,7 +33,8 @@ class OneClickSigninBubbleView : public views::BubbleDelegateView, // Show the one-click signin bubble if not already showing. The bubble // will be placed visually beneath |anchor_view|. |start_sync| is called // to start sync. - static void ShowBubble(views::View* anchor_view, + static void ShowBubble(BrowserWindow::OneClickSigninBubbleType type, + ToolbarView* toolbar_view, const BrowserWindow::StartSyncCallback& start_sync); static bool IsShowing(); @@ -42,13 +45,7 @@ class OneClickSigninBubbleView : public views::BubbleDelegateView, // method is meant to be called only from tests. static OneClickSigninBubbleView* view_for_testing() { return bubble_view_; } - private: - friend class OneClickSigninBubbleViewBrowserTest; - - FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewBrowserTest, OkButton); - FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewBrowserTest, UndoButton); - FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewBrowserTest, AdvancedLink); - + protected: // Creates a OneClickSigninBubbleView. OneClickSigninBubbleView( views::View* anchor_view, @@ -56,23 +53,45 @@ class OneClickSigninBubbleView : public views::BubbleDelegateView, virtual ~OneClickSigninBubbleView(); + // Overridden from views::LinkListener: + virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; + + // Overridden from views::ButtonListener: + virtual void ButtonPressed(views::Button* sender, + const ui::Event& event) OVERRIDE; + + private: + friend class OneClickSigninBubbleViewBrowserTest; + + FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewBrowserTest, OkButton); + FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewBrowserTest, UndoButton); + FRIEND_TEST_ALL_PREFIXES(OneClickSigninBubbleViewBrowserTest, AdvancedLink); + // views::BubbleDelegateView methods: virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE; virtual void Init() OVERRIDE; + // Method to build the main part of the bubble. Derived classes should + // reimplement this function. + virtual void InitContent(views::GridLayout* layout); + + // Creates OK and Undo buttons to be used at the bottom of the bubble. + // Derived classes can reimplement to have buttons with different labels, + // colours, or sizes. The caller of this function owns the returned buttons. + virtual void GetButtons(views::TextButton** ok_button, + views::TextButton** undo_button); + + // Creates advanced link to be used at the bottom of the bubble. + // Derived classes can reimplement. The caller of this function owns the + // returned link. + virtual views::Link* GetAdvancedLink(); + // views::WidgetDelegate method: virtual void WindowClosing() OVERRIDE; // views::View method: virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; - // Overridden from views::LinkListener: - virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; - - // Overridden from views::ButtonListener: - virtual void ButtonPressed(views::Button* sender, - const ui::Event& event) OVERRIDE; - // The bubble, if we're showing one. static OneClickSigninBubbleView* bubble_view_; diff --git a/chrome/browser/ui/views/sync/one_click_signin_bubble_view_browsertest.cc b/chrome/browser/ui/views/sync/one_click_signin_bubble_view_browsertest.cc index d78bd60..713d48e 100644 --- a/chrome/browser/ui/views/sync/one_click_signin_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/sync/one_click_signin_bubble_view_browsertest.cc @@ -21,6 +21,7 @@ class OneClickSigninBubbleViewBrowserTest : public InProcessBrowserTest { OneClickSigninBubbleView* ShowOneClickSigninBubble() { browser()->window()->ShowOneClickSigninBubble( + BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE, base::Bind(&OneClickSigninBubbleViewBrowserTest::OnStartSync, this)); content::RunAllPendingInMessageLoop(); diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h index 3d541e3..2556eb4 100644 --- a/chrome/test/base/test_browser_window.h +++ b/chrome/test/base/test_browser_window.h @@ -101,6 +101,7 @@ class TestBrowserWindow : public BrowserWindow { virtual void ShowChromeToMobileBubble() OVERRIDE {} #if defined(ENABLE_ONE_CLICK_SIGNIN) virtual void ShowOneClickSigninBubble( + OneClickSigninBubbleType type, const StartSyncCallback& start_sync_callback) OVERRIDE {} #endif virtual bool IsDownloadShelfVisible() const OVERRIDE; |