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