1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/sync/one_click_signin_sync_observer.h" 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/bind.h" 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/callback.h" 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/signin/signin_manager_factory.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/signin/signin_promo.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/profile_sync_service_factory.h" 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/startup_controller.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/test_profile_sync_service.h" 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/chrome_render_view_host_test_harness.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_profile.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/signin/core/browser/signin_manager.h" 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/render_view_host.h" 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/web_contents.h" 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/test/test_utils.h" 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "testing/gmock/include/gmock/gmock.h" 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing testing::_; 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace { 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kContinueUrl[] = "https://www.example.com/"; 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MockWebContentsObserver : public content::WebContentsObserver { 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch explicit MockWebContentsObserver(content::WebContents* web_contents) 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : content::WebContentsObserver(web_contents) {} 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~MockWebContentsObserver() {} 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // A hook to verify that the OneClickSigninSyncObserver initiated a redirect 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // to the continue URL. Navigations in unit_tests never complete, but a 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // navigation start is a sufficient signal for the purposes of this test. 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Listening for this call also has the advantage of being synchronous. 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MOCK_METHOD1(AboutToNavigateRenderView, void(content::RenderViewHost*)); 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass OneClickTestProfileSyncService : public TestProfileSyncService { 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~OneClickTestProfileSyncService() {} 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Helper routine to be used in conjunction with 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // BrowserContextKeyedServiceFactory::SetTestingFactory(). 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static KeyedService* Build(content::BrowserContext* profile) { 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return new OneClickTestProfileSyncService(static_cast<Profile*>(profile)); 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool FirstSetupInProgress() const OVERRIDE { 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return first_setup_in_progress_; 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool sync_initialized() const OVERRIDE { return sync_initialized_; } 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void set_first_setup_in_progress(bool in_progress) { 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch first_setup_in_progress_ = in_progress; 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void set_sync_initialized(bool initialized) { 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_initialized_ = initialized; 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch explicit OneClickTestProfileSyncService(Profile* profile) 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : TestProfileSyncService( 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ProfileSyncComponentsFactory>( 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ProfileSyncComponentsFactoryMock()), 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile, 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninManagerFactory::GetForProfile(profile), 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProfileOAuth2TokenServiceFactory::GetForProfile(profile), 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch browser_sync::MANUAL_START), 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch first_setup_in_progress_(false), 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_initialized_(false) {} 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool first_setup_in_progress_; 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool sync_initialized_; 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass TestOneClickSigninSyncObserver : public OneClickSigninSyncObserver { 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch typedef base::Callback<void(TestOneClickSigninSyncObserver*)> 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DestructionCallback; 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestOneClickSigninSyncObserver(content::WebContents* web_contents, 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& continue_url, 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const DestructionCallback& callback) 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : OneClickSigninSyncObserver(web_contents, continue_url), 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch destruction_callback_(callback) {} 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~TestOneClickSigninSyncObserver() { destruction_callback_.Run(this); } 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DestructionCallback destruction_callback_; 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DISALLOW_COPY_AND_ASSIGN(TestOneClickSigninSyncObserver); 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// A trivial factory to build a null service. 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochKeyedService* BuildNullService(content::BrowserContext* context) { 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return NULL; 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass OneClickSigninSyncObserverTest : public ChromeRenderViewHostTestHarness { 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OneClickSigninSyncObserverTest() 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : sync_service_(NULL), 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_observer_(NULL), 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_observer_destroyed_(true) {} 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetUp() OVERRIDE { 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ChromeRenderViewHostTestHarness::SetUp(); 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_contents_observer_.reset(new MockWebContentsObserver(web_contents())); 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_ = 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<OneClickTestProfileSyncService*>( 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile(), OneClickTestProfileSyncService::Build)); 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void TearDown() OVERRIDE { 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Verify that the |sync_observer_| unregistered as an observer from the 127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // sync service and freed its memory. 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(sync_observer_destroyed_); 129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (sync_service_) 130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(sync_service_->HasObserver(sync_observer_)); 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ChromeRenderViewHostTestHarness::TearDown(); 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected: 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void CreateSyncObserver(const std::string& url) { 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_observer_ = new TestOneClickSigninSyncObserver( 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_contents(), GURL(url), 138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&OneClickSigninSyncObserverTest::OnSyncObserverDestroyed, 139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Unretained(this))); 140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (sync_service_) 141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(sync_service_->HasObserver(sync_observer_)); 142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(sync_observer_destroyed_); 143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_observer_destroyed_ = false; 144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OneClickTestProfileSyncService* sync_service_; 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<MockWebContentsObserver> web_contents_observer_; 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void OnSyncObserverDestroyed(TestOneClickSigninSyncObserver* observer) { 151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(sync_observer_, observer); 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(sync_observer_destroyed_); 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_observer_destroyed_ = true; 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestOneClickSigninSyncObserver* sync_observer_; 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool sync_observer_destroyed_; 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that if no Sync service is present, e.g. because Sync is disabled, the 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// observer immediately loads the continue URL. 162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest, NoSyncService_RedirectsImmediately) { 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Simulate disabling Sync. 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_ = 165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<OneClickTestProfileSyncService*>( 166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( 167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile(), BuildNullService)); 168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The observer should immediately redirect to the continue URL. 170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)); 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CreateSyncObserver(kContinueUrl); 172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(GURL(kContinueUrl), web_contents()->GetVisibleURL()); 173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The |sync_observer_| will be destroyed asynchronously, so manually pump 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // the message loop to wait for the destruction. 176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::RunAllPendingInMessageLoop(); 177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that when the WebContents is destroyed without any Sync notifications 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// firing, the observer cleans up its memory without loading the continue URL. 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest, WebContentsDestroyed) { 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)).Times(0); 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CreateSyncObserver(kContinueUrl); 184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetContents(NULL); 185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that when Sync is configured successfully, the observer loads the 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// continue URL and cleans up after itself. 189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest, 190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnSyncStateChanged_SyncConfiguredSuccessfully) { 191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CreateSyncObserver(kContinueUrl); 192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->set_first_setup_in_progress(false); 193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->set_sync_initialized(true); 194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)); 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->NotifyObservers(); 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(GURL(kContinueUrl), web_contents()->GetVisibleURL()); 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that when Sync configuration fails, the observer does not load the 201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// continue URL, but still cleans up after itself. 202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest, 203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnSyncStateChanged_SyncConfigurationFailed) { 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CreateSyncObserver(kContinueUrl); 205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->set_first_setup_in_progress(false); 206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->set_sync_initialized(false); 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)).Times(0); 209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->NotifyObservers(); 210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_NE(GURL(kContinueUrl), web_contents()->GetVisibleURL()); 211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that when Sync sends a notification while setup is not yet complete, 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// the observer does not load the continue URL, and continues to wait. 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest, 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnSyncStateChanged_SyncConfigurationInProgress) { 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CreateSyncObserver(kContinueUrl); 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->set_first_setup_in_progress(true); 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->set_sync_initialized(false); 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)).Times(0); 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->NotifyObservers(); 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_NE(GURL(kContinueUrl), web_contents()->GetVisibleURL()); 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Trigger an event to force state to be cleaned up. 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetContents(NULL); 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that if the continue_url is to the settings page, no navigation is 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// triggered, since it would be redundant. 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest, 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnSyncStateChanged_SyncConfiguredSuccessfully_SourceIsSettings) { 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GURL continue_url = signin::GetPromoURL(signin::SOURCE_SETTINGS, false); 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CreateSyncObserver(continue_url.spec()); 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->set_first_setup_in_progress(false); 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->set_sync_initialized(true); 237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)).Times(0); 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_service_->NotifyObservers(); 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_NE(GURL(kContinueUrl), web_contents()->GetVisibleURL()); 241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 242