summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrogerta@chromium.org <rogerta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-25 19:18:45 +0000
committerrogerta@chromium.org <rogerta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-25 19:18:45 +0000
commit265c9273579373e786607d2ac363475dcf4d8c83 (patch)
tree60854c4655e2e51cd1cc04e6dc9a8f4fe71fb14a
parentfa48ca4477594053812f8128b24f55604c6bc53a (diff)
downloadchromium_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.grd3
-rw-r--r--chrome/app/generated_resources.grd26
-rw-r--r--chrome/app/google_chrome_strings.grd3
-rw-r--r--chrome/browser/ui/browser_window.h6
-rw-r--r--chrome/browser/ui/cocoa/browser_window_cocoa.h1
-rw-r--r--chrome/browser/ui/cocoa/browser_window_cocoa.mm3
-rw-r--r--chrome/browser/ui/gtk/browser_window_gtk.cc3
-rw-r--r--chrome/browser/ui/gtk/browser_window_gtk.h1
-rw-r--r--chrome/browser/ui/sync/one_click_signin_helper.cc2
-rw-r--r--chrome/browser/ui/views/frame/browser_view.cc4
-rw-r--r--chrome/browser/ui/views/frame/browser_view.h1
-rw-r--r--chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc244
-rw-r--r--chrome/browser/ui/views/sync/one_click_signin_bubble_view.h49
-rw-r--r--chrome/browser/ui/views/sync/one_click_signin_bubble_view_browsertest.cc1
-rw-r--r--chrome/test/base/test_browser_window.h1
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;