OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/signin/signin_promo.h" | 5 #include "chrome/browser/signin/signin_promo.h" |
6 #include "chrome/browser/signin/signin_tracker_factory.h" | 6 #include "chrome/browser/signin/signin_tracker_factory.h" |
7 #include "chrome/browser/ui/browser.h" | 7 #include "chrome/browser/ui/browser.h" |
8 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 8 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
9 #include "chrome/browser/ui/webui/signin/inline_login_ui.h" | 9 #include "chrome/browser/ui/webui/signin/inline_login_ui.h" |
10 #include "chrome/test/base/ui_test_utils.h" | 10 #include "chrome/test/base/ui_test_utils.h" |
11 #include "content/public/browser/notification_service.h" | 11 #include "content/public/browser/notification_service.h" |
12 #include "content/public/browser/notification_types.h" | 12 #include "content/public/browser/notification_types.h" |
13 #include "content/public/browser/web_contents.h" | 13 #include "content/public/browser/web_contents.h" |
14 #include "content/public/test/browser_test_utils.h" | 14 #include "content/public/test/browser_test_utils.h" |
15 | 15 |
16 using content::MessageLoopRunner; | 16 using content::MessageLoopRunner; |
17 | 17 |
18 // anonymous namespace for signin with UI helper functions. | 18 // anonymous namespace for signin with UI helper functions. |
19 namespace { | 19 namespace { |
20 | 20 |
21 // The SignInObserver observes the signin manager and blocks until a | 21 // The SignInObserver observes the signin manager and blocks until a |
22 // GoogleSigninSucceeded or a GoogleSigninFailed notification is fired. | 22 // GoogleSigninSucceeded or a GoogleSigninFailed notification is fired. |
23 class SignInObserver : public SigninTracker::Observer { | 23 class SignInObserver : public SigninTracker::Observer { |
24 public: | 24 public: |
25 SignInObserver() | 25 explicit SignInObserver(bool wait_for_account_cookies) |
26 : seen_(false), | 26 : seen_(false), |
27 running_(false), | 27 running_(false), |
28 signed_in_(false) {} | 28 signed_in_(false), |
29 wait_for_account_cookies_(wait_for_account_cookies) {} | |
29 | 30 |
30 virtual ~SignInObserver() {} | 31 virtual ~SignInObserver() {} |
31 | 32 |
32 // Returns whether a GoogleSigninSucceeded event has happened. | 33 // Returns whether a GoogleSigninSucceeded event has happened. |
33 bool DidSignIn() { | 34 bool DidSignIn() { |
34 return signed_in_; | 35 return signed_in_; |
35 } | 36 } |
36 | 37 |
37 // Blocks and waits until the user signs in. Wait() does not block if a | 38 // Blocks and waits until the user signs in. Wait() does not block if a |
38 // GoogleSigninSucceeded or a GoogleSigninFailed has already occurred. | 39 // GoogleSigninSucceeded or a GoogleSigninFailed has already occurred. |
39 void Wait() { | 40 void Wait() { |
40 if (seen_) | 41 if (seen_) |
41 return; | 42 return; |
42 | 43 |
43 running_ = true; | 44 running_ = true; |
44 message_loop_runner_ = new MessageLoopRunner; | 45 message_loop_runner_ = new MessageLoopRunner; |
45 message_loop_runner_->Run(); | 46 message_loop_runner_->Run(); |
46 EXPECT_TRUE(seen_); | 47 EXPECT_TRUE(seen_); |
47 } | 48 } |
48 | 49 |
49 void SigninFailed(const GoogleServiceAuthError& error) override { | 50 void SigninFailed(const GoogleServiceAuthError& error) override { |
50 DVLOG(1) << "Google signin failed."; | 51 DVLOG(1) << "Google signin failed."; |
52 QuitLoopRunner(); | |
53 } | |
54 | |
55 void AccountAddedToCookie(const GoogleServiceAuthError& error) override { | |
56 if (!wait_for_account_cookies_) | |
57 return; | |
58 if (error.state() != GoogleServiceAuthError::NONE) { | |
59 DVLOG(1) << "Error signing the account, error " << error.state(); | |
60 } else { | |
61 DVLOG(1) << "Account cookies are added to cookie jar."; | |
62 signed_in_ = true; | |
63 } | |
64 QuitLoopRunner(); | |
65 } | |
66 | |
67 void SigninSuccess() override { | |
68 DVLOG(1) << "Google signin succeeded."; | |
69 if (wait_for_account_cookies_) | |
70 return; | |
71 signed_in_ = true; | |
72 QuitLoopRunner(); | |
73 } | |
74 | |
75 void QuitLoopRunner() { | |
51 seen_ = true; | 76 seen_ = true; |
52 if (!running_) | 77 if (!running_) |
53 return; | 78 return; |
54 message_loop_runner_->Quit(); | 79 message_loop_runner_->Quit(); |
55 running_ = false; | |
56 } | |
57 | |
58 void AccountAddedToCookie(const GoogleServiceAuthError& error) override {} | |
59 | |
60 void SigninSuccess() override { | |
61 DVLOG(1) << "Google signin succeeded."; | |
62 seen_ = true; | |
63 signed_in_ = true; | |
64 if (!running_) | |
65 return; | |
66 message_loop_runner_->Quit(); | |
67 running_ = false; | 80 running_ = false; |
68 } | 81 } |
69 | 82 |
70 private: | 83 private: |
71 // Bool to mark an observed event as seen prior to calling Wait(), used to | 84 // Bool to mark an observed event as seen prior to calling Wait(), used to |
72 // prevent the observer from blocking. | 85 // prevent the observer from blocking. |
73 bool seen_; | 86 bool seen_; |
74 // True is the message loop runner is running. | 87 // True is the message loop runner is running. |
75 bool running_; | 88 bool running_; |
76 // True if a GoogleSigninSucceeded event has been observed. | 89 // True if a GoogleSigninSucceeded event has been observed. |
77 bool signed_in_; | 90 bool signed_in_; |
91 // Whether we should block until the account cookies are added or not. | |
92 // By default, we only wait until SigninSuccess event is fired which happens | |
Roger Tawa OOO till Jul 10th
2015/11/09 19:34:19
Nit: there is no default really, since callers mus
| |
93 // prior to adding account to cookie. | |
94 bool wait_for_account_cookies_; | |
78 scoped_refptr<MessageLoopRunner> message_loop_runner_; | 95 scoped_refptr<MessageLoopRunner> message_loop_runner_; |
79 }; | 96 }; |
80 | 97 |
81 } // anonymous namespace | 98 } // anonymous namespace |
82 | 99 |
83 | 100 |
84 namespace login_ui_test_utils { | 101 namespace login_ui_test_utils { |
85 | 102 |
86 void WaitUntilUIReady(Browser* browser) { | 103 void WaitUntilUIReady(Browser* browser) { |
87 std::string message; | 104 std::string message; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
180 const std::string& password) { | 197 const std::string& password) { |
181 WaitUntilElementExistsInSigninFrame(browser, "Email"); | 198 WaitUntilElementExistsInSigninFrame(browser, "Email"); |
182 if (ElementExistsInSigninFrame(browser, "next")) | 199 if (ElementExistsInSigninFrame(browser, "next")) |
183 SigninInNewGaiaFlow(browser, email, password); | 200 SigninInNewGaiaFlow(browser, email, password); |
184 else | 201 else |
185 SigninInOldGaiaFlow(browser, email, password); | 202 SigninInOldGaiaFlow(browser, email, password); |
186 } | 203 } |
187 | 204 |
188 bool SignInWithUI(Browser* browser, | 205 bool SignInWithUI(Browser* browser, |
189 const std::string& username, | 206 const std::string& username, |
190 const std::string& password) { | 207 const std::string& password, |
191 | 208 bool wait_for_account_cookies, |
192 SignInObserver signin_observer; | 209 signin_metrics::Source signin_source) { |
210 SignInObserver signin_observer(wait_for_account_cookies); | |
193 scoped_ptr<SigninTracker> tracker = | 211 scoped_ptr<SigninTracker> tracker = |
194 SigninTrackerFactory::CreateForProfile(browser->profile(), | 212 SigninTrackerFactory::CreateForProfile(browser->profile(), |
195 &signin_observer); | 213 &signin_observer); |
196 | 214 |
197 GURL signin_url = signin::GetPromoURL( | 215 GURL signin_url = signin::GetPromoURL(signin_source, false); |
198 signin_metrics::SOURCE_START_PAGE, false); | |
199 DVLOG(1) << "Navigating to " << signin_url; | 216 DVLOG(1) << "Navigating to " << signin_url; |
200 // For some tests, the window is not shown yet and this might be the first tab | 217 // For some tests, the window is not shown yet and this might be the first tab |
201 // navigation, so GetActiveWebContents() for CURRENT_TAB is NULL. That's why | 218 // navigation, so GetActiveWebContents() for CURRENT_TAB is NULL. That's why |
202 // we use NEW_FOREGROUND_TAB rather than the CURRENT_TAB used by default in | 219 // we use NEW_FOREGROUND_TAB rather than the CURRENT_TAB used by default in |
203 // ui_test_utils::NavigateToURL(). | 220 // ui_test_utils::NavigateToURL(). |
204 ui_test_utils::NavigateToURLWithDisposition( | 221 ui_test_utils::NavigateToURLWithDisposition( |
205 browser, | 222 browser, |
206 signin_url, | 223 signin_url, |
207 NEW_FOREGROUND_TAB, | 224 NEW_FOREGROUND_TAB, |
208 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | 225 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
209 | 226 |
210 DVLOG(1) << "Wait for login UI to be ready."; | 227 DVLOG(1) << "Wait for login UI to be ready."; |
211 WaitUntilUIReady(browser); | 228 WaitUntilUIReady(browser); |
212 DVLOG(1) << "Sign in user: " << username; | 229 DVLOG(1) << "Sign in user: " << username; |
213 ExecuteJsToSigninInSigninFrame(browser, username, password); | 230 ExecuteJsToSigninInSigninFrame(browser, username, password); |
214 signin_observer.Wait(); | 231 signin_observer.Wait(); |
215 return signin_observer.DidSignIn(); | 232 return signin_observer.DidSignIn(); |
216 } | 233 } |
217 | 234 |
235 bool SignInWithUI(Browser* browser, | |
236 const std::string& username, | |
237 const std::string& password) { | |
238 return SignInWithUI(browser, username, password, | |
239 false /* wait_for_account_cookies */, | |
240 signin_metrics::SOURCE_START_PAGE); | |
241 } | |
242 | |
218 } // namespace login_ui_test_utils | 243 } // namespace login_ui_test_utils |
OLD | NEW |