15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/captive_portal/captive_portal_tab_helper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/captive_portal/captive_portal_service.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/captive_portal/captive_portal_tab_reloader.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing captive_portal::CaptivePortalResult; 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::ResourceType; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kHttpUrl = "http://whatever.com/"; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kHttpsUrl = "https://whatever.com/"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for cross-process navigations. Shouldn't actually matter whether this 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is different from kHttpsUrl, but best to keep things consistent. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kHttpsUrl2 = "https://cross_process.com/"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Error pages use a "data:" URL. Shouldn't actually matter what this is. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kErrorPageUrl = "data:blah"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Some navigations behave differently depending on if they're cross-process 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or not. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum NavigationType { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSameProcess, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCrossProcess, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCaptivePortalTabReloader : public CaptivePortalTabReloader { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCaptivePortalTabReloader() 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CaptivePortalTabReloader(NULL, NULL, base::Callback<void()>()) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnLoadStart, void(bool)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnLoadCommitted, void(int)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnAbort, void()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnRedirect, void(bool)); 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MOCK_METHOD2(OnCaptivePortalResults, 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void(CaptivePortalResult, CaptivePortalResult)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Inherits from the ChromeRenderViewHostTestHarness to gain access to 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CreateTestWebContents. Since the tests need to micromanage order of 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsObserver function calls, does not actually make sure of 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the harness in any other way. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CaptivePortalTabHelperTest : public ChromeRenderViewHostTestHarness { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CaptivePortalTabHelperTest() 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : tab_helper_(NULL), 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mock_reloader_(new testing::StrictMock<MockCaptivePortalTabReloader>) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper_.SetTabReloaderForTest(mock_reloader_); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CaptivePortalTabHelperTest() {} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeRenderViewHostTestHarness::SetUp(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents1_.reset(CreateTestWebContents()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents2_.reset(CreateTestWebContents()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents2_.reset(NULL); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents1_.reset(NULL); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeRenderViewHostTestHarness::TearDown(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a successful load of |url|. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateSuccess(const GURL& url, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host->GetMainFrame(), url, false, false); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::OK)).Times(1); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host->GetMainFrame(), 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a connection timeout while requesting |url|. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateTimeout(const GURL& url, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host->GetMainFrame(), url, false, false); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(render_view_host->GetMainFrame(), 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_TIMED_OUT, 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provisional load starts for the error page. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host->GetMainFrame(), GURL(kErrorPageUrl), true, false); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_TIMED_OUT)).Times(1); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host->GetMainFrame(), 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kErrorPageUrl), 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates an abort while requesting |url|. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateAbort(const GURL& url, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationType navigation_type) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host->GetMainFrame(), url, false, false); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnAbort()).Times(1); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (navigation_type == kSameProcess) { 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(render_view_host->GetMainFrame(), 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_ABORTED, 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For interrupted provisional cross-process navigations, the 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is destroyed without sending a DidFailProvisionalLoad 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_helper().RenderViewDeleted(render_view_host); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that above call resulted in abort, for tests that continue 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the abort. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnAbort()).Times(0); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates an abort while loading an error page. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateAbortTimeout(const GURL& url, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationType navigation_type) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host->GetMainFrame(), url, false, false); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(render_view_host->GetMainFrame(), 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_TIMED_OUT, 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start event for the error page. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host->GetMainFrame(), url, true, false); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnAbort()).Times(1); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (navigation_type == kSameProcess) { 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(render_view_host->GetMainFrame(), 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_ABORTED, 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For interrupted provisional cross-process navigations, the 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is destroyed without sending a DidFailProvisionalLoad 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification. 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_helper().RenderViewDeleted(render_view_host); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that above call resulted in abort, for tests that continue 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the abort. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnAbort()).Times(0); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CaptivePortalTabHelper& tab_helper() { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tab_helper_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a captive portal redirect by calling the Observe method. 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void ObservePortalResult(CaptivePortalResult previous_result, 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CaptivePortalResult result) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile> source_profile(NULL); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CaptivePortalService::Results results; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results.previous_result = previous_result; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results.result = result; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<CaptivePortalService::Results> details_results(&results); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnCaptivePortalResults(previous_result, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result)).Times(1); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().Observe(chrome::NOTIFICATION_CAPTIVE_PORTAL_CHECK_RESULT, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_profile, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details_results); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a redirect. Uses OnRedirect rather than Observe, for simplicity. 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnRedirect(ResourceType type, const GURL& new_url, int child_id) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().OnRedirect(child_id, type, new_url); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCaptivePortalTabReloader& mock_reloader() { return *mock_reloader_; } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIsLoginTab() { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().SetIsLoginTab(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host1() { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_contents1_->GetRenderViewHost(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host2() { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_contents2_->GetRenderViewHost(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* main_render_frame1() { 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_contents1_->GetMainFrame(); 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* main_render_frame2() { 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_contents2_->GetMainFrame(); 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only the RenderViewHosts are used. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::WebContents> web_contents1_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::WebContents> web_contents2_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CaptivePortalTabHelper tab_helper_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owned by |tab_helper_|. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::StrictMock<MockCaptivePortalTabReloader>* mock_reloader_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CaptivePortalTabHelperTest); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpSuccess) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateSuccess(GURL(kHttpUrl), render_view_host1()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStopLoading(render_view_host1()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpTimeout) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateTimeout(GURL(kHttpUrl), render_view_host1()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStopLoading(render_view_host1()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as above, but simulates what happens when the Link Doctor is enabled, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which adds another provisional load/commit for the error page, after the 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first two. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpTimeoutLinkDoctor) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateTimeout(GURL(kHttpUrl), render_view_host1()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(false)).Times(1); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provisional load starts for the error page. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), GURL(kErrorPageUrl), true, false); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::OK)).Times(1); 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidCommitProvisionalLoadForFrame(main_render_frame1(), 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kErrorPageUrl), 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStopLoading(render_view_host1()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpsSuccess) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateSuccess(GURL(kHttpsUrl), render_view_host1()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStopLoading(render_view_host1()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpsTimeout) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateTimeout(GURL(kHttpsUrl), render_view_host1()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure no state was carried over from the timeout. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateSuccess(GURL(kHttpsUrl), render_view_host1()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpsAbort) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateAbort(GURL(kHttpsUrl), render_view_host1(), kSameProcess); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure no state was carried over from the abort. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateSuccess(GURL(kHttpsUrl), render_view_host1()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A cross-process navigation is aborted by a same-site navigation. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, AbortCrossProcess) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateAbort(GURL(kHttpsUrl2), render_view_host2(), kCrossProcess); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure no state was carried over from the abort. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateSuccess(GURL(kHttpUrl), render_view_host1()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Abort while there's a provisional timeout error page loading. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpsAbortTimeout) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateAbortTimeout(GURL(kHttpsUrl), render_view_host1(), kSameProcess); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure no state was carried over from the timeout or the abort. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateSuccess(GURL(kHttpsUrl), render_view_host1()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Abort a cross-process navigation while there's a provisional timeout error 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page loading. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, AbortTimeoutCrossProcess) { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateAbortTimeout(GURL(kHttpsUrl2), render_view_host2(), 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCrossProcess); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure no state was carried over from the timeout or the abort. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateSuccess(GURL(kHttpsUrl), render_view_host1()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opposite case from above - a same-process error page is aborted in favor of 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a cross-process one. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpsAbortTimeoutForCrossProcess) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateAbortTimeout(GURL(kHttpsUrl), render_view_host1(), kSameProcess); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure no state was carried over from the timeout or the abort. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateSuccess(GURL(kHttpsUrl2), render_view_host2()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A provisional same-site navigation is interrupted by a cross-process 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation without sending an abort first. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, UnexpectedProvisionalLoad) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL same_site_url = GURL(kHttpUrl); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL cross_process_url = GURL(kHttpsUrl2); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A same-site load for the original RenderViewHost starts. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoadStart(same_site_url.SchemeIsSecure())).Times(1); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), same_site_url, false, false); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's unexpectedly interrupted by a cross-process navigation, which starts 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating before the old navigation cancels. We generate an abort message 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the old navigation. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnAbort()).Times(1); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoadStart(cross_process_url.SchemeIsSecure())).Times(1); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame2(), cross_process_url, false, false); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cross-process navigation fails. 351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(main_render_frame2(), 352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cross_process_url, 353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_FAILED, 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The same-site navigation finally is aborted. 357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(main_render_frame1(), 358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch same_site_url, 359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_ABORTED, 360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The provisional load starts for the error page for the cross-process 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame2(), GURL(kErrorPageUrl), true, false); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_FAILED)).Times(1); 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidCommitProvisionalLoadForFrame(main_render_frame2(), 369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kErrorPageUrl), 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Similar to the above test, except the original RenderViewHost manages to 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commit before its navigation is aborted. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, UnexpectedCommit) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL same_site_url = GURL(kHttpUrl); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL cross_process_url = GURL(kHttpsUrl2); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A same-site load for the original RenderViewHost starts. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoadStart(same_site_url.SchemeIsSecure())).Times(1); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), same_site_url, false, false); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's unexpectedly interrupted by a cross-process navigation, which starts 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating before the old navigation cancels. We generate an abort message 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the old navigation. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnAbort()).Times(1); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoadStart(cross_process_url.SchemeIsSecure())).Times(1); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame2(), cross_process_url, false, false); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cross-process navigation fails. 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(main_render_frame2(), 396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cross_process_url, 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_FAILED, 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The same-site navigation succeeds. 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnAbort()).Times(1); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoadStart(same_site_url.SchemeIsSecure())).Times(1); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::OK)).Times(1); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_render_frame1(), same_site_url, ui::PAGE_TRANSITION_LINK); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simulates navigations for a number of subframes, and makes sure no 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CaptivePortalTabHelper function is called. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpsSubframe) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = GURL(kHttpsUrl); 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHostTester* render_frame_host_tester = 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHostTester::For(main_render_frame1()); 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* subframe1 = 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host_tester->AppendChild("subframe1"); 418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normal load. 420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidStartProvisionalLoadForFrame(subframe1, url, false, false); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci subframe1, url, ui::PAGE_TRANSITION_LINK); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Timeout. 425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* subframe2 = 426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host_tester->AppendChild("subframe2"); 427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidStartProvisionalLoadForFrame(subframe2, url, false, false); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidFailProvisionalLoad( 429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subframe2, url, net::ERR_TIMED_OUT, base::string16()); 430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidStartProvisionalLoadForFrame(subframe2, url, true, false); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidFailProvisionalLoad( 432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subframe2, url, net::ERR_ABORTED, base::string16()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Abort. 435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* subframe3 = 436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host_tester->AppendChild("subframe3"); 437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidStartProvisionalLoadForFrame(subframe3, url, false, false); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidFailProvisionalLoad( 439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subframe3, url, net::ERR_ABORTED, base::string16()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simulates a subframe erroring out at the same time as a provisional load, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but with a different error code. Make sure the TabHelper sees the correct 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// error. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpsSubframeParallelError) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL used by both frames. 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = GURL(kHttpsUrl); 448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* subframe = 449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHostTester::For(main_render_frame1()) 450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->AppendChild("subframe"); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads start. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), url, false, false); 456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidStartProvisionalLoadForFrame(subframe, url, false, false); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads return errors. 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidFailProvisionalLoad( 460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), url, net::ERR_UNEXPECTED, base::string16()); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidFailProvisionalLoad( 462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subframe, url, net::ERR_TIMED_OUT, base::string16()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provisional load starts for the error pages. 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), url, true, false); 467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidStartProvisionalLoadForFrame(subframe, url, true, false); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error page load finishes. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci subframe, url, ui::PAGE_TRANSITION_AUTO_SUBFRAME); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_UNEXPECTED)).Times(1); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_render_frame1(), url, ui::PAGE_TRANSITION_LINK); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simulates an HTTP to HTTPS redirect, which then times out. 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpToHttpsRedirectTimeout) { 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL http_url(kHttpUrl); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(false)).Times(1); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), http_url, false, false); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url(kHttpsUrl); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnRedirect(true)).Times(1); 4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnRedirect(content::RESOURCE_TYPE_MAIN_FRAME, 4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) https_url, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host1()->GetProcess()->GetID()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(main_render_frame1(), 491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch https_url, 492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_TIMED_OUT, 493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provisional load starts for the error page. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), GURL(kErrorPageUrl), true, false); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_TIMED_OUT)).Times(1); 500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidCommitProvisionalLoadForFrame(main_render_frame1(), 501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kErrorPageUrl), 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simulates an HTTPS to HTTP redirect. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpsToHttpRedirect) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url(kHttpsUrl); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoadStart(https_url.SchemeIsSecure())).Times(1); 510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidStartProvisionalLoadForFrame( 511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), https_url, false, false); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL http_url(kHttpUrl); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnRedirect(http_url.SchemeIsSecure())).Times(1); 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnRedirect(content::RESOURCE_TYPE_MAIN_FRAME, http_url, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host1()->GetProcess()->GetID()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::OK)).Times(1); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_render_frame1(), http_url, ui::PAGE_TRANSITION_LINK); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simulates an HTTPS to HTTPS redirect. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, HttpToHttpRedirect) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL http_url(kHttpUrl); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoadStart(http_url.SchemeIsSecure())).Times(1); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), http_url, false, false); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnRedirect(http_url.SchemeIsSecure())).Times(1); 5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnRedirect(content::RESOURCE_TYPE_MAIN_FRAME, http_url, 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host1()->GetProcess()->GetID()); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::OK)).Times(1); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_render_frame1(), http_url, ui::PAGE_TRANSITION_LINK); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that a subframe redirect doesn't reset the timer to kick off a captive 541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// portal probe for the main frame if the main frame request is taking too long. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, SubframeRedirect) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL http_url(kHttpUrl); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(false)).Times(1); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), http_url, false, false); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url(kHttpsUrl); 5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnRedirect(content::RESOURCE_TYPE_SUB_FRAME, 5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) https_url, 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host1()->GetProcess()->GetID()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::OK)).Times(1); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidCommitProvisionalLoadForFrame( 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_render_frame1(), GURL(kErrorPageUrl), ui::PAGE_TRANSITION_LINK); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simulates a redirect, for another RenderViewHost. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, OtherRenderViewHostRedirect) { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL http_url(kHttpUrl); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadStart(false)).Times(1); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), http_url, false, false); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Another RenderViewHost sees a redirect. None of the reloader's functions 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be called. 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url(kHttpsUrl); 5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnRedirect(content::RESOURCE_TYPE_MAIN_FRAME, 5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) https_url, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host2()->GetProcess()->GetID()); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidFailProvisionalLoad(main_render_frame1(), 573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch https_url, 574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_TIMED_OUT, 575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provisional load starts for the error page. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper().DidStartProvisionalLoadForFrame( 579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch main_render_frame1(), GURL(kErrorPageUrl), true, false); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_TIMED_OUT)).Times(1); 582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_helper().DidCommitProvisionalLoadForFrame(main_render_frame1(), 583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kErrorPageUrl), 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, LoginTabLogin) { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoginTab(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tab_helper().IsLoginTab()); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObservePortalResult(captive_portal::RESULT_INTERNET_CONNECTED, 5935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu captive_portal::RESULT_INTERNET_CONNECTED); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, LoginTabError) { 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoginTab(); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tab_helper().IsLoginTab()); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObservePortalResult(captive_portal::RESULT_INTERNET_CONNECTED, 6045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu captive_portal::RESULT_NO_RESPONSE); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, LoginTabMultipleResultsBeforeLogin) { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoginTab(); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tab_helper().IsLoginTab()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObservePortalResult(captive_portal::RESULT_INTERNET_CONNECTED, 6155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tab_helper().IsLoginTab()); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObservePortalResult(captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL, 6195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tab_helper().IsLoginTab()); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObservePortalResult(captive_portal::RESULT_NO_RESPONSE, 6235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu captive_portal::RESULT_INTERNET_CONNECTED); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CaptivePortalTabHelperTest, NoLoginTab) { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObservePortalResult(captive_portal::RESULT_INTERNET_CONNECTED, 6315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObservePortalResult(captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL, 6355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu captive_portal::RESULT_NO_RESPONSE); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ObservePortalResult(captive_portal::RESULT_NO_RESPONSE, 6395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu captive_portal::RESULT_INTERNET_CONNECTED); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_helper().IsLoginTab()); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 642