signin_browsertest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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#ifndef CHROME_BROWSER_SIGNIN_SIGNIN_BROWSERTEST_H_ 6#define CHROME_BROWSER_SIGNIN_SIGNIN_BROWSERTEST_H_ 7 8#include "chrome/browser/signin/signin_manager.h" 9#include "chrome/browser/signin/signin_manager_factory.h" 10#include "chrome/browser/ui/browser.h" 11#include "chrome/browser/ui/tabs/tab_strip_model.h" 12#include "chrome/browser/ui/webui/signin/login_ui_service.h" 13#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" 14#include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h" 15#include "chrome/common/url_constants.h" 16#include "chrome/test/base/in_process_browser_test.h" 17#include "chrome/test/base/ui_test_utils.h" 18#include "content/public/browser/render_process_host.h" 19#include "content/public/browser/render_view_host.h" 20#include "content/public/browser/web_contents.h" 21#include "google_apis/gaia/gaia_urls.h" 22#include "net/url_request/test_url_fetcher_factory.h" 23 24namespace { 25 const char kNonSigninURL[] = "www.google.com"; 26} 27 28class SigninBrowserTest : public InProcessBrowserTest { 29 public: 30 virtual void SetUp() OVERRIDE { 31 factory_.reset(new net::URLFetcherImplFactory()); 32 fake_factory_.reset(new net::FakeURLFetcherFactory(factory_.get())); 33 fake_factory_->SetFakeResponse( 34 GaiaUrls::GetInstance()->service_login_url(), 35 std::string(), 36 true); 37 fake_factory_->SetFakeResponse(kNonSigninURL, std::string(), true); 38 // Yield control back to the InProcessBrowserTest framework. 39 InProcessBrowserTest::SetUp(); 40 } 41 42 virtual void TearDown() OVERRIDE { 43 if (fake_factory_.get()) { 44 fake_factory_->ClearFakeResponses(); 45 fake_factory_.reset(); 46 } 47 48 // Cancel any outstanding URL fetches and destroy the URLFetcherImplFactory 49 // we created. 50 net::URLFetcher::CancelAll(); 51 factory_.reset(); 52 InProcessBrowserTest::TearDown(); 53 } 54 55 private: 56 // Fake URLFetcher factory used to mock out GAIA signin. 57 scoped_ptr<net::FakeURLFetcherFactory> fake_factory_; 58 59 // The URLFetcherImplFactory instance used to instantiate |fake_factory_|. 60 scoped_ptr<net::URLFetcherImplFactory> factory_; 61}; 62 63IN_PROC_BROWSER_TEST_F(SigninBrowserTest, ProcessIsolation) { 64 // If the one-click-signin feature is not enabled (e.g Chrome OS), we 65 // never grant signin privileges to any renderer processes. 66 const bool kOneClickSigninEnabled = SyncPromoUI::UseWebBasedSigninFlow(); 67 68 SigninManager* signin = SigninManagerFactory::GetForProfile( 69 browser()->profile()); 70 EXPECT_FALSE(signin->HasSigninProcess()); 71 72 ui_test_utils::NavigateToURL(browser(), SyncPromoUI::GetSyncPromoURL( 73 GURL(), SyncPromoUI::SOURCE_NTP_LINK, true)); 74 EXPECT_EQ(kOneClickSigninEnabled, signin->HasSigninProcess()); 75 76 // Navigating away should change the process. 77 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL)); 78 EXPECT_FALSE(signin->HasSigninProcess()); 79 80 ui_test_utils::NavigateToURL(browser(), SyncPromoUI::GetSyncPromoURL( 81 GURL(), SyncPromoUI::SOURCE_NTP_LINK, true)); 82 EXPECT_EQ(kOneClickSigninEnabled, signin->HasSigninProcess()); 83 84 content::WebContents* active_tab = 85 browser()->tab_strip_model()->GetActiveWebContents(); 86 int active_tab_process_id = 87 active_tab->GetRenderProcessHost()->GetID(); 88 EXPECT_EQ(kOneClickSigninEnabled, 89 signin->IsSigninProcess(active_tab_process_id)); 90 EXPECT_EQ(0, active_tab->GetRenderViewHost()->GetEnabledBindings()); 91 92 // Entry points to signin request "SINGLETON_TAB" mode, so a new request 93 // shouldn't change anything. 94 LoginUIService* login = LoginUIServiceFactory::GetForProfile( 95 browser()->profile()); 96 login->ShowLoginPopup(); 97 EXPECT_EQ(active_tab, browser()->tab_strip_model()->GetActiveWebContents()); 98 EXPECT_EQ(kOneClickSigninEnabled, 99 signin->IsSigninProcess(active_tab_process_id)); 100 101 // Navigating away should change the process. 102 ui_test_utils::NavigateToURL(browser(), GURL(kNonSigninURL)); 103 EXPECT_FALSE(signin->IsSigninProcess( 104 active_tab->GetRenderProcessHost()->GetID())); 105} 106 107#endif // CHROME_BROWSER_SIGNIN_SIGNIN_BROWSERTEST_H_ 108