OLD | NEW |
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 "base/prefs/pref_service.h" | 5 #include "base/prefs/pref_service.h" |
6 #include "base/strings/utf_string_conversions.h" | 6 #include "base/strings/utf_string_conversions.h" |
7 #include "base/values.h" | 7 #include "base/values.h" |
| 8 #include "chrome/browser/chrome_notification_types.h" |
8 #include "chrome/browser/content_settings/cookie_settings.h" | 9 #include "chrome/browser/content_settings/cookie_settings.h" |
9 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" | 10 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" |
10 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 11 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
11 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
12 #include "chrome/browser/profiles/profile_info_cache.h" | 13 #include "chrome/browser/profiles/profile_info_cache.h" |
13 #include "chrome/browser/profiles/profile_io_data.h" | 14 #include "chrome/browser/profiles/profile_io_data.h" |
14 #include "chrome/browser/profiles/profile_manager.h" | 15 #include "chrome/browser/profiles/profile_manager.h" |
| 16 #include "chrome/browser/signin/fake_profile_oauth2_token_service.h" |
15 #include "chrome/browser/signin/fake_signin_manager.h" | 17 #include "chrome/browser/signin/fake_signin_manager.h" |
| 18 #include "chrome/browser/signin/profile_oauth2_token_service.h" |
| 19 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
16 #include "chrome/browser/signin/signin_manager.h" | 20 #include "chrome/browser/signin/signin_manager.h" |
17 #include "chrome/browser/signin/signin_manager_factory.h" | 21 #include "chrome/browser/signin/signin_manager_factory.h" |
18 #include "chrome/browser/signin/signin_names_io_thread.h" | 22 #include "chrome/browser/signin/signin_names_io_thread.h" |
19 #include "chrome/browser/signin/signin_promo.h" | 23 #include "chrome/browser/signin/signin_promo.h" |
20 #include "chrome/browser/sync/profile_sync_service_factory.h" | 24 #include "chrome/browser/sync/profile_sync_service_factory.h" |
21 #include "chrome/browser/sync/profile_sync_service_mock.h" | 25 #include "chrome/browser/sync/profile_sync_service_mock.h" |
22 #include "chrome/browser/sync/test_profile_sync_service.h" | 26 #include "chrome/browser/sync/test_profile_sync_service.h" |
23 #include "chrome/browser/ui/sync/one_click_signin_helper.h" | 27 #include "chrome/browser/ui/sync/one_click_signin_helper.h" |
| 28 #include "chrome/browser/ui/webui/signin/login_ui_service.h" |
| 29 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" |
24 #include "chrome/common/pref_names.h" | 30 #include "chrome/common/pref_names.h" |
25 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 31 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
26 #include "chrome/test/base/testing_browser_process.h" | 32 #include "chrome/test/base/testing_browser_process.h" |
27 #include "chrome/test/base/testing_pref_service_syncable.h" | 33 #include "chrome/test/base/testing_pref_service_syncable.h" |
28 #include "chrome/test/base/testing_profile.h" | 34 #include "chrome/test/base/testing_profile.h" |
29 #include "chrome/test/base/testing_profile_manager.h" | 35 #include "chrome/test/base/testing_profile_manager.h" |
30 #include "components/autofill/core/common/password_form.h" | 36 #include "components/autofill/core/common/password_form.h" |
31 #include "content/public/browser/browser_context.h" | 37 #include "content/public/browser/browser_context.h" |
32 #include "content/public/browser/navigation_details.h" | 38 #include "content/public/browser/navigation_details.h" |
33 #include "content/public/browser/web_contents.h" | 39 #include "content/public/browser/web_contents.h" |
(...skipping 21 matching lines...) Expand all Loading... |
55 "?service=foo&continue=http://foo.google.com"; | 61 "?service=foo&continue=http://foo.google.com"; |
56 | 62 |
57 class SigninManagerMock : public FakeSigninManager { | 63 class SigninManagerMock : public FakeSigninManager { |
58 public: | 64 public: |
59 explicit SigninManagerMock(Profile* profile) : FakeSigninManager(profile) { | 65 explicit SigninManagerMock(Profile* profile) : FakeSigninManager(profile) { |
60 Initialize(profile, NULL); | 66 Initialize(profile, NULL); |
61 } | 67 } |
62 MOCK_CONST_METHOD1(IsAllowedUsername, bool(const std::string& username)); | 68 MOCK_CONST_METHOD1(IsAllowedUsername, bool(const std::string& username)); |
63 }; | 69 }; |
64 | 70 |
| 71 static BrowserContextKeyedService* BuildSigninManagerMock( |
| 72 content::BrowserContext* profile) { |
| 73 return new SigninManagerMock(static_cast<Profile*>(profile)); |
| 74 } |
| 75 |
65 class TestProfileIOData : public ProfileIOData { | 76 class TestProfileIOData : public ProfileIOData { |
66 public: | 77 public: |
67 TestProfileIOData(bool is_incognito, PrefService* pref_service, | 78 TestProfileIOData(bool is_incognito, PrefService* pref_service, |
68 PrefService* local_state, CookieSettings* cookie_settings) | 79 PrefService* local_state, CookieSettings* cookie_settings) |
69 : ProfileIOData(is_incognito) { | 80 : ProfileIOData(is_incognito) { |
70 // Initialize the IO members required for these tests, but keep them on | 81 // Initialize the IO members required for these tests, but keep them on |
71 // this thread since we don't use a background thread here. | 82 // this thread since we don't use a background thread here. |
72 google_services_username()->Init(prefs::kGoogleServicesUsername, | 83 google_services_username()->Init(prefs::kGoogleServicesUsername, |
73 pref_service); | 84 pref_service); |
74 reverse_autologin_enabled()->Init(prefs::kReverseAutologinEnabled, | 85 reverse_autologin_enabled()->Init(prefs::kReverseAutologinEnabled, |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 : TestProfileSyncService(NULL, | 195 : TestProfileSyncService(NULL, |
185 profile, | 196 profile, |
186 NULL, | 197 NULL, |
187 ProfileSyncService::MANUAL_START, | 198 ProfileSyncService::MANUAL_START, |
188 false), // synchronous_backend_init | 199 false), // synchronous_backend_init |
189 first_setup_in_progress_(false) {} | 200 first_setup_in_progress_(false) {} |
190 | 201 |
191 bool first_setup_in_progress_; | 202 bool first_setup_in_progress_; |
192 }; | 203 }; |
193 | 204 |
194 static BrowserContextKeyedService* BuildSigninManagerMock( | |
195 content::BrowserContext* profile) { | |
196 return new SigninManagerMock(static_cast<Profile*>(profile)); | |
197 } | |
198 | |
199 } // namespace | 205 } // namespace |
200 | 206 |
201 class OneClickSigninHelperTest : public ChromeRenderViewHostTestHarness { | 207 class OneClickSigninHelperTest : public ChromeRenderViewHostTestHarness { |
202 public: | 208 public: |
203 OneClickSigninHelperTest(); | 209 OneClickSigninHelperTest(); |
204 | 210 |
205 virtual void SetUp() OVERRIDE; | 211 virtual void SetUp() OVERRIDE; |
206 virtual void TearDown() OVERRIDE; | 212 virtual void TearDown() OVERRIDE; |
207 | 213 |
208 // Creates the sign-in manager for tests. If |username| is | 214 // Creates the sign-in manager for tests. If |username| is |
209 // is not empty, the profile of the mock WebContents will be connected to | 215 // is not empty, the profile of the mock WebContents will be connected to |
210 // the given account. | 216 // the given account. |
211 void CreateSigninManager(const std::string& username); | 217 void CreateSigninManager(const std::string& username); |
212 | 218 |
213 // Set the ID of the signin process that the test will assume to be the | 219 // Set the ID of the signin process that the test will assume to be the |
214 // only process allowed to sign the user in to Chrome. | 220 // only process allowed to sign the user in to Chrome. |
215 void SetTrustedSigninProcessID(int id); | 221 void SetTrustedSigninProcessID(int id); |
216 | 222 |
217 void AddEmailToOneClickRejectedList(const std::string& email); | 223 void AddEmailToOneClickRejectedList(const std::string& email); |
218 void EnableOneClick(bool enable); | 224 void EnableOneClick(bool enable); |
219 void AllowSigninCookies(bool enable); | 225 void AllowSigninCookies(bool enable); |
220 void SetAllowedUsernamePattern(const std::string& pattern); | 226 void SetAllowedUsernamePattern(const std::string& pattern); |
221 ProfileSyncServiceMock* CreateProfileSyncServiceMock(); | 227 ProfileSyncServiceMock* CreateProfileSyncServiceMock(); |
222 void SubmitGAIAPassword(OneClickSigninHelper* helper); | 228 void SubmitGAIAPassword(OneClickSigninHelper* helper); |
223 OneClickSigninHelper* SetupHelperForSignin(); | |
224 | 229 |
225 SigninManagerMock* signin_manager_; | 230 SigninManagerMock* signin_manager_; |
| 231 FakeProfileOAuth2TokenService* fake_oauth2_token_service_; |
226 | 232 |
227 protected: | 233 protected: |
228 GoogleServiceAuthError no_error_; | 234 GoogleServiceAuthError no_error_; |
229 | 235 |
230 private: | 236 private: |
| 237 // ChromeRenderViewHostTestHarness overrides: |
| 238 virtual content::BrowserContext* CreateBrowserContext() OVERRIDE; |
| 239 |
231 // The ID of the signin process the test will assume to be trusted. | 240 // The ID of the signin process the test will assume to be trusted. |
232 // By default, set to the test RenderProcessHost's process ID, but | 241 // By default, set to the test RenderProcessHost's process ID, but |
233 // overridden by SetTrustedSigninProcessID. | 242 // overridden by SetTrustedSigninProcessID. |
234 int trusted_signin_process_id_; | 243 int trusted_signin_process_id_; |
235 | 244 |
236 DISALLOW_COPY_AND_ASSIGN(OneClickSigninHelperTest); | 245 DISALLOW_COPY_AND_ASSIGN(OneClickSigninHelperTest); |
237 }; | 246 }; |
238 | 247 |
239 OneClickSigninHelperTest::OneClickSigninHelperTest() | 248 OneClickSigninHelperTest::OneClickSigninHelperTest() |
240 : no_error_(GoogleServiceAuthError::NONE), | 249 : signin_manager_(NULL), |
| 250 fake_oauth2_token_service_(NULL), |
| 251 no_error_(GoogleServiceAuthError::NONE), |
241 trusted_signin_process_id_(-1) { | 252 trusted_signin_process_id_(-1) { |
242 } | 253 } |
243 | 254 |
244 void OneClickSigninHelperTest::SetUp() { | 255 void OneClickSigninHelperTest::SetUp() { |
245 signin::ForceWebBasedSigninFlowForTesting(true); | 256 signin::ForceWebBasedSigninFlowForTesting(true); |
246 content::RenderViewHostTestHarness::SetUp(); | 257 content::RenderViewHostTestHarness::SetUp(); |
247 SetTrustedSigninProcessID(process()->GetID()); | 258 SetTrustedSigninProcessID(process()->GetID()); |
248 } | 259 } |
249 | 260 |
250 void OneClickSigninHelperTest::TearDown() { | 261 void OneClickSigninHelperTest::TearDown() { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 | 325 |
315 void OneClickSigninHelperTest::SubmitGAIAPassword( | 326 void OneClickSigninHelperTest::SubmitGAIAPassword( |
316 OneClickSigninHelper* helper) { | 327 OneClickSigninHelper* helper) { |
317 autofill::PasswordForm password_form; | 328 autofill::PasswordForm password_form; |
318 password_form.origin = GURL("https://accounts.google.com"); | 329 password_form.origin = GURL("https://accounts.google.com"); |
319 password_form.signon_realm = "https://accounts.google.com"; | 330 password_form.signon_realm = "https://accounts.google.com"; |
320 password_form.password_value = UTF8ToUTF16("password"); | 331 password_form.password_value = UTF8ToUTF16("password"); |
321 helper->PasswordSubmitted(password_form); | 332 helper->PasswordSubmitted(password_form); |
322 } | 333 } |
323 | 334 |
| 335 content::BrowserContext* OneClickSigninHelperTest::CreateBrowserContext() { |
| 336 TestingProfile::Builder builder; |
| 337 builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(), |
| 338 FakeProfileOAuth2TokenService::Build); |
| 339 scoped_ptr<TestingProfile> profile = builder.Build(); |
| 340 |
| 341 fake_oauth2_token_service_ = |
| 342 static_cast<FakeProfileOAuth2TokenService*>( |
| 343 ProfileOAuth2TokenServiceFactory::GetForProfile(profile.get())); |
| 344 |
| 345 return profile.release(); |
| 346 } |
| 347 |
324 class OneClickSigninHelperIOTest : public OneClickSigninHelperTest { | 348 class OneClickSigninHelperIOTest : public OneClickSigninHelperTest { |
325 public: | 349 public: |
326 OneClickSigninHelperIOTest(); | 350 OneClickSigninHelperIOTest(); |
327 | 351 |
328 virtual void SetUp() OVERRIDE; | 352 virtual void SetUp() OVERRIDE; |
329 | 353 |
330 TestProfileIOData* CreateTestProfileIOData(bool is_incognito); | 354 TestProfileIOData* CreateTestProfileIOData(bool is_incognito); |
331 | 355 |
332 protected: | 356 protected: |
333 TestingProfileManager testing_profile_manager_; | 357 TestingProfileManager testing_profile_manager_; |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 | 671 |
648 // If Chrome signin is triggered from a webstore install, and user chooses to | 672 // If Chrome signin is triggered from a webstore install, and user chooses to |
649 // config sync, then Chrome should redirect immediately to sync settings page, | 673 // config sync, then Chrome should redirect immediately to sync settings page, |
650 // and upon successful setup, redirect back to webstore. | 674 // and upon successful setup, redirect back to webstore. |
651 TEST_F(OneClickSigninHelperTest, SigninFromWebstoreWithConfigSyncfirst) { | 675 TEST_F(OneClickSigninHelperTest, SigninFromWebstoreWithConfigSyncfirst) { |
652 CreateSigninManager(std::string()); | 676 CreateSigninManager(std::string()); |
653 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)) | 677 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)) |
654 .WillRepeatedly(Return(true)); | 678 .WillRepeatedly(Return(true)); |
655 | 679 |
656 ProfileSyncServiceMock* sync_service = CreateProfileSyncServiceMock(); | 680 ProfileSyncServiceMock* sync_service = CreateProfileSyncServiceMock(); |
657 EXPECT_CALL(*sync_service, SetSetupInProgress(true)); | |
658 EXPECT_CALL(*sync_service, AddObserver(_)).Times(AtLeast(1)); | 681 EXPECT_CALL(*sync_service, AddObserver(_)).Times(AtLeast(1)); |
659 EXPECT_CALL(*sync_service, RemoveObserver(_)).Times(AtLeast(1)); | 682 EXPECT_CALL(*sync_service, RemoveObserver(_)).Times(AtLeast(1)); |
660 EXPECT_CALL(*sync_service, sync_initialized()).WillRepeatedly(Return(true)); | 683 EXPECT_CALL(*sync_service, sync_initialized()).WillRepeatedly(Return(true)); |
661 | 684 |
662 content::WebContents* contents = web_contents(); | 685 content::WebContents* contents = web_contents(); |
663 | 686 |
664 OneClickSigninHelper::CreateForWebContentsWithPasswordManager(contents, NULL); | 687 OneClickSigninHelper::CreateForWebContentsWithPasswordManager(contents, NULL); |
665 OneClickSigninHelper* helper = | 688 OneClickSigninHelper* helper = |
666 OneClickSigninHelper::FromWebContents(contents); | 689 OneClickSigninHelper::FromWebContents(contents); |
667 helper->SetDoNotClearPendingEmailForTesting(); | 690 helper->SetDoNotClearPendingEmailForTesting(); |
| 691 helper->set_do_not_start_sync_for_testing(); |
668 | 692 |
669 GURL continueUrl("https://chrome.google.com/webstore?source=5"); | 693 GURL continueUrl("https://chrome.google.com/webstore?source=5"); |
670 OneClickSigninHelper::ShowInfoBarUIThread( | 694 OneClickSigninHelper::ShowInfoBarUIThread( |
671 "session_index", "user@gmail.com", | 695 "session_index", "user@gmail.com", |
672 OneClickSigninHelper::AUTO_ACCEPT_EXPLICIT, | 696 OneClickSigninHelper::AUTO_ACCEPT_EXPLICIT, |
673 signin::SOURCE_WEBSTORE_INSTALL, | 697 signin::SOURCE_WEBSTORE_INSTALL, |
674 continueUrl, process()->GetID(), rvh()->GetRoutingID()); | 698 continueUrl, process()->GetID(), rvh()->GetRoutingID()); |
675 | 699 |
676 SubmitGAIAPassword(helper); | 700 SubmitGAIAPassword(helper); |
677 | 701 |
678 NavigateAndCommit(GURL("https://chrome.google.com/webstore?source=3")); | 702 NavigateAndCommit(GURL("https://chrome.google.com/webstore?source=3")); |
679 helper->DidStopLoading(rvh()); | 703 helper->DidStopLoading(rvh()); |
680 | |
681 helper->OnStateChanged(); | 704 helper->OnStateChanged(); |
682 EXPECT_EQ(GURL(continueUrl), contents->GetURL()); | 705 EXPECT_EQ(GURL(continueUrl), contents->GetURL()); |
683 EXPECT_EQ("user@gmail.com", signin_manager_->GetAuthenticatedUsername()); | |
684 } | 706 } |
685 | 707 |
686 // Checks that the state of OneClickSigninHelper is cleaned when there is a | 708 // Checks that the state of OneClickSigninHelper is cleaned when there is a |
687 // navigation away from the sign in flow that is not triggered by the | 709 // navigation away from the sign in flow that is not triggered by the |
688 // web contents. | 710 // web contents. |
689 TEST_F(OneClickSigninHelperTest, CleanTransientStateOnNavigate) { | 711 TEST_F(OneClickSigninHelperTest, CleanTransientStateOnNavigate) { |
690 content::WebContents* contents = web_contents(); | 712 content::WebContents* contents = web_contents(); |
691 | 713 |
692 OneClickSigninHelper::CreateForWebContentsWithPasswordManager(contents, NULL); | 714 OneClickSigninHelper::CreateForWebContentsWithPasswordManager(contents, NULL); |
693 OneClickSigninHelper* helper = | 715 OneClickSigninHelper* helper = |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 prefs::kSigninAllowed, base::Value::CreateBooleanValue(true)); | 891 prefs::kSigninAllowed, base::Value::CreateBooleanValue(true)); |
870 | 892 |
871 // Simulate a policy disabling sync by writing kSyncManaged directly. | 893 // Simulate a policy disabling sync by writing kSyncManaged directly. |
872 // We should still offer to sign in the browser. | 894 // We should still offer to sign in the browser. |
873 profile()->GetTestingPrefService()->SetManagedPref( | 895 profile()->GetTestingPrefService()->SetManagedPref( |
874 prefs::kSyncManaged, base::Value::CreateBooleanValue(true)); | 896 prefs::kSyncManaged, base::Value::CreateBooleanValue(true)); |
875 EXPECT_EQ(OneClickSigninHelper::CAN_OFFER, | 897 EXPECT_EQ(OneClickSigninHelper::CAN_OFFER, |
876 OneClickSigninHelper::CanOfferOnIOThreadImpl( | 898 OneClickSigninHelper::CanOfferOnIOThreadImpl( |
877 valid_gaia_url_, std::string(), &request_, io_data.get())); | 899 valid_gaia_url_, std::string(), &request_, io_data.get())); |
878 } | 900 } |
OLD | NEW |