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