Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / sync / one_click_signin_bubble_view_unittest.cc
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.
4
5 #include "chrome/browser/ui/views/sync/one_click_signin_bubble_view.h"
6
7 #include "base/bind.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"
15
16 class OneClickSigninBubbleViewTest : public views::ViewsTestBase {
17  public:
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) {
25   }
26
27   void SetUp() override {
28     views::ViewsTestBase::SetUp();
29
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();
36   }
37
38   void TearDown() override {
39     OneClickSigninBubbleView::Hide();
40     anchor_widget_->Close();
41     anchor_widget_ = NULL;
42     views::ViewsTestBase::TearDown();
43   }
44
45  protected:
46   OneClickSigninBubbleView* ShowOneClickSigninBubble(
47     BrowserWindow::OneClickSigninBubbleType bubble_type) {
48
49     scoped_ptr<OneClickSigninBubbleDelegate> delegate;
50     delegate.reset(new OneClickSigninBubbleTestDelegate(this));
51
52     OneClickSigninBubbleView::ShowBubble(
53         bubble_type,
54         base::string16(),
55         base::string16(),
56         delegate.Pass(),
57         anchor_widget_->GetContentsView(),
58         base::Bind(&OneClickSigninBubbleViewTest::OnStartSync,
59                    base::Unretained(this)));
60
61     OneClickSigninBubbleView* view =
62         OneClickSigninBubbleView::view_for_testing();
63     EXPECT_TRUE(view != NULL);
64     return view;
65   }
66
67   void OnStartSync(OneClickSigninSyncStarter::StartSyncMode mode) {
68     on_start_sync_called_ = true;
69     mode_ = mode;
70   }
71
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_;
77
78  private:
79   friend class OneClickSigninBubbleTestDelegate;
80
81   class OneClickSigninBubbleTestDelegate
82       : public OneClickSigninBubbleDelegate {
83    public:
84     // |test| is not owned by this object.
85     explicit OneClickSigninBubbleTestDelegate(
86         OneClickSigninBubbleViewTest* test) : test_(test) {}
87
88     // OneClickSigninBubbleDelegate:
89     void OnLearnMoreLinkClicked(bool is_dialog) override {
90       if (is_dialog)
91         ++test_->dialog_learn_more_click_count_;
92       else
93         ++test_->bubble_learn_more_click_count_;
94     }
95     void OnAdvancedLinkClicked() override { ++test_->advanced_click_count_; }
96
97    private:
98     OneClickSigninBubbleViewTest* test_;
99
100     DISALLOW_COPY_AND_ASSIGN(OneClickSigninBubbleTestDelegate);
101   };
102
103   // Widget to host the anchor view of the bubble. Destroys itself when closed.
104   views::Widget* anchor_widget_;
105
106   DISALLOW_COPY_AND_ASSIGN(OneClickSigninBubbleViewTest);
107 };
108
109 TEST_F(OneClickSigninBubbleViewTest, ShowBubble) {
110   ShowOneClickSigninBubble(BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
111   content::RunAllPendingInMessageLoop();
112   EXPECT_TRUE(OneClickSigninBubbleView::IsShowing());
113 }
114
115 TEST_F(OneClickSigninBubbleViewTest, ShowDialog) {
116   ShowOneClickSigninBubble(
117     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
118   content::RunAllPendingInMessageLoop();
119   EXPECT_TRUE(OneClickSigninBubbleView::IsShowing());
120 }
121
122 TEST_F(OneClickSigninBubbleViewTest, HideBubble) {
123   ShowOneClickSigninBubble(BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
124
125   OneClickSigninBubbleView::Hide();
126   content::RunAllPendingInMessageLoop();
127   EXPECT_FALSE(OneClickSigninBubbleView::IsShowing());
128 }
129
130 TEST_F(OneClickSigninBubbleViewTest, HideDialog) {
131   ShowOneClickSigninBubble(
132     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
133
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_);
139 }
140
141 TEST_F(OneClickSigninBubbleViewTest, BubbleOkButton) {
142   OneClickSigninBubbleView* view =
143     ShowOneClickSigninBubble(
144       BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
145
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(),
151                              0, 0);
152   listener->ButtonPressed(view->ok_button_, event);
153
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());
158 }
159
160 TEST_F(OneClickSigninBubbleViewTest, DialogOkButton) {
161   OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
162       BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
163
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(),
169                              0, 0);
170   listener->ButtonPressed(view->ok_button_, event);
171
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_);
178 }
179
180 TEST_F(OneClickSigninBubbleViewTest, DialogUndoButton) {
181   OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
182     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
183
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(),
189                              0, 0);
190   listener->ButtonPressed(view->undo_button_, event);
191
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_);
198 }
199
200 TEST_F(OneClickSigninBubbleViewTest, BubbleAdvancedLink) {
201   OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
202     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
203
204   // Simulate pressing a link in the bubble.
205   views::LinkListener* listener = view;
206   listener->LinkClicked(view->advanced_link_, 0);
207
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_);
213 }
214
215 TEST_F(OneClickSigninBubbleViewTest, DialogAdvancedLink) {
216   OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
217     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
218
219   // Simulate pressing a link in the bubble.
220   views::LinkListener* listener = view;
221   listener->LinkClicked(view->advanced_link_, 0);
222
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_);
230 }
231
232 TEST_F(OneClickSigninBubbleViewTest, BubbleLearnMoreLink) {
233   OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
234     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
235
236   views::LinkListener* listener = view;
237   listener->LinkClicked(view->learn_more_link_, 0);
238
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_);
245 }
246
247 TEST_F(OneClickSigninBubbleViewTest, DialogLearnMoreLink) {
248   OneClickSigninBubbleView* view = ShowOneClickSigninBubble(
249       BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
250
251   views::LinkListener* listener = view;
252   listener->LinkClicked(view->learn_more_link_, 0);
253
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_);
260 }
261
262 TEST_F(OneClickSigninBubbleViewTest, BubblePressEnterKey) {
263   OneClickSigninBubbleView* one_click_view = ShowOneClickSigninBubble(
264     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
265
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);
270
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());
275 }
276
277 TEST_F(OneClickSigninBubbleViewTest, DialogPressEnterKey) {
278   OneClickSigninBubbleView* one_click_view = ShowOneClickSigninBubble(
279     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
280
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);
285
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_);
292 }
293
294 TEST_F(OneClickSigninBubbleViewTest, BubblePressEscapeKey) {
295   OneClickSigninBubbleView* one_click_view = ShowOneClickSigninBubble(
296     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE);
297
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);
302
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());
307 }
308
309 TEST_F(OneClickSigninBubbleViewTest, DialogPressEscapeKey) {
310   OneClickSigninBubbleView* one_click_view = ShowOneClickSigninBubble(
311     BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG);
312
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);
317
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_);
324 }