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