Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc

Issue 13979003: Win: Display a native bubble (instead of the JS one) after the web signin flow. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove unused imports. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/sync/one_click_signin_bubble_view.h" 5 #include "chrome/browser/ui/views/sync/one_click_signin_bubble_view.h"
6 6
7 #include "base/callback_helpers.h" 7 #include "base/callback_helpers.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/google/google_util.h" 10 #include "chrome/browser/google/google_util.h"
12 #include "chrome/browser/ui/browser.h" 11 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/sync/one_click_signin_helper.h" 12 #include "chrome/browser/ui/sync/one_click_signin_helper.h"
14 #include "chrome/browser/ui/sync/one_click_signin_histogram.h" 13 #include "chrome/browser/ui/sync/one_click_signin_histogram.h"
15 #include "chrome/common/url_constants.h" 14 #include "chrome/common/url_constants.h"
16 #include "content/public/browser/web_contents.h" 15 #include "content/public/browser/web_contents.h"
17 #include "grit/chromium_strings.h" 16 #include "grit/chromium_strings.h"
18 #include "grit/generated_resources.h" 17 #include "grit/generated_resources.h"
19 #include "grit/theme_resources.h" 18 #include "grit/theme_resources.h"
20 #include "grit/ui_resources.h" 19 #include "grit/ui_resources.h"
21 #include "ui/base/keycodes/keyboard_codes.h" 20 #include "ui/base/keycodes/keyboard_codes.h"
22 #include "ui/base/l10n/l10n_util.h" 21 #include "ui/base/l10n/l10n_util.h"
23 #include "ui/base/resource/resource_bundle.h" 22 #include "ui/base/resource/resource_bundle.h"
24 #include "ui/views/controls/button/image_button.h" 23 #include "ui/views/controls/button/image_button.h"
25 #include "ui/views/controls/button/label_button.h" 24 #include "ui/views/controls/button/label_button.h"
26 #include "ui/views/controls/image_view.h" 25 #include "ui/views/controls/image_view.h"
27 #include "ui/views/controls/label.h" 26 #include "ui/views/controls/label.h"
28 #include "ui/views/controls/link.h" 27 #include "ui/views/controls/link.h"
29 #include "ui/views/layout/grid_layout.h" 28 #include "ui/views/layout/grid_layout.h"
30 #include "ui/views/layout/layout_constants.h" 29 #include "ui/views/layout/layout_constants.h"
31 #include "ui/views/widget/widget.h" 30 #include "ui/views/widget/widget.h"
32 31
33 // Minimum width for the mutli-line label. 32 // Minimum width for the multi-line label.
34 const int kMinimumDialogLabelWidth = 400; 33 const int kMinimumDialogLabelWidth = 400;
35 const int kMinimumLabelWidth = 240; 34 const int kMinimumLabelWidth = 240;
36 const int kDialogMargin = 16; 35 const int kDialogMargin = 16;
37 36
38 namespace { 37 namespace {
39 38
40 // The column set constants that can be used in the InitContent() function 39 // The column set constants that can be used in the InitContent() function
41 // to layout views. 40 // to layout views.
42 enum OneClickSigninBubbleColumnTypes { 41 enum OneClickSigninBubbleColumnTypes {
43 COLUMN_SET_FILL_ALIGN, 42 COLUMN_SET_FILL_ALIGN,
44 COLUMN_SET_CONTROLS, 43 COLUMN_SET_CONTROLS,
45 COLUMN_SET_TITLE_BAR 44 COLUMN_SET_TITLE_BAR
46 }; 45 };
47
48 class OneClickSigninDialogView : public OneClickSigninBubbleView {
49 public:
50 OneClickSigninDialogView(
51 content::WebContents* web_content,
52 views::View* anchor_view,
53 const string16& email,
54 const BrowserWindow::StartSyncCallback& start_sync_callback);
55
56 private:
57 // Overridden from views::WidgetDelegate:
58 virtual ui::ModalType GetModalType() const OVERRIDE;
59
60 // Overridden from OneClickSigninBubbleView:
61 virtual void InitContent(views::GridLayout* layout) OVERRIDE;
62 virtual void GetButtons(views::LabelButton** ok_button,
63 views::LabelButton** undo_button) OVERRIDE;
64 virtual views::Link* CreateAdvancedLink() OVERRIDE;
65
66 // Overridden from views::LinkListener:
67 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
68
69 // Overridden from views::ButtonListener:
70 virtual void ButtonPressed(views::Button* sender,
71 const ui::Event& event) OVERRIDE;
72
73 // views::View method:
74 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
75
76 const string16 email_;
77 content::WebContents* web_content_;
78 views::Link* learn_more_link_;
79 views::ImageButton* close_button_;
80
81 bool clicked_learn_more_;
82
83 DISALLOW_COPY_AND_ASSIGN(OneClickSigninDialogView);
84 };
85
86 OneClickSigninDialogView::OneClickSigninDialogView(
87 content::WebContents* web_content,
88 views::View* anchor_view,
89 const string16& email,
90 const BrowserWindow::StartSyncCallback& start_sync_callback)
91 : OneClickSigninBubbleView(anchor_view, start_sync_callback),
92 email_(email),
93 web_content_(web_content),
94 learn_more_link_(NULL),
95 close_button_(NULL),
96 clicked_learn_more_(false) {
97 set_arrow(views::BubbleBorder::NONE);
98 set_anchor_view_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0));
99 set_close_on_deactivate(false);
100 set_margins(gfx::Insets(kDialogMargin, kDialogMargin, kDialogMargin,
101 kDialogMargin));
102 }
103
104 ui::ModalType OneClickSigninDialogView::GetModalType() const {
105 return ui::MODAL_TYPE_CHILD;
106 }
107
108 void OneClickSigninDialogView::InitContent(views::GridLayout* layout) {
109 OneClickSigninHelper::LogConfirmHistogramValue(
110 one_click_signin::HISTOGRAM_CONFIRM_SHOWN);
111
112 // Column set for title bar.
113 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_TITLE_BAR);
114 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0,
115 views::GridLayout::USE_PREF, 0, 0);
116 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
117 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0,
118 views::GridLayout::USE_PREF, 0, 0);
119
120 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
121
122 {
123 layout->StartRow(0, COLUMN_SET_TITLE_BAR);
124
125 views::Label* label = new views::Label(email_.empty() ?
126 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE) :
127 l10n_util::GetStringFUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE_NEW,
128 email_));
129 label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
130 label->SetFont(label->font().DeriveFont(3, gfx::Font::BOLD));
131 layout->AddView(label);
132
133 close_button_ = new views::ImageButton(this);
134 close_button_->SetImage(views::ImageButton::STATE_NORMAL,
135 rb.GetImageNamed(IDR_CLOSE_2).ToImageSkia());
136 close_button_->SetImage(views::ImageButton::STATE_HOVERED,
137 rb.GetImageNamed(IDR_CLOSE_2_H).ToImageSkia());
138 close_button_->SetImage(views::ImageButton::STATE_PRESSED,
139 rb.GetImageNamed(IDR_CLOSE_2_P).ToImageSkia());
140 layout->AddView(close_button_);
141 }
142
143 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
144
145 {
146 layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
147
148 views::Label* label = new views::Label(email_.empty() ?
149 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE) :
150 l10n_util::GetStringFUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE_NEW,
151 email_));
152 label->SetMultiLine(true);
153 label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
154 label->SizeToFit(kMinimumDialogLabelWidth);
155 layout->AddView(label);
156
157 layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
158
159 learn_more_link_ = new views::Link(
160 l10n_util::GetStringUTF16(IDS_LEARN_MORE));
161 learn_more_link_->set_listener(this);
162 learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
163 layout->AddView(learn_more_link_, 1, 1, views::GridLayout::TRAILING,
164 views::GridLayout::CENTER);
165 }
166
167 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
168 }
169
170 void OneClickSigninDialogView::GetButtons(views::LabelButton** ok_button,
171 views::LabelButton** undo_button) {
172 *ok_button = new views::LabelButton(this, string16());
173 (*ok_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
174
175 *undo_button = new views::LabelButton(this, string16());
176 (*undo_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
177
178 // The default size of the buttons is too large. To allow them to be smaller
179 // ignore the minimum default size. Furthermore, to make sure they are the
180 // same size, SetText() is called with both strings on both buttons.
181 (*ok_button)->set_min_size(gfx::Size());
182 (*undo_button)->set_min_size(gfx::Size());
183 string16 ok_label =
184 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON);
185 string16 undo_label =
186 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON);
187 (*ok_button)->SetText(undo_label);
188 (*ok_button)->SetText(ok_label);
189 (*undo_button)->SetText(ok_label);
190 (*undo_button)->SetText(undo_label);
191 }
192
193 views::Link* OneClickSigninDialogView::CreateAdvancedLink() {
194 views::Link* advanced_link= new views::Link(
195 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED));
196 advanced_link->set_listener(this);
197 advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
198 return advanced_link;
199 }
200
201 void OneClickSigninDialogView::LinkClicked(views::Link* source,
202 int event_flags) {
203 if (source == learn_more_link_) {
204 if (!clicked_learn_more_) {
205 OneClickSigninHelper::LogConfirmHistogramValue(
206 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE);
207 clicked_learn_more_ = true;
208 }
209 content::OpenURLParams params(
210 GURL(chrome::kChromeSyncLearnMoreURL), content::Referrer(),
211 NEW_WINDOW, content::PAGE_TRANSITION_LINK, false);
212 web_content_->OpenURL(params);
213 return;
214 }
215
216 if (source == GetAdvancedLink())
217 OneClickSigninHelper::LogConfirmHistogramValue(
218 clicked_learn_more_ ?
219 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_ADVANCED :
220 one_click_signin::HISTOGRAM_CONFIRM_ADVANCED);
221
222 OneClickSigninBubbleView::LinkClicked(source, event_flags);
223 }
224
225 void OneClickSigninDialogView::ButtonPressed(views::Button* sender,
226 const ui::Event& event) {
227 if (sender == GetOkButton())
228 OneClickSigninHelper::LogConfirmHistogramValue(
229 clicked_learn_more_ ?
230 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_OK :
231 one_click_signin::HISTOGRAM_CONFIRM_OK);
232
233 if (sender == GetUndoButton())
234 OneClickSigninHelper::LogConfirmHistogramValue(
235 clicked_learn_more_ ?
236 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_UNDO :
237 one_click_signin::HISTOGRAM_CONFIRM_UNDO);
238
239 if (sender == close_button_)
240 OneClickSigninHelper::LogConfirmHistogramValue(
241 clicked_learn_more_ ?
242 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_CLOSE :
243 one_click_signin::HISTOGRAM_CONFIRM_CLOSE);
244
245
246 OneClickSigninBubbleView::ButtonPressed(sender, event);
247 }
248
249 bool OneClickSigninDialogView::AcceleratorPressed(
250 const ui::Accelerator& accelerator) {
251 if (accelerator.key_code() == ui::VKEY_RETURN)
252 OneClickSigninHelper::LogConfirmHistogramValue(
253 clicked_learn_more_ ?
254 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_RETURN :
255 one_click_signin::HISTOGRAM_CONFIRM_RETURN);
256 if (accelerator.key_code() == ui::VKEY_ESCAPE)
257 OneClickSigninHelper::LogConfirmHistogramValue(
258 clicked_learn_more_ ?
259 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_ESCAPE :
260 one_click_signin::HISTOGRAM_CONFIRM_ESCAPE);
261 return OneClickSigninBubbleView::AcceleratorPressed(accelerator);
262 }
263
264 } // namespace 46 } // namespace
265 47
266 // OneClickSigninBubbleView ----------------------------------------------------
267
268 // static 48 // static
269 OneClickSigninBubbleView* OneClickSigninBubbleView::bubble_view_ = NULL; 49 OneClickSigninBubbleView* OneClickSigninBubbleView::bubble_view_ = NULL;
270 50
271 // static 51 // static
272 void OneClickSigninBubbleView::ShowBubble( 52 void OneClickSigninBubbleView::ShowBubble(
273 BrowserWindow::OneClickSigninBubbleType type, 53 BrowserWindow::OneClickSigninBubbleType type,
274 const string16& email, 54 const string16& email,
55 const string16& error_message,
275 ToolbarView* toolbar_view, 56 ToolbarView* toolbar_view,
276 const BrowserWindow::StartSyncCallback& start_sync) { 57 const BrowserWindow::StartSyncCallback& start_sync) {
277 if (IsShowing()) 58 if (IsShowing())
278 return; 59 return;
279 60
280 switch (type) { 61 switch (type) {
281 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE: 62 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE:
282 bubble_view_ = new OneClickSigninBubbleView(toolbar_view->app_menu(), 63 bubble_view_ = new OneClickSigninBubbleView(
283 start_sync); 64 toolbar_view->GetWebContents(), toolbar_view->app_menu(),
65 error_message, string16(), start_sync, false);
284 break; 66 break;
285 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG: 67 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG:
286 bubble_view_ = new OneClickSigninDialogView( 68 bubble_view_ = new OneClickSigninBubbleView(
287 toolbar_view->GetWebContents(), toolbar_view->location_bar(), 69 toolbar_view->GetWebContents(), toolbar_view->location_bar(),
288 string16(), start_sync); 70 string16(), string16(), start_sync, true);
289 break; 71 break;
290 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_SAML_MODAL_DIALOG: 72 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_SAML_MODAL_DIALOG:
291 bubble_view_ = new OneClickSigninDialogView( 73 bubble_view_ = new OneClickSigninBubbleView(
292 toolbar_view->GetWebContents(), toolbar_view->location_bar(), 74 toolbar_view->GetWebContents(), toolbar_view->location_bar(),
293 email, start_sync); 75 string16(), email, start_sync, true);
294 break; 76 break;
295 } 77 }
296 78
297 views::BubbleDelegateView::CreateBubble(bubble_view_)->Show(); 79 views::BubbleDelegateView::CreateBubble(bubble_view_)->Show();
298 } 80 }
299 81
300 // static 82 // static
301 bool OneClickSigninBubbleView::IsShowing() { 83 bool OneClickSigninBubbleView::IsShowing() {
302 return bubble_view_ != NULL; 84 return bubble_view_ != NULL;
303 } 85 }
304 86
305 // static 87 // static
306 void OneClickSigninBubbleView::Hide() { 88 void OneClickSigninBubbleView::Hide() {
307 if (IsShowing()) 89 if (IsShowing())
308 bubble_view_->GetWidget()->Close(); 90 bubble_view_->GetWidget()->Close();
309 } 91 }
310 92
311 OneClickSigninBubbleView::OneClickSigninBubbleView( 93 OneClickSigninBubbleView::OneClickSigninBubbleView(
94 content::WebContents* web_contents,
312 views::View* anchor_view, 95 views::View* anchor_view,
313 const BrowserWindow::StartSyncCallback& start_sync_callback) 96 const string16& error_message,
97 const string16& email,
98 const BrowserWindow::StartSyncCallback& start_sync_callback,
99 bool is_sync_dialog)
314 : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), 100 : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
101 web_contents_(web_contents),
102 error_message_(error_message),
103 email_(email),
104 start_sync_callback_(start_sync_callback),
105 is_sync_dialog_(is_sync_dialog),
315 advanced_link_(NULL), 106 advanced_link_(NULL),
107 learn_more_link_(NULL),
316 ok_button_(NULL), 108 ok_button_(NULL),
317 undo_button_(NULL), 109 undo_button_(NULL),
318 start_sync_callback_(start_sync_callback), 110 close_button_(NULL),
111 clicked_learn_more_(false),
319 message_loop_for_testing_(NULL) { 112 message_loop_for_testing_(NULL) {
320 DCHECK(!start_sync_callback_.is_null()); 113 if (is_sync_dialog_) {
114 DCHECK(!start_sync_callback_.is_null());
115 set_arrow(views::BubbleBorder::NONE);
116 set_anchor_view_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0));
117 set_close_on_deactivate(false);
118 set_margins(gfx::Insets(kDialogMargin, kDialogMargin, kDialogMargin,
119 kDialogMargin));
120 }
321 } 121 }
322 122
323 OneClickSigninBubbleView::~OneClickSigninBubbleView() { 123 OneClickSigninBubbleView::~OneClickSigninBubbleView() {
324 } 124 }
325 125
126 ui::ModalType OneClickSigninBubbleView::GetModalType() const {
127 return is_sync_dialog_? ui::MODAL_TYPE_CHILD : ui::MODAL_TYPE_NONE;
128 }
129
326 void OneClickSigninBubbleView::AnimationEnded(const ui::Animation* animation) { 130 void OneClickSigninBubbleView::AnimationEnded(const ui::Animation* animation) {
327 views::BubbleDelegateView::AnimationEnded(animation); 131 views::BubbleDelegateView::AnimationEnded(animation);
328 if (message_loop_for_testing_) 132 if (message_loop_for_testing_)
329 message_loop_for_testing_->Quit(); 133 message_loop_for_testing_->Quit();
330 } 134 }
331 135
332 void OneClickSigninBubbleView::Init() { 136 void OneClickSigninBubbleView::Init() {
333 views::GridLayout* layout = new views::GridLayout(this); 137 views::GridLayout* layout = new views::GridLayout(this);
334 SetLayoutManager(layout); 138 SetLayoutManager(layout);
335 set_border(views::Border::CreateEmptyBorder(8, 8, 8, 8)); 139 set_border(views::Border::CreateEmptyBorder(8, 8, 8, 8));
336 140
337 // Column set for descriptive text and link. 141 // Column set for descriptive text and link.
338 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_FILL_ALIGN); 142 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_FILL_ALIGN);
339 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1, 143 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1,
340 views::GridLayout::USE_PREF, 0, 0); 144 views::GridLayout::USE_PREF, 0, 0);
341 145
342 // Column set for buttons at bottom of bubble. 146 // Column set for buttons at bottom of bubble.
343 cs = layout->AddColumnSet(COLUMN_SET_CONTROLS); 147 cs = layout->AddColumnSet(COLUMN_SET_CONTROLS);
344 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, 148 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0,
345 views::GridLayout::USE_PREF, 0, 0); 149 views::GridLayout::USE_PREF, 0, 0);
346 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); 150 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
347 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, 151 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0,
348 views::GridLayout::USE_PREF, 0, 0); 152 views::GridLayout::USE_PREF, 0, 0);
349 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 153 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
350 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, 154 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0,
351 views::GridLayout::USE_PREF, 0, 0); 155 views::GridLayout::USE_PREF, 0, 0);
352 156
353 InitContent(layout); 157 is_sync_dialog_ ? InitDialogContent(layout) : InitBubbleContent(layout);
354 158
355 // Add controls at the bottom. 159 // Add controls at the bottom.
356 advanced_link_= CreateAdvancedLink(); 160 InitAdvancedLink();
357 GetButtons(&ok_button_, &undo_button_);
358 ok_button_->SetIsDefault(true);
359 161
360 layout->StartRow(0, COLUMN_SET_CONTROLS); 162 layout->StartRow(0, COLUMN_SET_CONTROLS);
361 layout->AddView(advanced_link_); 163 layout->AddView(advanced_link_);
362 layout->AddView(ok_button_); 164
363 layout->AddView(undo_button_); 165 InitButtons(layout);
166 ok_button_->SetIsDefault(true);
364 167
365 AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0)); 168 AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0));
366 } 169 }
367 170
368 void OneClickSigninBubbleView::InitContent(views::GridLayout* layout) { 171 void OneClickSigninBubbleView::InitBubbleContent(views::GridLayout* layout) {
369 // Add main text description. 172 // Add main text description.
370 views::Label* label = new views::Label( 173 layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
371 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE)); 174
175 views::Label* label = !error_message_.empty() ?
176 new views::Label(error_message_) :
177 new views::Label(
178 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE));
179
372 label->SetMultiLine(true); 180 label->SetMultiLine(true);
373 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 181 label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
374 label->SizeToFit(kMinimumLabelWidth); 182 label->SizeToFit(kMinimumLabelWidth);
375
376 layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
377 layout->AddView(label); 183 layout->AddView(label);
378 184
379 layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 185 layout->StartRow(0, COLUMN_SET_CONTROLS);
186
187 InitLearnMoreLink();
188 layout->AddView(learn_more_link_);
189 }
190
191 void OneClickSigninBubbleView::InitDialogContent(views::GridLayout* layout) {
192 OneClickSigninHelper::LogConfirmHistogramValue(
193 one_click_signin::HISTOGRAM_CONFIRM_SHOWN);
194
195 // Column set for title bar.
196 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_TITLE_BAR);
197 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0,
198 views::GridLayout::USE_PREF, 0, 0);
199 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
200 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0,
201 views::GridLayout::USE_PREF, 0, 0);
202
203 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
204
205 {
206 layout->StartRow(0, COLUMN_SET_TITLE_BAR);
207
208 views::Label* label = new views::Label(email_.empty() ?
209 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE) :
210 l10n_util::GetStringFUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE_NEW,
211 email_));
212 label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
213 label->SetFont(label->font().DeriveFont(3, gfx::Font::BOLD));
214 layout->AddView(label);
215
216 close_button_ = new views::ImageButton(this);
217 close_button_->SetImage(views::ImageButton::STATE_NORMAL,
218 rb.GetImageNamed(IDR_CLOSE_2).ToImageSkia());
219 close_button_->SetImage(views::ImageButton::STATE_HOVERED,
220 rb.GetImageNamed(IDR_CLOSE_2_H).ToImageSkia());
221 close_button_->SetImage(views::ImageButton::STATE_PRESSED,
222 rb.GetImageNamed(IDR_CLOSE_2_P).ToImageSkia());
223
224 layout->AddView(close_button_);
225 }
226
227 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
228
229 {
230 layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
231
232 views::Label* label = new views::Label(email_.empty() ?
233 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE) :
234 l10n_util::GetStringFUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE_NEW,
235 email_));
236 label->SetMultiLine(true);
237 label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
238 label->SizeToFit(kMinimumDialogLabelWidth);
239 layout->AddView(label);
240
241 layout->StartRow(0, COLUMN_SET_FILL_ALIGN);
242
243 InitLearnMoreLink();
244 layout->AddView(learn_more_link_, 1, 1, views::GridLayout::TRAILING,
245 views::GridLayout::CENTER);
246 }
247
248 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
249 }
250
251 void OneClickSigninBubbleView::InitButtons(views::GridLayout* layout) {
252 GetButtons(&ok_button_, &undo_button_);
253 layout->AddView(ok_button_);
254
255 if (is_sync_dialog_)
256 layout->AddView(undo_button_);
380 } 257 }
381 258
382 void OneClickSigninBubbleView::GetButtons(views::LabelButton** ok_button, 259 void OneClickSigninBubbleView::GetButtons(views::LabelButton** ok_button,
383 views::LabelButton** undo_button) { 260 views::LabelButton** undo_button) {
384 *ok_button = new views::LabelButton(this, string16()); 261 *ok_button = new views::LabelButton(this, string16());
385 (*ok_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); 262 (*ok_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
386 263
387 *undo_button = new views::LabelButton(this, string16()); 264 // The default size of the buttons is too large. To allow them to be smaller
388 (*undo_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); 265 // ignore the minimum default size.,
266 (*ok_button)->set_min_size(gfx::Size());
389 267
390 // The default size of the buttons is too large. To allow them to be smaller 268 string16 ok_label;
391 // ignore the minimum default size. Furthermore, to make sure they are the
392 // same size, SetText() is called with both strings on both buttons.
393 (*ok_button)->set_min_size(gfx::Size());
394 (*undo_button)->set_min_size(gfx::Size());
395 string16 ok_label = l10n_util::GetStringUTF16(IDS_OK);
396 string16 undo_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_BUBBLE_UNDO);
397 (*ok_button)->SetText(undo_label);
398 (*ok_button)->SetText(ok_label);
399 (*undo_button)->SetText(ok_label);
400 (*undo_button)->SetText(undo_label);
401 }
402 269
403 views::Link* OneClickSigninBubbleView::CreateAdvancedLink() { 270 if (is_sync_dialog_) {
404 views::Link* advanced_link= new views::Link( 271 *undo_button = new views::LabelButton(this, string16());
405 l10n_util::GetStringUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED)); 272 (*undo_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
406 advanced_link->set_listener(this); 273 (*undo_button)->set_min_size(gfx::Size());
407 advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
408 return advanced_link;
409 }
410 274
411 void OneClickSigninBubbleView::WindowClosing() { 275 ok_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON);
412 // We have to reset |bubble_view_| here, not in our destructor, because 276 string16 undo_label =
413 // we'll be destroyed asynchronously and the shown state will be checked 277 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON);
414 // before then.
415 DCHECK_EQ(bubble_view_, this);
416 bubble_view_ = NULL;
417 278
418 if (!start_sync_callback_.is_null()) { 279 // To make sure they are the same size, SetText() is called
419 base::ResetAndReturn(&start_sync_callback_).Run( 280 // with both strings on both buttons.
420 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); 281 (*ok_button)->SetText(undo_label);
282 (*ok_button)->SetText(ok_label);
283 (*undo_button)->SetText(ok_label);
284 (*undo_button)->SetText(undo_label);
285 } else {
286 ok_label = l10n_util::GetStringUTF16(IDS_OK);
287 (*ok_button)->SetText(ok_label);
421 } 288 }
422 } 289 }
423 290
291 void OneClickSigninBubbleView::InitAdvancedLink() {
292 advanced_link_ = is_sync_dialog_ ?
293 new views::Link(
294 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED)):
295 new views::Link(
296 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED));
297
298 advanced_link_->set_listener(this);
299 advanced_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
300 }
301
302 void OneClickSigninBubbleView::InitLearnMoreLink() {
303 learn_more_link_ = new views::Link(
304 l10n_util::GetStringUTF16(IDS_LEARN_MORE));
305 learn_more_link_->set_listener(this);
306 learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
307 }
308
424 bool OneClickSigninBubbleView::AcceleratorPressed( 309 bool OneClickSigninBubbleView::AcceleratorPressed(
425 const ui::Accelerator& accelerator) { 310 const ui::Accelerator& accelerator) {
426 if (accelerator.key_code() == ui::VKEY_RETURN || 311 if (accelerator.key_code() == ui::VKEY_RETURN ||
427 accelerator.key_code() == ui::VKEY_ESCAPE) { 312 accelerator.key_code() == ui::VKEY_ESCAPE) {
428 StartFade(false); 313 OneClickSigninBubbleView::Hide();
429 if (accelerator.key_code() == ui::VKEY_RETURN) { 314
430 base::ResetAndReturn(&start_sync_callback_).Run( 315 if (is_sync_dialog_) {
316 if (accelerator.key_code() == ui::VKEY_RETURN) {
317 OneClickSigninHelper::LogConfirmHistogramValue(
318 clicked_learn_more_ ?
319 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_RETURN :
320 one_click_signin::HISTOGRAM_CONFIRM_RETURN);
321
322 base::ResetAndReturn(&start_sync_callback_).Run(
431 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); 323 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
432 } else { 324 } else if (accelerator.key_code() == ui::VKEY_ESCAPE) {
433 start_sync_callback_.Reset(); 325 OneClickSigninHelper::LogConfirmHistogramValue(
326 clicked_learn_more_ ?
327 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_ESCAPE :
328 one_click_signin::HISTOGRAM_CONFIRM_ESCAPE);
329
330 start_sync_callback_.Reset();
331 }
434 } 332 }
435 333
436 return true; 334 return true;
437 } 335 }
438 336
439 return BubbleDelegateView::AcceleratorPressed(accelerator); 337 return BubbleDelegateView::AcceleratorPressed(accelerator);
440 } 338 }
441 339
442 views::Link* OneClickSigninBubbleView::GetAdvancedLink() {
443 return advanced_link_;
444 }
445
446 views::Button* OneClickSigninBubbleView::GetOkButton() {
447 return ok_button_;
448 }
449
450 views::Button* OneClickSigninBubbleView::GetUndoButton() {
451 return undo_button_;
452 }
453
454 void OneClickSigninBubbleView::LinkClicked(views::Link* source, 340 void OneClickSigninBubbleView::LinkClicked(views::Link* source,
455 int event_flags) { 341 int event_flags) {
456 StartFade(false); 342 if (source == learn_more_link_) {
457 base::ResetAndReturn(&start_sync_callback_).Run( 343 if (is_sync_dialog_ && !clicked_learn_more_) {
344 OneClickSigninHelper::LogConfirmHistogramValue(
345 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE);
346 clicked_learn_more_ = true;
347 }
348
349 WindowOpenDisposition location =
350 is_sync_dialog_ ? NEW_WINDOW : NEW_FOREGROUND_TAB;
351
352 content::OpenURLParams params(
353 GURL(chrome::kChromeSyncLearnMoreURL), content::Referrer(),
354 location, content::PAGE_TRANSITION_LINK, false);
355 web_contents_->OpenURL(params);
356
357 // don't hide the modal dialog, as this is an informational link
358 if (is_sync_dialog_)
359 return;
360 } else if (source == advanced_link_) {
361 if (is_sync_dialog_) {
362 OneClickSigninHelper::LogConfirmHistogramValue(
363 clicked_learn_more_ ?
364 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_ADVANCED :
365 one_click_signin::HISTOGRAM_CONFIRM_ADVANCED);
366
367 base::ResetAndReturn(&start_sync_callback_).Run(
458 OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST); 368 OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST);
369 } else {
370 content::OpenURLParams params(
371 GURL(chrome::kChromeUISettingsURL), content::Referrer(),
372 CURRENT_TAB, content::PAGE_TRANSITION_LINK, false);
373 web_contents_->OpenURL(params);
374 }
375 }
376
377 Hide();
459 } 378 }
460 379
461 void OneClickSigninBubbleView::ButtonPressed(views::Button* sender, 380 void OneClickSigninBubbleView::ButtonPressed(views::Button* sender,
462 const ui::Event& event) { 381 const ui::Event& event) {
463 StartFade(false); 382 Hide();
464 base::ResetAndReturn(&start_sync_callback_).Run((sender == ok_button_) ? 383
384 if (is_sync_dialog_) {
385 if (sender == ok_button_)
386 OneClickSigninHelper::LogConfirmHistogramValue(
387 clicked_learn_more_ ?
388 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_OK :
389 one_click_signin::HISTOGRAM_CONFIRM_OK);
390
391 if (sender == undo_button_)
392 OneClickSigninHelper::LogConfirmHistogramValue(
393 clicked_learn_more_ ?
394 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_UNDO :
395 one_click_signin::HISTOGRAM_CONFIRM_UNDO);
396
397 if (sender == close_button_)
398 OneClickSigninHelper::LogConfirmHistogramValue(
399 clicked_learn_more_ ?
400 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_CLOSE :
401 one_click_signin::HISTOGRAM_CONFIRM_CLOSE);
402
403 base::ResetAndReturn(&start_sync_callback_).Run((sender == ok_button_) ?
465 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS : 404 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS :
466 OneClickSigninSyncStarter::UNDO_SYNC); 405 OneClickSigninSyncStarter::UNDO_SYNC);
406 }
467 } 407 }
408
409 void OneClickSigninBubbleView::WindowClosing() {
410 // We have to reset |bubble_view_| here, not in our destructor, because
411 // we'll be destroyed asynchronously and the shown state will be checked
412 // before then.
413 DCHECK_EQ(bubble_view_, this);
414 bubble_view_ = NULL;
415
416 if (is_sync_dialog_ && !start_sync_callback_.is_null()) {
417 base::ResetAndReturn(&start_sync_callback_).Run(
418 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
419 }
420 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698