15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/renderer/net/net_error_helper_core.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <map>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <string>
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector>
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/json/json_reader.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/json/json_writer.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/metrics/statistics_recorder.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/stringprintf.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/test/histogram_tester.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/timer/mock_timer.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/timer/timer.h"
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/values.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/net/net_error_info.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/common/url_constants.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/net_errors.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLError.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "url/gurl.h"
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebURLError;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using chrome_common_net::DnsProbeStatus;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using chrome_common_net::DnsProbeStatusToString;
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kFailedUrl[] = "http://failed/";
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kFailedHttpsUrl[] = "https://failed/";
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kNavigationCorrectionUrl[] = "http://navigation.corrections/";
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kLanguage[] = "en";
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kCountry[] = "us";
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kApiKey[] = "api_key";
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kSearchUrl[] = "http://www.google.com/search";
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kSuggestedSearchTerms[] = "Happy Goats";
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kNavigationCorrectionEventId[] = "#007";
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kNavigationCorrectionFingerprint[] = "RandumStuff";
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochstruct NavigationCorrection {
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const char* correction_type;
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const char* url_correction;
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const char* click_type;
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const char* click_data;
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool is_porn;
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool is_soft_porn;
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::Value* ToValue() const {
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    base::DictionaryValue* dict = new base::DictionaryValue();
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->SetString("correctionType", correction_type);
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->SetString("urlCorrection", url_correction);
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    dict->SetString("clickType", click_type);
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    dict->SetString("clickData", click_data);
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->SetBoolean("isPorn", is_porn);
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->SetBoolean("isSoftPorn", is_soft_porn);
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return dict;
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst NavigationCorrection kDefaultCorrections[] = {
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {"reloadPage", kFailedUrl, "rld", "data1", false, false},
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {"urlCorrection", "http://somewhere_else/", "btn", "data2", false, false},
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {"contentOverlap", "http://pony_island/", "btn", "data3", false, false},
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Porn should be ignored.
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {"emphasizedUrlCorrection", "http://porn/", "btn", "data4", true, false},
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {"sitemap", "http://more_porn/", "btn", "data5", false, true},
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {"webSearchQuery", kSuggestedSearchTerms, "frm", "data6", false, false},
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochstd::string SuggestionsToResponse(const NavigationCorrection* corrections,
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                  int num_corrections) {
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::ListValue* url_corrections = new base::ListValue();
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (int i = 0; i < num_corrections; ++i)
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    url_corrections->Append(corrections[i].ToValue());
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue());
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  response->Set("result.UrlCorrections", url_corrections);
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  response->SetString("result.eventId", kNavigationCorrectionEventId);
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  response->SetString("result.fingerprint", kNavigationCorrectionFingerprint);
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string json;
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::JSONWriter::Write(response.get(), &json);
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return json;
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)testing::AssertionResult StringValueEquals(
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::DictionaryValue& dict,
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& key,
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& expected_value) {
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string actual_value;
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!dict.GetString(key, &actual_value))
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return testing::AssertionFailure() << key << " not found.";
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (actual_value != expected_value) {
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return testing::AssertionFailure()
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        << "actual: " << actual_value << "\n expected: " << expected_value;
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return testing::AssertionSuccess();
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Creates a string from an error that is used as a mock locally generated
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// error page for that error.
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string ErrorToString(const WebURLError& error, bool is_failed_post) {
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::StringPrintf("(%s, %s, %i, %s)",
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            error.unreachableURL.string().utf8().c_str(),
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            error.domain.utf8().c_str(), error.reason,
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            is_failed_post ? "POST" : "NOT POST");
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebURLError ProbeError(DnsProbeStatus status) {
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebURLError error;
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error.unreachableURL = GURL(kFailedUrl);
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error.domain = blink::WebString::fromUTF8(
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chrome_common_net::kDnsProbeErrorDomain);
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error.reason = status;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return error;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebURLError NetError(net::Error net_error) {
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebURLError error;
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error.unreachableURL = GURL(kFailedUrl);
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error.domain = blink::WebString::fromUTF8(net::kErrorDomain);
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error.reason = net_error;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return error;
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Convenience functions that create an error string for a non-POST request.
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string ProbeErrorString(DnsProbeStatus status) {
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ErrorToString(ProbeError(status), false);
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string NetErrorString(net::Error net_error) {
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ErrorToString(NetError(net_error), false);
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NetErrorHelperCoreTest : public testing::Test,
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               public NetErrorHelperCore::Delegate {
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NetErrorHelperCoreTest() : timer_(NULL),
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             update_count_(0),
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             error_html_update_count_(0),
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             reload_count_(0),
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             load_stale_count_(0),
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             enable_page_helper_functions_count_(0),
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             default_url_(GURL(kFailedUrl)),
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             error_url_(GURL(content::kUnreachableWebDataURL)),
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             tracking_request_count_(0) {
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SetUpCore(false, false, true);
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~NetErrorHelperCoreTest() {
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // No test finishes while an error page is being fetched.
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(is_url_being_fetched());
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::StatisticsRecorder::Initialize();
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SetUpCore(bool auto_reload_enabled,
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 bool auto_reload_visible_only,
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 bool visible) {
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // The old value of timer_, if any, will be freed by the old core_ being
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // destructed, since core_ takes ownership of the timer.
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    timer_ = new base::MockTimer(false, false);
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core_.reset(new NetErrorHelperCore(this,
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       auto_reload_enabled,
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       auto_reload_visible_only,
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       visible));
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core_->set_timer_for_testing(scoped_ptr<base::Timer>(timer_));
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NetErrorHelperCore* core() { return core_.get(); }
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GURL& url_being_fetched() const { return url_being_fetched_; }
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool is_url_being_fetched() const { return !url_being_fetched_.is_empty(); }
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int reload_count() const {
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return reload_count_;
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int load_stale_count() const {
1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return load_stale_count_;
1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const GURL& load_stale_url() const {
1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return load_stale_url_;
1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL& default_url() const {
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return default_url_;
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL& error_url() const {
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return error_url_;
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int enable_page_helper_functions_count() const {
2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return enable_page_helper_functions_count_;
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string& last_update_string() const { return last_update_string_; }
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int update_count() const { return update_count_;  }
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string& last_error_html() const { return last_error_html_; }
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int error_html_update_count() const { return error_html_update_count_; }
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
216a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const LocalizedError::ErrorPageParams* last_error_page_params() const {
217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return last_error_page_params_.get();
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GURL& last_tracking_url() const { return last_tracking_url_; }
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const std::string& last_tracking_request_body() const {
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return last_tracking_request_body_;
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int tracking_request_count() const { return tracking_request_count_; }
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
226a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::MockTimer* timer() { return timer_; }
227a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void NavigationCorrectionsLoadSuccess(
229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const NavigationCorrection* corrections, int num_corrections) {
230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    NavigationCorrectionsLoadFinished(
231a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        SuggestionsToResponse(corrections, num_corrections));
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
234a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void NavigationCorrectionsLoadFailure() {
235a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    NavigationCorrectionsLoadFinished("");
236a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void NavigationCorrectionsLoadFinished(const std::string& result) {
239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    url_being_fetched_ = GURL();
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnNavigationCorrectionsFetched(result, "en", false);
241a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void DoErrorLoad(net::Error error) {
24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       NetErrorHelperCore::NON_ERROR_PAGE);
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    std::string html;
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        NetError(error), false, &html);
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(html.empty());
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(NetErrorString(error), html);
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       NetErrorHelperCore::ERROR_PAGE);
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME,
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        error_url());
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void DoSuccessLoad() {
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       NetErrorHelperCore::NON_ERROR_PAGE);
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void DoDnsProbe(chrome_common_net::DnsProbeStatus final_status) {
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnNetErrorInfo(final_status);
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void EnableNavigationCorrections() {
272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetNavigationCorrectionURL(GURL(kNavigationCorrectionUrl));
273a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
274a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
275a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void DisableNavigationCorrections() {
276a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetNavigationCorrectionURL(GURL());
277a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void ExpectDefaultNavigationCorrections() const {
280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Checks that the last error page params correspond to kDefaultSuggestions.
281a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(last_error_page_params());
282a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_TRUE(last_error_page_params()->suggest_reload);
283a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(2u, last_error_page_params()->override_suggestions->GetSize());
284a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(GURL(kSearchUrl), last_error_page_params()->search_url);
285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(kSuggestedSearchTerms, last_error_page_params()->search_terms);
286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
287a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void SetNavigationCorrectionURL(const GURL& navigation_correction_url) {
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->OnSetNavigationCorrectionInfo(navigation_correction_url,
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         kLanguage, kCountry, kApiKey,
292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                         GURL(kSearchUrl));
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NetErrorHelperCore::Delegate implementation:
296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void GenerateLocalizedErrorPage(
297a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const WebURLError& error,
298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      bool is_failed_post,
299a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      scoped_ptr<LocalizedError::ErrorPageParams> params,
3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      bool* reload_button_shown,
3010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      bool* load_stale_button_shown,
302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      std::string* html) const OVERRIDE {
303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_error_page_params_.reset(params.release());
3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    *reload_button_shown = false;
3050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    *load_stale_button_shown = false;
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *html = ErrorToString(error, is_failed_post);
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void LoadErrorPageInMainFrame(const std::string& html,
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const GURL& failed_url) OVERRIDE {
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    error_html_update_count_++;
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    last_error_html_ = html;
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void EnablePageHelperFunctions() OVERRIDE {
3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    enable_page_helper_functions_count_++;
317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
318effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void UpdateErrorPage(const WebURLError& error,
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               bool is_failed_post) OVERRIDE {
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    update_count_++;
322a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    last_error_page_params_.reset(NULL);
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    last_error_html_ = ErrorToString(error, is_failed_post);
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
326a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void FetchNavigationCorrections(
327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const GURL& navigation_correction_url,
328a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& navigation_correction_request_body) OVERRIDE {
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(url_being_fetched_.is_empty());
330a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_TRUE(request_body_.empty());
331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(GURL(kNavigationCorrectionUrl), navigation_correction_url);
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
333a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    url_being_fetched_ = navigation_correction_url;
334a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    request_body_ = navigation_correction_request_body;
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Check the body of the request.
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::JSONReader reader;
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<base::Value> parsed_body(reader.Read(
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        navigation_correction_request_body));
341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ASSERT_TRUE(parsed_body);
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::DictionaryValue* dict = NULL;
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ASSERT_TRUE(parsed_body->GetAsDictionary(&dict));
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(StringValueEquals(*dict, "params.urlQuery", kFailedUrl));
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(StringValueEquals(*dict, "params.language", kLanguage));
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(StringValueEquals(*dict, "params.originCountry", kCountry));
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(StringValueEquals(*dict, "params.key", kApiKey));
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
351a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void CancelFetchNavigationCorrections() OVERRIDE {
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    url_being_fetched_ = GURL();
353a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    request_body_.clear();
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void ReloadPage() OVERRIDE {
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    reload_count_++;
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void LoadPageFromCache(const GURL& error_url) OVERRIDE {
3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    load_stale_count_++;
3620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    load_stale_url_ = error_url;
3630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SendTrackingRequest(
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const GURL& tracking_url,
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& tracking_request_body) OVERRIDE {
368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    last_tracking_url_ = tracking_url;
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    last_tracking_request_body_ = tracking_request_body;
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    tracking_request_count_++;
371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Check the body of the request.
373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::JSONReader reader;
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<base::Value> parsed_body(reader.Read(tracking_request_body));
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ASSERT_TRUE(parsed_body);
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::DictionaryValue* dict = NULL;
378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ASSERT_TRUE(parsed_body->GetAsDictionary(&dict));
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(StringValueEquals(*dict, "params.originalUrlQuery",
381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  kFailedUrl));
382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(StringValueEquals(*dict, "params.language", kLanguage));
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(StringValueEquals(*dict, "params.originCountry", kCountry));
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(StringValueEquals(*dict, "params.key", kApiKey));
385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::MockTimer* timer_;
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<NetErrorHelperCore> core_;
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url_being_fetched_;
392a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string request_body_;
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Contains the information passed to the last call to UpdateErrorPage, as a
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // string.
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string last_update_string_;
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Number of times |last_update_string_| has been changed.
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int update_count_;
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Contains the HTML set by the last call to LoadErrorPageInMainFrame.
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string last_error_html_;
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Number of times |last_error_html_| has been changed.
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int error_html_update_count_;
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
405a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Mutable because GenerateLocalizedErrorPage is const.
406a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  mutable scoped_ptr<LocalizedError::ErrorPageParams> last_error_page_params_;
407a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int reload_count_;
4090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int load_stale_count_;
4100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GURL load_stale_url_;
411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
4120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int enable_page_helper_functions_count_;
413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL default_url_;
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL error_url_;
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GURL last_tracking_url_;
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string last_tracking_request_body_;
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int tracking_request_count_;
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//------------------------------------------------------------------------------
423a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Basic tests that don't update the error page for probes or load navigation
424a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// corrections.
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//------------------------------------------------------------------------------
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, Null) {
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, SuccessfulPageLoad) {
43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
439a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, SuccessfulPageLoadWithNavigationCorrections) {
440a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
44146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
44346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
44446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, MainFrameNonDnsError) {
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
45146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_RESET), false, &html);
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page.
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(html.empty());
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_CONNECTION_RESET), html);
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
4630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0, enable_page_helper_functions_count());
46446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
46646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
4700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1, enable_page_helper_functions_count());
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
473a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, MainFrameNonDnsErrorWithCorrections) {
474a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
47746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_RESET), false, &html);
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page.
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(html.empty());
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_CONNECTION_RESET), html);
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
49246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Much like above tests, but with a bunch of spurious DNS status messages that
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// should have no effect.
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, MainFrameNonDnsErrorSpuriousStatus) {
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
50146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_RESET),
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page.
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(html.empty());
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_CONNECTION_RESET),  html);
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
51846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
52046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
52246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
52346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
52546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
52646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, SubFrameDnsError) {
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page.
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), html);
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
54646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::SUB_FRAME, error_url());
54946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::SUB_FRAME);
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
554a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, SubFrameDnsErrorWithCorrections) {
555a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
55846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
56346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page.
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), html);
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
57046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
57246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::SUB_FRAME, error_url());
57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::SUB_FRAME);
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Much like above tests, but with a bunch of spurious DNS status messages that
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// should have no effect.
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, SubFrameDnsErrorSpuriousStatus) {
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
58246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page.
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), html);
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
59846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
60046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
60246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::SUB_FRAME, error_url());
60346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
60546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::SUB_FRAME);
60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//------------------------------------------------------------------------------
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests for updating the error page in response to DNS probe results.  None
614a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// of these have navigation corrections enabled.
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//------------------------------------------------------------------------------
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test case where the error page finishes loading before receiving any DNS
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// probe messages.
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbe) {
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
63346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
63546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
63646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
64446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Any other probe updates should be ignored.
65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
65146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Same as above, but the probe is not run.
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbeNotRun) {
6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
65946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
66446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
67146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
67346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
67446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When the not run status arrives, the page should revert to the normal dns
6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // error page.
67946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_NOT_RUN);
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Any other probe updates should be ignored.
68446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
68546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Same as above, but the probe result is inconclusive.
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbeInconclusive) {
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
69346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
69846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
70546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
70746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
70846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
71146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When the inconclusive status arrives, the page should revert to the normal
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // dns error page.
71846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE);
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Any other probe updates should be ignored.
72346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE);
7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Same as above, but the probe result is no internet.
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbeNoInternet) {
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
73146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
73646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
74346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
74546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
74646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
74946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When the inconclusive status arrives, the page should revert to the normal
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // dns error page.
75646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET),
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Any other probe updates should be ignored.
76246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Same as above, but the probe result is bad config.
7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbeBadConfig) {
7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
77046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
77546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
78246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
78446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
78546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
78846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When the inconclusive status arrives, the page should revert to the normal
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // dns error page.
79546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG);
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG),
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Any other probe updates should be ignored.
80146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG);
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test case where the error page finishes loading after receiving the start
8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DNS probe message.
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, FinishedAfterStartProbe) {
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
81046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
81546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
82246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
82446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Nothing should be done when a probe status comes in before loading
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // finishes.
82846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When loading finishes, however, the buffered probe status should be sent
8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // to the page.
83346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should update the page again when the probe result comes in.
83946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Any other probe updates should be ignored.
84546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_NOT_RUN);
8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test case where the error page finishes loading before receiving any DNS
8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// probe messages and the request is a POST.
8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbePost) {
8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
85346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
85846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      true, &html);
8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ErrorToString(
8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ProbeError(chrome_common_net::DNS_PROBE_POSSIBLE),
8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           true),
8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            html);
8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
8680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0, enable_page_helper_functions_count());
86946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
87146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
87246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
8740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1, enable_page_helper_functions_count());
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
87646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ErrorToString(
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ProbeError(chrome_common_net::DNS_PROBE_STARTED), true),
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
88246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ErrorToString(
8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ProbeError(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           true),
8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test case where the probe finishes before the page is committed.
8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, ProbeFinishesEarly) {
8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
89446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
89946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page starts loading.
90646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Nothing should be done when the probe statuses come in before loading
9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // finishes.
91146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
91246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
91546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When loading finishes, however, the buffered probe status should be sent
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // to the page.
92046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Any other probe updates should be ignored.
92646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
92746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test case where one error page loads completely before a new navigation
9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// results in another error page.  Probes are run for both pages.
9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, TwoErrorsWithProbes) {
9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
93546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
94046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
9445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
9455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
94746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
94946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
95046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe results come in.
95346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
95446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The process starts again.
9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Normal page starts loading.
96246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
96646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
97346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
97546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
97646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
97946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, update_count());
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The probe returns a different result this time.
98546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(4, update_count());
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET),
9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test case where one error page loads completely before a new navigation
9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// results in another error page.  Probe results for the first probe are only
9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// received after the second load starts, but before it commits.
9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, TwoErrorsWithProbesAfterSecondStarts) {
9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
99746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
100246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
10075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
100946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
10105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
101146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
101246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
10135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The process starts again.
10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Normal page starts loading.
101746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
10195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
102146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
10265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page starts to load.
102846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe results come in, and the first page is updated.
103246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
103346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
10345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
10375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Second page finishes loading, and is updated using the same probe result.
103946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
104046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, update_count());
10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
10435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
10445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Other probe results should be ignored.
104646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
10475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, update_count());
10485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Same as above, but a new page is loaded before the error page commits.
10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, ErrorPageLoadInterrupted) {
10535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
105446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
10555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
10565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails, and an error page is requested.
10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
105946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page starts loading.
106646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe statuses come in, but should be ignored.
106946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
107046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A new navigation begins while the error page is loading.
107446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // And fails.
107846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Should have returned a local error page indicating a probe may run.
10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page finishes loading.
108546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
108646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe results come in.
108946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
10905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
10935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
109446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET),
10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//------------------------------------------------------------------------------
1102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Navigation correction tests.
11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//------------------------------------------------------------------------------
11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Check that corrections are not used for HTTPS URLs.
1106a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, NoCorrectionsForHttps) {
11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
110946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The HTTPS page fails to load.
11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  blink::WebURLError error = NetError(net::ERR_NAME_NOT_RESOLVED);
11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error.unreachableURL = GURL(kFailedHttpsUrl);
111646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME, error, false, &html);
11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  blink::WebURLError probe_error =
11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ProbeError(chrome_common_net::DNS_PROBE_POSSIBLE);
11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  probe_error.unreachableURL = GURL(kFailedHttpsUrl);
11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ErrorToString(probe_error, false), html);
11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
1123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads, no error page is loaded.
112646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
112846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
112946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
1131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Page is updated in response to DNS probes as normal.
11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
113546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
113646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
1138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  blink::WebURLError final_probe_error =
11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ProbeError(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  final_probe_error.unreachableURL = GURL(kFailedHttpsUrl);
11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ErrorToString(final_probe_error, false), last_error_html());
11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The blank page loads, then the navigation corrections request succeeds and is
1146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// loaded.  Then the probe results come in.
1147a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsReceivedBeforeProbe) {
11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
115046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It fails.
11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
115546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
1160a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads.
116346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      NetErrorHelperCore::ERROR_PAGE);
116546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections retrieval starts when the error page finishes loading.
11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
1169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
117046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
1172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
11735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections are retrieved.
1175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadSuccess(kDefaultCorrections,
1176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   arraysize(kDefaultCorrections));
11775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
1178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
1179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ExpectDefaultNavigationCorrections();
11805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections load.
118346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      NetErrorHelperCore::ERROR_PAGE);
118546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
118646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Any probe statuses should be ignored.
118946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
119046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The blank page finishes loading, then probe results come in, and then
1197a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// the navigation corrections request succeeds.
1198a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsRetrievedAfterProbes) {
11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
120146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1204a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
12055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
120646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
12075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
12085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
12095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
12105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads.
121246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
121446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
121546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
1217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe statuses should be ignored.
122046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
122146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
12235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
1224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
12255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1226a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections are retrieved.
12275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
1228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadSuccess(kDefaultCorrections,
1229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   arraysize(kDefaultCorrections));
12305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
1231a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
1232a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ExpectDefaultNavigationCorrections();
12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
12345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections load.
123646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
12375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
123846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
123946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1244a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The corrections request fails and then the error page loads for an error that
12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// does not trigger DNS probes.
1246a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsFailLoadNoProbes) {
12475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1248a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
124946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
125446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_FAILED),
12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
12575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads.
126046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
126246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
126346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections request fails, final error page is shown.
12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
1267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadFailure();
12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(last_error_html(), NetErrorString(net::ERR_CONNECTION_FAILED));
12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
1272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Error page loads.
127546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
127746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
127846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If probe statuses come in last from another page load, they should be
12815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ignored.
128246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
128346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
12875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1288a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The corrections request fails and then the error page loads before probe
12895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// results are received.
1290a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsFailLoadBeforeProbe) {
12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
129346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
12945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
12955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
129846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads.
130446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
130646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
130746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections request fails, probe pending page shown.
13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
1311a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadFailure();
13125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
13135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(last_error_html(),
13145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE));
13155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe page loads.
131946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
132146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
132246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
13235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe statuses comes in, and page is updated.
132546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
133046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
13315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
13325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
13335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The commit results in sending a second probe status, which is ignored.
133646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1341a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The corrections request fails after receiving probe results.
1342a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsFailAfterProbe) {
13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1344a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
134546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
13475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1348a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
135046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
13545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads.
135646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
135846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
135946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Results come in, but end up being ignored.
136246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
136346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1366a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections request fails, probe pending page shown.
13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
1368a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadFailure();
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(last_error_html(),
13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE));
13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe page loads.
137646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
137846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
137946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe statuses comes in, and page is updated.
138246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
13855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
13865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
13875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// An error page load that would normally load correction is interrupted
13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// by a new navigation before the blank page commits.
1391a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsInterruptedBeforeCommit) {
13925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1393a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
139446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
13965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
139946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
14005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
14015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
14025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page starts loading.
140546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A new page load starts.
14095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
141046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
14125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A new page load interrupts the original load.
14145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
141546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
14175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
141846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
14195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
142046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
14215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
14235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
14245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
14255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
14265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1427a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// An error page load that would normally load corrections is interrupted
14285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// by a new navigation before the blank page finishes loading.
1429a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsInterruptedBeforeLoad) {
14305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1431a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
143246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1435a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
14365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
143746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
14385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
14405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
14415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page starts loading and is committed.
144346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
144546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
14465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A new page load interrupts the original load.
14485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
144946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
14515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
145246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
145446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
14555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
14575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
14585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, error_html_update_count());
14595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
14605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The corrections request is cancelled due to a new navigation.  The new
1462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// navigation fails and then loads corrections successfully.
1463a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsInterrupted) {
14645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
146646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1469a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
14705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
147146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
14725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
14735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
14745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads.
147746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
147946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
148046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
14815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
14825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Results come in, but end up being ignored.
148446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
148546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
14865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
14875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A new load appears!
148946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
14915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
14925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1493a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested again once a blank page is loaded.
149446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
14955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
14965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
14975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
149846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
14995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
150046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
150246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
15035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
15045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1505a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections request succeeds.
1506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadSuccess(kDefaultCorrections,
1507a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   arraysize(kDefaultCorrections));
15085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
1509a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
1510a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ExpectDefaultNavigationCorrections();
15115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
15125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe statuses come in, and are ignored.
151446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
151546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
15165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
15175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1519a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The corrections request is cancelled due to call to Stop().  The cross
15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// process navigation is cancelled, and then a new load fails and tries to load
1521a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// corrections again, unsuccessfully.
1522a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsStopped) {
15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Original page starts loading.
1524a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
152546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
15265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
15275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1528a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
15295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html;
153046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
15315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
15325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
15335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
15345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads.
153646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
15375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
153846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
153946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
15405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
154246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStop();
15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Results come in, but end up being ignored.
154646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
154746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
15485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, update_count());
15495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Cross process navigation must have been cancelled, and a new load appears!
155146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
15525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
15535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1554a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested again.
155546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
15575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      false, &html);
15585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(html.empty());
15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The blank page loads again.
156146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
156346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
156446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
15655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
15665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1567a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections request fails, probe pending page shown.
1568a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadFailure();
15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
15705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(last_error_html(),
15715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE));
15725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe page loads.
157546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
15765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
157746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
157846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Probe statuses comes in, and page is updated.
158146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
15825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
15845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, update_count());
15855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
158646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
15875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, update_count());
15885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
15895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            last_error_html());
15905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1593a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Check the case corrections are disabled while the blank page (Loaded
1594a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// before the corrections page) is being loaded.
1595a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsDisabledBeforeFetch) {
1596a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Original page starts loading.
1597a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
159846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::NON_ERROR_PAGE);
1600a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1601a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
1602a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string html;
160346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
1604a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      NetError(net::ERR_NAME_NOT_RESOLVED),
1605a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      false, &html);
1606a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(html.empty());
1607a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1608a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The blank page loads.
160946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1610a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
1611a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections is disabled.
1612a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DisableNavigationCorrections();
161346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
161446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1615a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(is_url_being_fetched());
1616a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
1617a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1618a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections are retrieved.
1619a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadSuccess(kDefaultCorrections,
1620a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   arraysize(kDefaultCorrections));
1621a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1622a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
1623a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(is_url_being_fetched());
1624a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ExpectDefaultNavigationCorrections();
1625a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1626a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections load.
162746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1628a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
162946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
163046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1631a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1632a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0, update_count());
1633a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1634a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1635a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Check the case corrections is disabled while fetching the corrections for
1636a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// a failed page load.
1637a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsDisabledDuringFetch) {
1638a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Original page starts loading.
1639a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
164046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1641a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::NON_ERROR_PAGE);
1642a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1643a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
1644a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string html;
164546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
1646a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      NetError(net::ERR_NAME_NOT_RESOLVED),
1647a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      false, &html);
1648a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(html.empty());
1649a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1650a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The blank page loads.
165146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1652a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
165346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
165446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1655a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(is_url_being_fetched());
1656a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
1657a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1658a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections are disabled.
1659a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DisableNavigationCorrections();
1660a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1661a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections are retrieved.
1662a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadSuccess(kDefaultCorrections,
1663a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   arraysize(kDefaultCorrections));
1664a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1665a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
1666a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(is_url_being_fetched());
1667a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ExpectDefaultNavigationCorrections();
1668a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1669a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections load.
167046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1671a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
167246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
167346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1674a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1675a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0, update_count());
1676a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1677a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1678a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Checks corrections are is used when there are no search suggestions.
1679a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsWithoutSearch) {
1680a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const NavigationCorrection kCorrections[] = {
1681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"urlCorrection", "http://somewhere_else/", "btn", "data", false, false},
1682a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
1683a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1684a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Original page starts loading.
1685a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
168646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1687a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::NON_ERROR_PAGE);
1688a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1689a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
1690a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string html;
169146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
1692a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      NetError(net::ERR_NAME_NOT_RESOLVED),
1693a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      false, &html);
1694a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(html.empty());
1695a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1696a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The blank page loads.
169746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1698a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
169946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
170046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1701a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(is_url_being_fetched());
1702a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
1703a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1704a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections are retrieved.
1705a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadSuccess(kCorrections, arraysize(kCorrections));
1706a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1707a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
1708a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(is_url_being_fetched());
1709a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1710a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Check params.
1711a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(last_error_page_params());
1712a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params()->suggest_reload);
1713a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1u, last_error_page_params()->override_suggestions->GetSize());
1714a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params()->search_url.is_valid());
1715a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("", last_error_page_params()->search_terms);
1716a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1717a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections load.
171846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1719a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
172046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
172146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1722a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1723a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0, update_count());
1724a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1725a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1726a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Checks corrections are used when there are only search suggestions.
1727a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionsOnlySearchSuggestion) {
1728a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const NavigationCorrection kCorrections[] = {
1729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"webSearchQuery", kSuggestedSearchTerms, "frm", "data", false, false},
1730a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
1731a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1732a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Original page starts loading.
1733a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
173446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1735a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::NON_ERROR_PAGE);
1736a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1737a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
1738a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string html;
173946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
1740a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      NetError(net::ERR_NAME_NOT_RESOLVED),
1741a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      false, &html);
1742a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(html.empty());
1743a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1744a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The blank page loads.
174546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1746a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
174746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
174846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1749a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(is_url_being_fetched());
1750a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
1751a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1752a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections are retrieved.
1753a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadSuccess(kCorrections, arraysize(kCorrections));
1754a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1755a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
1756a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(is_url_being_fetched());
1757a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1758a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Check params.
1759a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(last_error_page_params());
1760a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params()->suggest_reload);
1761a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0u, last_error_page_params()->override_suggestions->GetSize());
1762a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(GURL(kSearchUrl), last_error_page_params()->search_url);
1763a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(kSuggestedSearchTerms, last_error_page_params()->search_terms);
1764a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1765a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections load.
176646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1767a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
176846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
176946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1770a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1771a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0, update_count());
1772a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1773a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1774a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The correction service returns a non-JSON result.
1775a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionServiceReturnsNonJsonResult) {
1776a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Original page starts loading.
1777a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
177846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1779a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::NON_ERROR_PAGE);
1780a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1781a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
1782a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string html;
178346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
1784a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      NetError(net::ERR_CONNECTION_FAILED),
1785a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      false, &html);
1786a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(html.empty());
1787a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1788a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The blank page loads.
178946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1790a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
179146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
179246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1793a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1794a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections request fails, final error page is shown.
1795a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(is_url_being_fetched());
1796a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadFinished("Weird Response");
1797a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1798a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(last_error_html(), NetErrorString(net::ERR_CONNECTION_FAILED));
1799a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(is_url_being_fetched());
1800a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0, update_count());
1801a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
1802a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1803a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Error page loads.
180446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1805a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
180646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
180746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1808a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1809a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1810a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The correction service returns a JSON result that isn't a valid list of
1811a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// corrections.
1812a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(NetErrorHelperCoreTest, CorrectionServiceReturnsInvalidJsonResult) {
1813a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Original page starts loading.
1814a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EnableNavigationCorrections();
181546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1816a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::NON_ERROR_PAGE);
1817a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1818a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It fails, and corrections are requested.
1819a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string html;
182046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
1821a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      NetError(net::ERR_CONNECTION_FAILED),
1822a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      false, &html);
1823a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(html.empty());
1824a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1825a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The blank page loads.
182646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1827a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
182846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
182946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1830a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1831a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Corrections request fails, final error page is shown.
1832a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(is_url_being_fetched());
1833a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NavigationCorrectionsLoadFinished("{\"result\": 42}");
1834a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1, error_html_update_count());
1835a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(last_error_html(), NetErrorString(net::ERR_CONNECTION_FAILED));
1836a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(is_url_being_fetched());
1837a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0, update_count());
1838a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(last_error_page_params());
1839a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1840a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Error page loads.
184146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1842a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     NetErrorHelperCore::ERROR_PAGE);
184346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
184446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1845a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1846a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(NetErrorHelperCoreTest, CorrectionClickTracking) {
1848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Go through the standard navigation correction steps.
1849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Original page starts loading.
1851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EnableNavigationCorrections();
185246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
1854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // It fails.
1856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string html;
185746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
1858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      NetError(net::ERR_NAME_NOT_RESOLVED),
1859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      false, &html);
1860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(html.empty());
1861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
1862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(last_error_page_params());
1863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The blank page loads.
186546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      NetErrorHelperCore::ERROR_PAGE);
186746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
1868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Corrections retrieval starts when the error page finishes loading.
1870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
1871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(last_error_page_params());
187246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(is_url_being_fetched());
1874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(last_error_page_params());
1875010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Corrections are retrieved.
1877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NavigationCorrectionsLoadSuccess(kDefaultCorrections,
1878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   arraysize(kDefaultCorrections));
1879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
1880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
1881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ExpectDefaultNavigationCorrections();
1882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(is_url_being_fetched());
1883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Corrections load.
188546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
1886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      NetErrorHelperCore::ERROR_PAGE);
188746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
188846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
1889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, tracking_request_count());
1891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Invalid clicks should be ignored.
189346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->TrackClick(-1);
189446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->TrackClick(arraysize(kDefaultCorrections));
1895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, tracking_request_count());
1896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kDefaultCorrections); ++i) {
1898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Skip links that do not appear in the page.
1899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (kDefaultCorrections[i].is_porn || kDefaultCorrections[i].is_soft_porn)
1900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      continue;
1901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    int old_tracking_request_count = tracking_request_count();
190346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->TrackClick(i);
1904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(old_tracking_request_count + 1, tracking_request_count());
1905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GURL(kNavigationCorrectionUrl), last_tracking_url());
1906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Make sure all expected strings appear in output.
1908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(last_tracking_request_body().find(
1909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    kDefaultCorrections[i].url_correction));
1910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(last_tracking_request_body().find(
1911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    kDefaultCorrections[i].click_data));
1912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(last_tracking_request_body().find(
1913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    kDefaultCorrections[i].click_type));
1914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(last_tracking_request_body().find(
1915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    kNavigationCorrectionEventId));
1916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_TRUE(last_tracking_request_body().find(
1917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    kNavigationCorrectionFingerprint));
1918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1919010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Make sure duplicate tracking requests are ignored.
1921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kDefaultCorrections); ++i) {
1922010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Skip links that do not appear in the page.
1923010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (kDefaultCorrections[i].is_porn || kDefaultCorrections[i].is_soft_porn)
1924010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      continue;
1925010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1926010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    int old_tracking_request_count = tracking_request_count();
192746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->TrackClick(i);
1928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(old_tracking_request_count, tracking_request_count());
1929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1930010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, update_count());
1932010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, error_html_update_count());
1933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1935a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(NetErrorHelperCoreTest, AutoReloadDisabled) {
1936a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
1937a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1938a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
1939a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, reload_count());
1940a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1941a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
194246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class NetErrorHelperCoreAutoReloadTest : public NetErrorHelperCoreTest {
194346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
194446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void SetUp() {
194546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    NetErrorHelperCoreTest::SetUp();
194646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SetUpCore(true, false, true);
194746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
194846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
194946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
195046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, Succeeds) {
1951a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
1952a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1953a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
1954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, reload_count());
1955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1956a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
1957a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
1958a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, reload_count());
1959a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoSuccessLoad();
1961a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1962a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
1963a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1964a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
196546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, Retries) {
1966a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
1967a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1968a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
1969a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeDelta first_delay = timer()->GetCurrentDelay();
1970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, reload_count());
1971a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1972a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
1973a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
1974a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, reload_count());
1975a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
1977a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1978a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
1979a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_GT(timer()->GetCurrentDelay(), first_delay);
1980a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1981a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
198246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, StopsTimerOnStop) {
1983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
1984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
198546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStop();
1986a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
1987a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1988a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
198946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, StopsLoadingOnStop) {
1990a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
199146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, core()->auto_reload_count());
1992a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
199346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1, core()->auto_reload_count());
1994a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, reload_count());
199546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStop();
1996a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
199746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, core()->auto_reload_count());
1998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1999a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
200046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, StopsOnOtherLoadStart) {
2001a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2002a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
200346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2004a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
2005a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
200646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, core()->auto_reload_count());
2007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
200946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, ResetsCountOnSuccess) {
2010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2011a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeDelta delay = timer()->GetCurrentDelay();
201246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, core()->auto_reload_count());
2013a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
201446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1, core()->auto_reload_count());
2015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, reload_count());
2016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoSuccessLoad();
2017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
201846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, core()->auto_reload_count());
2019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(timer()->GetCurrentDelay(), delay);
2020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
202146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1, core()->auto_reload_count());
2022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2, reload_count());
2023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoSuccessLoad();
202446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, core()->auto_reload_count());
2025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
202746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, RestartsOnOnline) {
2028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeDelta delay = timer()->GetCurrentDelay();
2030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
2031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
2033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_NE(delay, timer()->GetCurrentDelay());
203446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
2035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
203646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
2038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(delay, timer()->GetCurrentDelay());
2039a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2040a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
204146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, DoesNotStartOnOnline) {
2042a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2043a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
2044a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoSuccessLoad();
2045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
204646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2047a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
2048a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2049a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
205046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, DoesNotStartOffline) {
205146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
2052a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2053a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
205446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2055a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
2056a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2057a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
205846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, DoesNotRestartOnOnlineAfterStop) {
2059a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
206146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStop();
206246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2063a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
2064a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2065a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
206646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, WithDnsProbes) {
2067a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoDnsProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
2069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  timer()->Fire();
2070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, reload_count());
2071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
207346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, ExponentialBackoffLevelsOff) {
2074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeDelta previous = base::TimeDelta::FromMilliseconds(0);
2075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int kMaxTries = 50;
2076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int tries = 0;
2077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (tries = 0; tries < kMaxTries; tries++) {
2078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DoErrorLoad(net::ERR_CONNECTION_RESET);
2079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(timer()->IsRunning());
2080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (previous == timer()->GetCurrentDelay())
2081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
2082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    previous = timer()->GetCurrentDelay();
2083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    timer()->Fire();
2084a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_LT(tries, kMaxTries);
2087a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
208946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, SlowError) {
209046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
2092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string html;
209346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
2094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_RESET), false, &html);
209546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
209746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
2098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
2099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Start a new non-error page load.
210046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
2102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
2103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Finish the error page load.
210446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
2105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
210646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
210746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
2108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
2109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
211146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, OnlineSlowError) {
211246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
211346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
2115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string html;
211646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
2117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_RESET), false, &html);
211846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
212046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
2121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
212246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
212446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
212546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
2126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
212746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
2129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
213146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, OnlinePendingError) {
213246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
213346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
2135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string html;
213646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
2137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_RESET), false, &html);
213846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
2140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
214146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
214346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
214446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
214546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
2146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
214746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
2149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
215146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, OnlinePartialErrorReplacement) {
215246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
215346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
2155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string html;
215646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
2157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_RESET), false, &html);
215846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
216046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
216146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
216246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
216446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
2165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      NetError(net::ERR_CONNECTION_RESET), false, &html);
216646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     NetErrorHelperCore::ERROR_PAGE);
2168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
216946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
217046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
217146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
217246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
217346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, ShouldSuppressNonReloadableErrorPage) {
217446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DoErrorLoad(net::ERR_ABORTED);
217546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
217646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                              GURL(kFailedUrl)));
217746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
217846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
217946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, ShouldSuppressErrorPage) {
218046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Set up the environment to test ShouldSuppressErrorPage: auto-reload is
218146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // enabled, an error page is loaded, and the auto-reload callback is running.
218246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
218346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  timer()->Fire();
218446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
218546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::SUB_FRAME,
218646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                              GURL(kFailedUrl)));
218746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
218846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                              GURL("http://some.other.url")));
218946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
219046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                             GURL(kFailedUrl)));
219146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
219246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
219346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, HiddenAndShown) {
219446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetUpCore(true, true, true);
219546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
219646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
219746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnWasHidden();
219846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
219946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnWasShown();
220046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
220146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
220246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
220346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, HiddenWhileOnline) {
220446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetUpCore(true, true, true);
220546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
220646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
220746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
220846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnWasHidden();
220946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
221046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
221146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
221246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnWasShown();
221346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
221446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
221546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
221646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(false);
221746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnWasHidden();
221846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
221946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->NetworkStateChanged(true);
2220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
222146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnWasShown();
222246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
222346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
222446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
222546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(NetErrorHelperCoreAutoReloadTest, ShownWhileNotReloading) {
222646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetUpCore(true, true, false);
222746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
222846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(timer()->IsRunning());
222946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnWasShown();
223046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(timer()->IsRunning());
2231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
223346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class NetErrorHelperCoreHistogramTest
223446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public NetErrorHelperCoreAutoReloadTest {
2235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
2236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
223746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    NetErrorHelperCoreAutoReloadTest::SetUp();
2238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const char kCountAtStop[];
2241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const char kErrorAtStop[];
2242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const char kCountAtSuccess[];
2243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const char kErrorAtSuccess[];
2244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const char kErrorAtFirstSuccess[];
2245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
224603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) protected:
224703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::HistogramTester histogram_tester_;
2248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
2249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char NetErrorHelperCoreHistogramTest::kCountAtStop[] =
2251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "Net.AutoReload.CountAtStop";
2252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char NetErrorHelperCoreHistogramTest::kErrorAtStop[] =
2253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "Net.AutoReload.ErrorAtStop";
2254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char NetErrorHelperCoreHistogramTest::kCountAtSuccess[] =
2255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "Net.AutoReload.CountAtSuccess";
2256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char NetErrorHelperCoreHistogramTest::kErrorAtSuccess[] =
2257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "Net.AutoReload.ErrorAtSuccess";
2258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char NetErrorHelperCoreHistogramTest::kErrorAtFirstSuccess[] =
2259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "Net.AutoReload.ErrorAtFirstSuccess";
2260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that the success histograms are updated when auto-reload succeeds at the
2262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// first attempt, and that the failure histograms are not updated.
2263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, SuccessAtFirstAttempt) {
2264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer()->Fire();
2266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoSuccessLoad();
2267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // All of CountAtSuccess, ErrorAtSuccess, and ErrorAtFirstSuccess should
2269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // reflect this successful load. The failure histograms should be unchanged.
227003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1);
227103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1);
227203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1);
227303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
227403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
2275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that the success histograms are updated when auto-reload succeeds but
2278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// not on the first attempt, and that the first-success histogram is not
2279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// updated.
2280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, SuccessAtSecondAttempt) {
2281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer()->Fire();
228346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
2284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             default_url()));
2285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//  DoErrorLoad(net::ERR_CONNECTION_RESET);
2286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer()->Fire();
2287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoSuccessLoad();
2288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // CountAtSuccess and ErrorAtSuccess should reflect this successful load, but
2290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // not ErrorAtFirstSuccess since it wasn't a first success.
229103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1);
229203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1);
229303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
229403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
229503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
2296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that a user stop (caused by the user pressing the 'Stop' button)
2299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// registers as an auto-reload failure if an auto-reload attempt is in flight.
2300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Note that "user stop" is also caused by a cross-process navigation, for which
2301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// the browser process will send an OnStop to the old process.
2302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, UserStop) {
2303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer()->Fire();
230546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
230746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStop();
2308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // CountAtStop and ErrorAtStop should reflect the failure.
231003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
231103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
231203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
231303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 1);
231403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 1);
2315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that a user stop (caused by the user pressing the 'Stop' button)
2318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// registers as an auto-reload failure even if an auto-reload attempt has not
2319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// been launched yet (i.e., if the timer is running, but no reload is in
2320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// flight), because this means auto-reload didn't successfully replace the error
2321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// page.
2322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, OtherPageLoaded) {
2323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
232446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
232646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStop();
2327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
232803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
232903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
233003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
233103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 1);
233203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 1);
2333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that a commit of a different URL (caused by the user navigating to a
2336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// different page) with an auto-reload attempt in flight registers as an
2337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// auto-reload failure.
2338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, OtherPageLoadedAfterTimerFires) {
2339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL kTestUrl("https://anotherurl");
2340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer()->Fire();
234246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
234446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME,
2345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      kTestUrl);
234646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
2347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
234803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
234903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
235003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
235103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 1);
235203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 1);
2353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that a commit of the same URL with an auto-reload attempt in flight
2356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// registers as an auto-reload success.
2357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, SamePageLoadedAfterTimerFires) {
2358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer()->Fire();
2360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoSuccessLoad();
2361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
236203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1);
236303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1);
236403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1);
236503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
236603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
2367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, SamePageLoadedAfterLoadStarts) {
2370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer()->Fire();
2372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Autoreload attempt starts
237346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
2375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // User does a manual reload
2376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoSuccessLoad();
2377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
237803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1);
237903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1);
238003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1);
238103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
238203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
2383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// In this test case, the user presses the reload button manually after an
2386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// auto-reload fails and the error page is suppressed.
2387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, ErrorPageLoadedAfterTimerFires) {
2388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer()->Fire();
239046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
239246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
2393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             default_url()));
2394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
2395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
239603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
239703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
239803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
239903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
240003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
2401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NetErrorHelperCoreHistogramTest, SuccessPageLoadedBeforeTimerFires) {
2404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoErrorLoad(net::ERR_CONNECTION_RESET);
240546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
2406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     NetErrorHelperCore::NON_ERROR_PAGE);
240746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME,
2408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      GURL(kFailedHttpsUrl));
2409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
241003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
241103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
241203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
241303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kCountAtStop, 1);
241403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  histogram_tester_.ExpectTotalCount(kErrorAtStop, 1);
2415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
2416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
24180529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(NetErrorHelperCoreTest, ExplicitReloadSucceeds) {
24190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DoErrorLoad(net::ERR_CONNECTION_RESET);
24200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0, reload_count());
242146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->ExecuteButtonPress(NetErrorHelperCore::RELOAD_BUTTON);
24220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1, reload_count());
24230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
24240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
24250529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(NetErrorHelperCoreTest, ExplicitLoadStaleSucceeds) {
24260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DoErrorLoad(net::ERR_CONNECTION_RESET);
24270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0, load_stale_count());
242846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core()->ExecuteButtonPress(NetErrorHelperCore::LOAD_STALE_BUTTON);
24290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1, load_stale_count());
24300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(GURL(kFailedUrl), load_stale_url());
24310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace
2434