12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_SIGNIN_SIGNIN_BROWSERTEST_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_SIGNIN_SIGNIN_BROWSERTEST_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/command_line.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/chrome_signin_client.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/chrome_signin_client_factory.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/signin/signin_promo.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
21a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/notification_service.h"
22a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/notification_types.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/web_contents_observer.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/content_switches.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/http/http_status_code.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_status.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kNonSigninURL[] = "http://www.google.com";
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SigninBrowserTest : public InProcessBrowserTest {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    https_server_.reset(new net::SpawnedTestServer(
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        net::SpawnedTestServer::TYPE_HTTPS,
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        net::SpawnedTestServer::kLocalhost,
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))));
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(https_server_->Start());
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Add a host resolver rule to map all outgoing requests to the test server.
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // This allows us to use "real" hostnames in URLs, which we can use to
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // create arbitrary SiteInstances.
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    command_line->AppendSwitchASCII(
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        switches::kHostResolverRules,
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "MAP * " + https_server_->host_port_pair().ToString() +
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            ",EXCLUDE localhost");
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // All tests in this file are for the web based sign in flows.
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // TODO(guohui): fix tests for inline sign in flows.
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    command_line->AppendSwitch(switches::kEnableWebBasedSignin);
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    factory_.reset(new net::URLFetcherImplFactory());
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fake_factory_.reset(new net::FakeURLFetcherFactory(factory_.get()));
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fake_factory_->SetFakeResponse(
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        GaiaUrls::GetInstance()->service_login_url(), std::string(),
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        net::HTTP_OK, net::URLRequestStatus::SUCCESS);
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fake_factory_->SetFakeResponse(
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        GURL(kNonSigninURL), std::string(), net::HTTP_OK,
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        net::URLRequestStatus::SUCCESS);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Yield control back to the InProcessBrowserTest framework.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InProcessBrowserTest::SetUp();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (fake_factory_.get()) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fake_factory_->ClearFakeResponses();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fake_factory_.reset();
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Cancel any outstanding URL fetches and destroy the URLFetcherImplFactory
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // we created.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLFetcher::CancelAll();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    factory_.reset();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InProcessBrowserTest::TearDown();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fake URLFetcher factory used to mock out GAIA signin.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::FakeURLFetcherFactory> fake_factory_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The URLFetcherImplFactory instance used to instantiate |fake_factory_|.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::URLFetcherImplFactory> factory_;
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<net::SpawnedTestServer> https_server_;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// If the one-click-signin feature is not enabled (e.g Chrome OS), we
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// never grant signin privileges to any renderer processes.
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(ENABLE_ONE_CLICK_SIGNIN)
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst bool kOneClickSigninEnabled = true;
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst bool kOneClickSigninEnabled = false;
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/249055
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_WIN)
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_ProcessIsolation DISABLED_ProcessIsolation
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_ProcessIsolation ProcessIsolation
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SigninBrowserTest, MAYBE_ProcessIsolation) {
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SigninClient* signin =
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ChromeSigninClientFactory::GetForProfile(browser()->profile());
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(signin->HasSigninProcess());
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), signin::GetPromoURL(
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      signin::SOURCE_NTP_LINK, true));
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kOneClickSigninEnabled, signin->HasSigninProcess());
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Navigating away should change the process.
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIOmniboxURL));
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(signin->HasSigninProcess());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), signin::GetPromoURL(
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      signin::SOURCE_NTP_LINK, true));
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kOneClickSigninEnabled, signin->HasSigninProcess());
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* active_tab =
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int active_tab_process_id =
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      active_tab->GetRenderProcessHost()->GetID();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kOneClickSigninEnabled,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            signin->IsSigninProcess(active_tab_process_id));
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, active_tab->GetRenderViewHost()->GetEnabledBindings());
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entry points to signin request "SINGLETON_TAB" mode, so a new request
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // shouldn't change anything.
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams(
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser(),
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      GURL(signin::GetPromoURL(signin::SOURCE_NTP_LINK, false))));
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShowSingletonTabOverwritingNTP(browser(), params);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(active_tab, browser()->tab_strip_model()->GetActiveWebContents());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kOneClickSigninEnabled,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            signin->IsSigninProcess(active_tab_process_id));
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Navigating away should change the process.
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(signin->IsSigninProcess(
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      active_tab->GetRenderProcessHost()->GetID()));
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined (OS_MACOSX)
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// crbug.com/375197
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MAYBE_NotTrustedAfterRedirect DISABLED_NotTrustedAfterRedirect
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MAYBE_NotTrustedAfterRedirect NotTrustedAfterRedirect
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SigninBrowserTest, MAYBE_NotTrustedAfterRedirect) {
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SigninClient* signin =
160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ChromeSigninClientFactory::GetForProfile(browser()->profile());
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(signin->HasSigninProcess());
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GURL url = signin::GetPromoURL(signin::SOURCE_NTP_LINK, true);
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kOneClickSigninEnabled, signin->HasSigninProcess());
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Navigating in a different tab should not affect the sign-in process.
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui_test_utils::NavigateToURLWithDisposition(
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      browser(), GURL(kNonSigninURL), NEW_BACKGROUND_TAB,
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kOneClickSigninEnabled, signin->HasSigninProcess());
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Navigating away should clear the sign-in process.
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL redirect_url("https://accounts.google.com/server-redirect?"
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "https://foo.com?service=chromiumsync");
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui_test_utils::NavigateToURL(browser(), redirect_url);
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(signin->HasSigninProcess());
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
180a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass BackOnNTPCommitObserver : public content::WebContentsObserver {
181a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch public:
182a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  explicit BackOnNTPCommitObserver(content::WebContents* web_contents)
183a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      : content::WebContentsObserver(web_contents) {
184a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
185a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
186a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  virtual void DidCommitProvisionalLoadForFrame(
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHost* render_frame_host,
188a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      const GURL& url,
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PageTransition transition_type) OVERRIDE {
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (url == GURL(chrome::kChromeUINewTabURL) ||
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        url == GURL(chrome::kChromeSearchLocalNtpUrl)) {
192a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      content::WindowedNotificationObserver observer(
193a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          content::NOTIFICATION_NAV_ENTRY_COMMITTED,
194a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          content::NotificationService::AllSources());
195a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      web_contents()->GetController().GoBack();
196a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      observer.Wait();
197a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    }
198a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
199a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
200a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch private:
201a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(BackOnNTPCommitObserver);
202a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch};
203a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
204a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// This is a test for http://crbug.com/257277. It simulates the navigations
205a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// that occur if the user clicks on the "Skip for now" link at the signin page
206a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// and initiates a back navigation between the point of Commit and
207a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// DidStopLoading of the NTP.
208a3f7b4e666c476898878fa745f637129375cd889Ben MurdochIN_PROC_BROWSER_TEST_F(SigninBrowserTest, SigninSkipForNowAndGoBack) {
209a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  GURL ntp_url(chrome::kChromeUINewTabURL);
210e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  GURL start_url = signin::GetPromoURL(signin::SOURCE_START_PAGE, false);
211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GURL skip_url = signin::GetLandingURL("ntp", 1);
212a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SigninClient* signin =
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ChromeSigninClientFactory::GetForProfile(browser()->profile());
215a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_FALSE(signin->HasSigninProcess());
216a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
217a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ui_test_utils::NavigateToURL(browser(), start_url);
218a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_EQ(kOneClickSigninEnabled, signin->HasSigninProcess());
219a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
220a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::WebContents* web_contents =
221a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
222a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Simulate clicking on the Skip for now link. It's important to have a
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // link transition so that OneClickSigninHelper removes the blank page
225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // from the history.
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  chrome::NavigateParams navigate_params(browser(),
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                         skip_url,
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         ui::PAGE_TRANSITION_LINK);
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(&navigate_params);
230a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
231a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Register an observer that will navigate back immediately on the commit of
232a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // the NTP. This will allow us to hit the race condition of navigating back
233a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // before the DidStopLoading message of NTP gets delivered. This must be
234a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // created after the navigation to the skip_url has finished loading,
235a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // otherwise this observer will navigate back, before the history cleaner
236a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // has had a chance to remove the navigation entry.
237a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  BackOnNTPCommitObserver commit_observer(web_contents);
238a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
239e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Since OneClickSigninHelper aborts redirect to NTP, thus we expect the
240e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // visible URL to be the starting URL.
241a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_EQ(skip_url, web_contents->GetLastCommittedURL());
242e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(start_url, web_contents->GetVisibleURL());
243a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
244a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::WindowedNotificationObserver observer(
245a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      content::NOTIFICATION_LOAD_STOP,
246a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      content::NotificationService::AllSources());
247a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  observer.Wait();
248a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_EQ(start_url, web_contents->GetLastCommittedURL());
249a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_SIGNIN_SIGNIN_BROWSERTEST_H_
251