1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/views/sync/one_click_signin_bubble_view.h"
8 #include "base/bind_helpers.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "chrome/browser/ui/sync/one_click_signin_bubble_delegate.h"
11 #include "content/public/test/test_utils.h"
12 #include "ui/views/controls/button/label_button.h"
13 #include "ui/views/test/views_test_base.h"
14 #include "ui/views/widget/widget.h"
16 class OneClickSigninBubbleViewTest : public views::ViewsTestBase {
18 OneClickSigninBubbleViewTest()
19 : on_start_sync_called_(false),
20 mode_(OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST),
21 bubble_learn_more_click_count_(0),
22 dialog_learn_more_click_count_(0),
23 advanced_click_count_(0),
24 anchor_widget_(NULL) {
27 void SetUp() override {
28 views::ViewsTestBase::SetUp();
30 // Create a widget to host the anchor view.
31 anchor_widget_ = new views::Widget;
32 views::Widget::InitParams widget_params = CreateParams(
33 views::Widget::InitParams::TYPE_WINDOW);
34 anchor_widget_->Init(widget_params);
35 anchor_widget_->Show();
38 void TearDown() override {
39 OneClickSigninBubbleView::Hide();
40 anchor_widget_->Close();
41 anchor_widget_ = NULL;
42 views::ViewsTestBase::TearDown();
46 OneClickSigninBubbleView* ShowOneClickSigninBubble(
47 BrowserWindow::OneClickSigninBubbleType bubble_type) {
49 scoped_ptr<OneClickSigninBubbleDelegate> delegate;
50 delegate.reset(new OneClickSigninBubbleTestDelegate(this));
52 OneClickSigninBubbleView::ShowBubble(
57 anchor_widget_->GetContentsView(),
58 base::Bind(&OneClickSigninBubbleViewTest::OnStartSync,
59 base::Unretained(this)));
61 OneClickSigninBubbleView* view =
62 OneClickSigninBubbleView::view_for_testing();
63 EXPECT_TRUE(view != NULL);
67 void OnStartSync(OneClickSigninSyncStarter::StartSyncMode mode) {
68 on_start_sync_called_ = true;
72 bool on_start_sync_called_;
73 OneClickSigninSyncStarter::StartSyncMode mode_;
74 int bubble_learn_more_click_count_;
75 int dialog_learn_more_click_count_;
76 int advanced_click_count_;
79 friend class OneClickSigninBubbleTestDelegate;
81 class OneClickSigninBubbleTestDelegate
82 : public OneClickSigninBubbleDelegate {
84 // |test| is not owned by this object.
85 explicit OneClickSigninBubbleTestDelegate(
86 OneClickSigninBubbleViewTest* test) : test_(test) {}
88 // OneClickSigninBubbleDelegate:
89 void OnLearnMoreLinkClicked(bool is_dialog) override {
91 ++test_->dialog_learn_more_click_count_;
93 ++test_->bubble_learn_more_click_count_;
95 void OnAdvancedLinkClicked() override { ++test_->advanced_click_count_; }
98 OneClickSigninBubbleViewTest* test_;
100 DISALLOW_COPY_AND_ASSIGN(OneClickSigninBubbleTestDelegate);
103 // Widget to host the anchor view of the bubble. Destroys itself when closed.
104 views::Widget* anchor_widget_;
106 DISALLOW_COPY_AND_ASSIGN(OneClickSigninBubbleViewTest);
109 TEST_F(OneClickSigninBubbleViewTest, ShowBubble) {
110 ShowOneClickSigninBubble(BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
111 content::RunAllPendingInMessageLoop();
112 EXPECT_TRUE(OneClickSigninBubbleView::IsShowing());
115 TEST_F(OneClickSigninBubbleViewTest, ShowDialog) {
116 ShowOneClickSigninBubble(
117 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
118 content::RunAllPendingInMessageLoop();
119 EXPECT_TRUE(OneClickSigninBubbleView::IsShowing());
122 TEST_F(OneClickSigninBubbleViewTest, HideBubble) {
123 ShowOneClickSigninBubble(BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
125 OneClickSigninBubbleView::Hide();
126 content::RunAllPendingInMessageLoop();
127 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
130 TEST_F(OneClickSigninBubbleViewTest, HideDialog) {
131 ShowOneClickSigninBubble(
132 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
134 OneClickSigninBubbleView::Hide();
135 content::RunAllPendingInMessageLoop();
136 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
137 EXPECT_TRUE(on_start_sync_called_);
138 EXPECT_EQ(OneClickSigninSyncStarter::UNDO_SYNC, mode_);
141 TEST_F(OneClickSigninBubbleViewTest, BubbleOkButton) {
142 OneClickSigninBubbleView* view =
143 ShowOneClickSigninBubble(
144 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
146 // Simulate pressing the OK button. Set the message loop in the bubble
147 // view so that it can be quit once the bubble is hidden.
148 views::ButtonListener* listener = view;
149 const ui::MouseEvent event(ui::ET_MOUSE_PRESSED,
150 gfx::Point(), gfx::Point(),
152 listener->ButtonPressed(view->ok_button_, event);
154 // View should no longer be showing. The message loop will exit once the
155 // fade animation of the bubble is done.
156 content::RunAllPendingInMessageLoop();
157 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
160 TEST_F(OneClickSigninBubbleViewTest, DialogOkButton) {
161 OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
162 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
164 // Simulate pressing the OK button. Set the message loop in the bubble
165 // view so that it can be quit once the bubble is hidden.
166 views::ButtonListener* listener = view;
167 const ui::MouseEvent event(ui::ET_MOUSE_PRESSED,
168 gfx::Point(), gfx::Point(),
170 listener->ButtonPressed(view->ok_button_, event);
172 // View should no longer be showing and sync should start
173 // The message loop will exit once the fade animation of the dialog is done.
174 content::RunAllPendingInMessageLoop();
175 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
176 EXPECT_TRUE(on_start_sync_called_);
177 EXPECT_EQ(OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS, mode_);
180 TEST_F(OneClickSigninBubbleViewTest, DialogUndoButton) {
181 OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
182 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
184 // Simulate pressing the undo button. Set the message loop in the bubble
185 // view so that it can be quit once the bubble is hidden.
186 views::ButtonListener* listener = view;
187 const ui::MouseEvent event(ui::ET_MOUSE_PRESSED,
188 gfx::Point(), gfx::Point(),
190 listener->ButtonPressed(view->undo_button_, event);
192 // View should no longer be showing. The message loop will exit once the
193 // fade animation of the bubble is done.
194 content::RunAllPendingInMessageLoop();
195 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
196 EXPECT_TRUE(on_start_sync_called_);
197 EXPECT_EQ(OneClickSigninSyncStarter::UNDO_SYNC, mode_);
200 TEST_F(OneClickSigninBubbleViewTest, BubbleAdvancedLink) {
201 OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
202 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
204 // Simulate pressing a link in the bubble.
205 views::LinkListener* listener = view;
206 listener->LinkClicked(view->advanced_link_, 0);
208 // View should no longer be showing and the OnAdvancedLinkClicked method
209 // of the delegate should have been called.
210 content::RunAllPendingInMessageLoop();
211 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
212 EXPECT_EQ(1, advanced_click_count_);
215 TEST_F(OneClickSigninBubbleViewTest, DialogAdvancedLink) {
216 OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
217 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
219 // Simulate pressing a link in the bubble.
220 views::LinkListener* listener = view;
221 listener->LinkClicked(view->advanced_link_, 0);
223 // View should no longer be showing. No delegate method should have been
224 // called: the callback is responsible to open the settings page.
225 content::RunAllPendingInMessageLoop();
226 EXPECT_TRUE(on_start_sync_called_);
227 EXPECT_EQ(OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST, mode_);
228 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
229 EXPECT_EQ(0, advanced_click_count_);
232 TEST_F(OneClickSigninBubbleViewTest, BubbleLearnMoreLink) {
233 OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
234 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
236 views::LinkListener* listener = view;
237 listener->LinkClicked(view->learn_more_link_, 0);
239 // View should no longer be showing and the OnLearnMoreLinkClicked method
240 // of the delegate should have been called with |is_dialog| == false.
241 content::RunAllPendingInMessageLoop();
242 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
243 EXPECT_EQ(1, bubble_learn_more_click_count_);
244 EXPECT_EQ(0, dialog_learn_more_click_count_);
247 TEST_F(OneClickSigninBubbleViewTest, DialogLearnMoreLink) {
248 OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
249 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
251 views::LinkListener* listener = view;
252 listener->LinkClicked(view->learn_more_link_, 0);
254 // View should still be showing and the OnLearnMoreLinkClicked method
255 // of the delegate should have been called with |is_dialog| == true.
256 content::RunAllPendingInMessageLoop();
257 EXPECT_TRUE(OneClickSigninBubbleView::IsShowing());
258 EXPECT_EQ(0, bubble_learn_more_click_count_);
259 EXPECT_EQ(1, dialog_learn_more_click_count_);
262 TEST_F(OneClickSigninBubbleViewTest, BubblePressEnterKey) {
263 OneClickSigninBubbleView* one_click_view = ShowOneClickSigninBubble(
264 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
266 // Simulate pressing the Enter key.
267 views::View* view = one_click_view;
268 const ui::Accelerator accelerator(ui::VKEY_RETURN, 0);
269 view->AcceleratorPressed(accelerator);
271 // View should no longer be showing. The message loop will exit once the
272 // fade animation of the bubble is done.
273 content::RunAllPendingInMessageLoop();
274 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
277 TEST_F(OneClickSigninBubbleViewTest, DialogPressEnterKey) {
278 OneClickSigninBubbleView* one_click_view = ShowOneClickSigninBubble(
279 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
281 // Simulate pressing the Enter key.
282 views::View* view = one_click_view;
283 const ui::Accelerator accelerator(ui::VKEY_RETURN, 0);
284 view->AcceleratorPressed(accelerator);
286 // View should no longer be showing. The message loop will exit once the
287 // fade animation of the bubble is done.
288 content::RunAllPendingInMessageLoop();
289 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
290 EXPECT_TRUE(on_start_sync_called_);
291 EXPECT_EQ(OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS, mode_);
294 TEST_F(OneClickSigninBubbleViewTest, BubblePressEscapeKey) {
295 OneClickSigninBubbleView* one_click_view = ShowOneClickSigninBubble(
296 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
298 // Simulate pressing the Escape key.
299 views::View* view = one_click_view;
300 const ui::Accelerator accelerator(ui::VKEY_ESCAPE, 0);
301 view->AcceleratorPressed(accelerator);
303 // View should no longer be showing. The message loop will exit once the
304 // fade animation of the bubble is done.
305 content::RunAllPendingInMessageLoop();
306 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
309 TEST_F(OneClickSigninBubbleViewTest, DialogPressEscapeKey) {
310 OneClickSigninBubbleView* one_click_view = ShowOneClickSigninBubble(
311 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
313 // Simulate pressing the Escape key.
314 views::View* view = one_click_view;
315 const ui::Accelerator accelerator(ui::VKEY_ESCAPE, 0);
316 view->AcceleratorPressed(accelerator);
318 // View should no longer be showing. The message loop will exit once the
319 // fade animation of the bubble is done.
320 content::RunAllPendingInMessageLoop();
321 EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
322 EXPECT_TRUE(on_start_sync_called_);
323 EXPECT_EQ(OneClickSigninSyncStarter::UNDO_SYNC, mode_);