Home | History | Annotate | Download | only in net
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/renderer/net/net_error_helper_core.h"
      6 
      7 #include <map>
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/json/json_reader.h"
     12 #include "base/json/json_writer.h"
     13 #include "base/logging.h"
     14 #include "base/metrics/statistics_recorder.h"
     15 #include "base/strings/stringprintf.h"
     16 #include "base/test/histogram_tester.h"
     17 #include "base/timer/mock_timer.h"
     18 #include "base/timer/timer.h"
     19 #include "base/values.h"
     20 #include "chrome/common/net/net_error_info.h"
     21 #include "content/public/common/url_constants.h"
     22 #include "net/base/net_errors.h"
     23 #include "testing/gtest/include/gtest/gtest.h"
     24 #include "third_party/WebKit/public/platform/WebURLError.h"
     25 #include "url/gurl.h"
     26 
     27 namespace {
     28 
     29 using blink::WebURLError;
     30 using chrome_common_net::DnsProbeStatus;
     31 using chrome_common_net::DnsProbeStatusToString;
     32 
     33 const char kFailedUrl[] = "http://failed/";
     34 const char kFailedHttpsUrl[] = "https://failed/";
     35 
     36 const char kNavigationCorrectionUrl[] = "http://navigation.corrections/";
     37 const char kLanguage[] = "en";
     38 const char kCountry[] = "us";
     39 const char kApiKey[] = "api_key";
     40 const char kSearchUrl[] = "http://www.google.com/search";
     41 
     42 const char kSuggestedSearchTerms[] = "Happy Goats";
     43 const char kNavigationCorrectionEventId[] = "#007";
     44 const char kNavigationCorrectionFingerprint[] = "RandumStuff";
     45 
     46 struct NavigationCorrection {
     47   const char* correction_type;
     48   const char* url_correction;
     49   const char* click_type;
     50   const char* click_data;
     51   bool is_porn;
     52   bool is_soft_porn;
     53 
     54   base::Value* ToValue() const {
     55     base::DictionaryValue* dict = new base::DictionaryValue();
     56     dict->SetString("correctionType", correction_type);
     57     dict->SetString("urlCorrection", url_correction);
     58     dict->SetString("clickType", click_type);
     59     dict->SetString("clickData", click_data);
     60     dict->SetBoolean("isPorn", is_porn);
     61     dict->SetBoolean("isSoftPorn", is_soft_porn);
     62     return dict;
     63   }
     64 };
     65 
     66 const NavigationCorrection kDefaultCorrections[] = {
     67   {"reloadPage", kFailedUrl, "rld", "data1", false, false},
     68   {"urlCorrection", "http://somewhere_else/", "btn", "data2", false, false},
     69   {"contentOverlap", "http://pony_island/", "btn", "data3", false, false},
     70 
     71   // Porn should be ignored.
     72   {"emphasizedUrlCorrection", "http://porn/", "btn", "data4", true, false},
     73   {"sitemap", "http://more_porn/", "btn", "data5", false, true},
     74 
     75   {"webSearchQuery", kSuggestedSearchTerms, "frm", "data6", false, false},
     76 };
     77 
     78 std::string SuggestionsToResponse(const NavigationCorrection* corrections,
     79                                   int num_corrections) {
     80   base::ListValue* url_corrections = new base::ListValue();
     81   for (int i = 0; i < num_corrections; ++i)
     82     url_corrections->Append(corrections[i].ToValue());
     83 
     84   scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue());
     85   response->Set("result.UrlCorrections", url_corrections);
     86   response->SetString("result.eventId", kNavigationCorrectionEventId);
     87   response->SetString("result.fingerprint", kNavigationCorrectionFingerprint);
     88 
     89   std::string json;
     90   base::JSONWriter::Write(response.get(), &json);
     91   return json;
     92 }
     93 
     94 testing::AssertionResult StringValueEquals(
     95     const base::DictionaryValue& dict,
     96     const std::string& key,
     97     const std::string& expected_value) {
     98   std::string actual_value;
     99   if (!dict.GetString(key, &actual_value))
    100     return testing::AssertionFailure() << key << " not found.";
    101   if (actual_value != expected_value) {
    102     return testing::AssertionFailure()
    103         << "actual: " << actual_value << "\n expected: " << expected_value;
    104   }
    105   return testing::AssertionSuccess();
    106 }
    107 
    108 // Creates a string from an error that is used as a mock locally generated
    109 // error page for that error.
    110 std::string ErrorToString(const WebURLError& error, bool is_failed_post) {
    111   return base::StringPrintf("(%s, %s, %i, %s)",
    112                             error.unreachableURL.string().utf8().c_str(),
    113                             error.domain.utf8().c_str(), error.reason,
    114                             is_failed_post ? "POST" : "NOT POST");
    115 }
    116 
    117 WebURLError ProbeError(DnsProbeStatus status) {
    118   WebURLError error;
    119   error.unreachableURL = GURL(kFailedUrl);
    120   error.domain = blink::WebString::fromUTF8(
    121       chrome_common_net::kDnsProbeErrorDomain);
    122   error.reason = status;
    123   return error;
    124 }
    125 
    126 WebURLError NetError(net::Error net_error) {
    127   WebURLError error;
    128   error.unreachableURL = GURL(kFailedUrl);
    129   error.domain = blink::WebString::fromUTF8(net::kErrorDomain);
    130   error.reason = net_error;
    131   return error;
    132 }
    133 
    134 // Convenience functions that create an error string for a non-POST request.
    135 
    136 std::string ProbeErrorString(DnsProbeStatus status) {
    137   return ErrorToString(ProbeError(status), false);
    138 }
    139 
    140 std::string NetErrorString(net::Error net_error) {
    141   return ErrorToString(NetError(net_error), false);
    142 }
    143 
    144 class NetErrorHelperCoreTest : public testing::Test,
    145                                public NetErrorHelperCore::Delegate {
    146  public:
    147   NetErrorHelperCoreTest() : timer_(NULL),
    148                              update_count_(0),
    149                              error_html_update_count_(0),
    150                              reload_count_(0),
    151                              load_stale_count_(0),
    152                              enable_page_helper_functions_count_(0),
    153                              default_url_(GURL(kFailedUrl)),
    154                              error_url_(GURL(content::kUnreachableWebDataURL)),
    155                              tracking_request_count_(0) {
    156     SetUpCore(false, false, true);
    157   }
    158 
    159   virtual ~NetErrorHelperCoreTest() {
    160     // No test finishes while an error page is being fetched.
    161     EXPECT_FALSE(is_url_being_fetched());
    162   }
    163 
    164   virtual void SetUp() OVERRIDE {
    165     base::StatisticsRecorder::Initialize();
    166   }
    167 
    168   void SetUpCore(bool auto_reload_enabled,
    169                  bool auto_reload_visible_only,
    170                  bool visible) {
    171     // The old value of timer_, if any, will be freed by the old core_ being
    172     // destructed, since core_ takes ownership of the timer.
    173     timer_ = new base::MockTimer(false, false);
    174     core_.reset(new NetErrorHelperCore(this,
    175                                        auto_reload_enabled,
    176                                        auto_reload_visible_only,
    177                                        visible));
    178     core_->set_timer_for_testing(scoped_ptr<base::Timer>(timer_));
    179   }
    180 
    181   NetErrorHelperCore* core() { return core_.get(); }
    182 
    183   const GURL& url_being_fetched() const { return url_being_fetched_; }
    184   bool is_url_being_fetched() const { return !url_being_fetched_.is_empty(); }
    185 
    186   int reload_count() const {
    187     return reload_count_;
    188   }
    189 
    190   int load_stale_count() const {
    191     return load_stale_count_;
    192   }
    193 
    194   const GURL& load_stale_url() const {
    195     return load_stale_url_;
    196   }
    197 
    198   const GURL& default_url() const {
    199     return default_url_;
    200   }
    201 
    202   const GURL& error_url() const {
    203     return error_url_;
    204   }
    205 
    206   int enable_page_helper_functions_count() const {
    207     return enable_page_helper_functions_count_;
    208   }
    209 
    210   const std::string& last_update_string() const { return last_update_string_; }
    211   int update_count() const { return update_count_;  }
    212 
    213   const std::string& last_error_html() const { return last_error_html_; }
    214   int error_html_update_count() const { return error_html_update_count_; }
    215 
    216   const LocalizedError::ErrorPageParams* last_error_page_params() const {
    217     return last_error_page_params_.get();
    218   }
    219 
    220   const GURL& last_tracking_url() const { return last_tracking_url_; }
    221   const std::string& last_tracking_request_body() const {
    222     return last_tracking_request_body_;
    223   }
    224   int tracking_request_count() const { return tracking_request_count_; }
    225 
    226   base::MockTimer* timer() { return timer_; }
    227 
    228   void NavigationCorrectionsLoadSuccess(
    229       const NavigationCorrection* corrections, int num_corrections) {
    230     NavigationCorrectionsLoadFinished(
    231         SuggestionsToResponse(corrections, num_corrections));
    232   }
    233 
    234   void NavigationCorrectionsLoadFailure() {
    235     NavigationCorrectionsLoadFinished("");
    236   }
    237 
    238   void NavigationCorrectionsLoadFinished(const std::string& result) {
    239     url_being_fetched_ = GURL();
    240     core()->OnNavigationCorrectionsFetched(result, "en", false);
    241   }
    242 
    243   void DoErrorLoad(net::Error error) {
    244     core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    245                        NetErrorHelperCore::NON_ERROR_PAGE);
    246     std::string html;
    247     core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    248                         NetError(error), false, &html);
    249     EXPECT_FALSE(html.empty());
    250     EXPECT_EQ(NetErrorString(error), html);
    251 
    252     core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    253                        NetErrorHelperCore::ERROR_PAGE);
    254     core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME,
    255                         error_url());
    256     core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    257   }
    258 
    259   void DoSuccessLoad() {
    260     core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    261                        NetErrorHelperCore::NON_ERROR_PAGE);
    262     core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
    263     core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    264   }
    265 
    266   void DoDnsProbe(chrome_common_net::DnsProbeStatus final_status) {
    267     core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    268     core()->OnNetErrorInfo(final_status);
    269   }
    270 
    271   void EnableNavigationCorrections() {
    272     SetNavigationCorrectionURL(GURL(kNavigationCorrectionUrl));
    273   }
    274 
    275   void DisableNavigationCorrections() {
    276     SetNavigationCorrectionURL(GURL());
    277   }
    278 
    279   void ExpectDefaultNavigationCorrections() const {
    280     // Checks that the last error page params correspond to kDefaultSuggestions.
    281     ASSERT_TRUE(last_error_page_params());
    282     EXPECT_TRUE(last_error_page_params()->suggest_reload);
    283     EXPECT_EQ(2u, last_error_page_params()->override_suggestions->GetSize());
    284     EXPECT_EQ(GURL(kSearchUrl), last_error_page_params()->search_url);
    285     EXPECT_EQ(kSuggestedSearchTerms, last_error_page_params()->search_terms);
    286   }
    287 
    288  private:
    289   void SetNavigationCorrectionURL(const GURL& navigation_correction_url) {
    290     core()->OnSetNavigationCorrectionInfo(navigation_correction_url,
    291                                          kLanguage, kCountry, kApiKey,
    292                                          GURL(kSearchUrl));
    293   }
    294 
    295   // NetErrorHelperCore::Delegate implementation:
    296   virtual void GenerateLocalizedErrorPage(
    297       const WebURLError& error,
    298       bool is_failed_post,
    299       scoped_ptr<LocalizedError::ErrorPageParams> params,
    300       bool* reload_button_shown,
    301       bool* load_stale_button_shown,
    302       std::string* html) const OVERRIDE {
    303     last_error_page_params_.reset(params.release());
    304     *reload_button_shown = false;
    305     *load_stale_button_shown = false;
    306     *html = ErrorToString(error, is_failed_post);
    307   }
    308 
    309   virtual void LoadErrorPageInMainFrame(const std::string& html,
    310                                         const GURL& failed_url) OVERRIDE {
    311     error_html_update_count_++;
    312     last_error_html_ = html;
    313   }
    314 
    315   virtual void EnablePageHelperFunctions() OVERRIDE {
    316     enable_page_helper_functions_count_++;
    317   }
    318 
    319   virtual void UpdateErrorPage(const WebURLError& error,
    320                                bool is_failed_post) OVERRIDE {
    321     update_count_++;
    322     last_error_page_params_.reset(NULL);
    323     last_error_html_ = ErrorToString(error, is_failed_post);
    324   }
    325 
    326   virtual void FetchNavigationCorrections(
    327       const GURL& navigation_correction_url,
    328       const std::string& navigation_correction_request_body) OVERRIDE {
    329     EXPECT_TRUE(url_being_fetched_.is_empty());
    330     EXPECT_TRUE(request_body_.empty());
    331     EXPECT_EQ(GURL(kNavigationCorrectionUrl), navigation_correction_url);
    332 
    333     url_being_fetched_ = navigation_correction_url;
    334     request_body_ = navigation_correction_request_body;
    335 
    336     // Check the body of the request.
    337 
    338     base::JSONReader reader;
    339     scoped_ptr<base::Value> parsed_body(reader.Read(
    340         navigation_correction_request_body));
    341     ASSERT_TRUE(parsed_body);
    342     base::DictionaryValue* dict = NULL;
    343     ASSERT_TRUE(parsed_body->GetAsDictionary(&dict));
    344 
    345     EXPECT_TRUE(StringValueEquals(*dict, "params.urlQuery", kFailedUrl));
    346     EXPECT_TRUE(StringValueEquals(*dict, "params.language", kLanguage));
    347     EXPECT_TRUE(StringValueEquals(*dict, "params.originCountry", kCountry));
    348     EXPECT_TRUE(StringValueEquals(*dict, "params.key", kApiKey));
    349   }
    350 
    351   virtual void CancelFetchNavigationCorrections() OVERRIDE {
    352     url_being_fetched_ = GURL();
    353     request_body_.clear();
    354   }
    355 
    356   virtual void ReloadPage() OVERRIDE {
    357     reload_count_++;
    358   }
    359 
    360   virtual void LoadPageFromCache(const GURL& error_url) OVERRIDE {
    361     load_stale_count_++;
    362     load_stale_url_ = error_url;
    363   }
    364 
    365   virtual void SendTrackingRequest(
    366       const GURL& tracking_url,
    367       const std::string& tracking_request_body) OVERRIDE {
    368     last_tracking_url_ = tracking_url;
    369     last_tracking_request_body_ = tracking_request_body;
    370     tracking_request_count_++;
    371 
    372     // Check the body of the request.
    373 
    374     base::JSONReader reader;
    375     scoped_ptr<base::Value> parsed_body(reader.Read(tracking_request_body));
    376     ASSERT_TRUE(parsed_body);
    377     base::DictionaryValue* dict = NULL;
    378     ASSERT_TRUE(parsed_body->GetAsDictionary(&dict));
    379 
    380     EXPECT_TRUE(StringValueEquals(*dict, "params.originalUrlQuery",
    381                                   kFailedUrl));
    382     EXPECT_TRUE(StringValueEquals(*dict, "params.language", kLanguage));
    383     EXPECT_TRUE(StringValueEquals(*dict, "params.originCountry", kCountry));
    384     EXPECT_TRUE(StringValueEquals(*dict, "params.key", kApiKey));
    385   }
    386 
    387   base::MockTimer* timer_;
    388 
    389   scoped_ptr<NetErrorHelperCore> core_;
    390 
    391   GURL url_being_fetched_;
    392   std::string request_body_;
    393 
    394   // Contains the information passed to the last call to UpdateErrorPage, as a
    395   // string.
    396   std::string last_update_string_;
    397   // Number of times |last_update_string_| has been changed.
    398   int update_count_;
    399 
    400   // Contains the HTML set by the last call to LoadErrorPageInMainFrame.
    401   std::string last_error_html_;
    402   // Number of times |last_error_html_| has been changed.
    403   int error_html_update_count_;
    404 
    405   // Mutable because GenerateLocalizedErrorPage is const.
    406   mutable scoped_ptr<LocalizedError::ErrorPageParams> last_error_page_params_;
    407 
    408   int reload_count_;
    409   int load_stale_count_;
    410   GURL load_stale_url_;
    411 
    412   int enable_page_helper_functions_count_;
    413 
    414   const GURL default_url_;
    415   const GURL error_url_;
    416 
    417   GURL last_tracking_url_;
    418   std::string last_tracking_request_body_;
    419   int tracking_request_count_;
    420 };
    421 
    422 //------------------------------------------------------------------------------
    423 // Basic tests that don't update the error page for probes or load navigation
    424 // corrections.
    425 //------------------------------------------------------------------------------
    426 
    427 TEST_F(NetErrorHelperCoreTest, Null) {
    428 }
    429 
    430 TEST_F(NetErrorHelperCoreTest, SuccessfulPageLoad) {
    431   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    432                      NetErrorHelperCore::NON_ERROR_PAGE);
    433   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
    434   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    435   EXPECT_EQ(0, update_count());
    436   EXPECT_EQ(0, error_html_update_count());
    437 }
    438 
    439 TEST_F(NetErrorHelperCoreTest, SuccessfulPageLoadWithNavigationCorrections) {
    440   EnableNavigationCorrections();
    441   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    442                      NetErrorHelperCore::NON_ERROR_PAGE);
    443   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
    444   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    445   EXPECT_EQ(0, update_count());
    446   EXPECT_EQ(0, error_html_update_count());
    447 }
    448 
    449 TEST_F(NetErrorHelperCoreTest, MainFrameNonDnsError) {
    450   // Original page starts loading.
    451   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    452                      NetErrorHelperCore::NON_ERROR_PAGE);
    453 
    454   // It fails, and an error page is requested.
    455   std::string html;
    456   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    457                       NetError(net::ERR_CONNECTION_RESET), false, &html);
    458   // Should have returned a local error page.
    459   EXPECT_FALSE(html.empty());
    460   EXPECT_EQ(NetErrorString(net::ERR_CONNECTION_RESET), html);
    461 
    462   // Error page loads.
    463   EXPECT_EQ(0, enable_page_helper_functions_count());
    464   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    465                      NetErrorHelperCore::ERROR_PAGE);
    466   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    467   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    468   EXPECT_EQ(0, update_count());
    469   EXPECT_EQ(0, error_html_update_count());
    470   EXPECT_EQ(1, enable_page_helper_functions_count());
    471 }
    472 
    473 TEST_F(NetErrorHelperCoreTest, MainFrameNonDnsErrorWithCorrections) {
    474   EnableNavigationCorrections();
    475 
    476   // Original page starts loading.
    477   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    478                      NetErrorHelperCore::NON_ERROR_PAGE);
    479 
    480   // It fails, and an error page is requested.
    481   std::string html;
    482   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    483                       NetError(net::ERR_CONNECTION_RESET), false, &html);
    484   // Should have returned a local error page.
    485   EXPECT_FALSE(html.empty());
    486   EXPECT_EQ(NetErrorString(net::ERR_CONNECTION_RESET), html);
    487 
    488   // Error page loads.
    489   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    490                      NetErrorHelperCore::ERROR_PAGE);
    491   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    492   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    493   EXPECT_EQ(0, update_count());
    494   EXPECT_EQ(0, error_html_update_count());
    495 }
    496 
    497 // Much like above tests, but with a bunch of spurious DNS status messages that
    498 // should have no effect.
    499 TEST_F(NetErrorHelperCoreTest, MainFrameNonDnsErrorSpuriousStatus) {
    500   // Original page starts loading.
    501   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    502                      NetErrorHelperCore::NON_ERROR_PAGE);
    503   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    504 
    505   // It fails, and an error page is requested.
    506   std::string html;
    507   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    508                       NetError(net::ERR_CONNECTION_RESET),
    509                       false, &html);
    510   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    511 
    512   // Should have returned a local error page.
    513   EXPECT_FALSE(html.empty());
    514   EXPECT_EQ(NetErrorString(net::ERR_CONNECTION_RESET),  html);
    515 
    516   // Error page loads.
    517 
    518   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    519                      NetErrorHelperCore::ERROR_PAGE);
    520   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    521 
    522   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    523   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    524 
    525   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    526   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    527 
    528   EXPECT_EQ(0, update_count());
    529   EXPECT_EQ(0, error_html_update_count());
    530 }
    531 
    532 TEST_F(NetErrorHelperCoreTest, SubFrameDnsError) {
    533   // Original page starts loading.
    534   core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
    535                      NetErrorHelperCore::NON_ERROR_PAGE);
    536 
    537   // It fails, and an error page is requested.
    538   std::string html;
    539   core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
    540                       NetError(net::ERR_NAME_NOT_RESOLVED),
    541                       false, &html);
    542   // Should have returned a local error page.
    543   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), html);
    544 
    545   // Error page loads.
    546   core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
    547                      NetErrorHelperCore::ERROR_PAGE);
    548   core()->OnCommitLoad(NetErrorHelperCore::SUB_FRAME, error_url());
    549   core()->OnFinishLoad(NetErrorHelperCore::SUB_FRAME);
    550   EXPECT_EQ(0, update_count());
    551   EXPECT_EQ(0, error_html_update_count());
    552 }
    553 
    554 TEST_F(NetErrorHelperCoreTest, SubFrameDnsErrorWithCorrections) {
    555   EnableNavigationCorrections();
    556 
    557   // Original page starts loading.
    558   core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
    559                      NetErrorHelperCore::NON_ERROR_PAGE);
    560 
    561   // It fails, and an error page is requested.
    562   std::string html;
    563   core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
    564                       NetError(net::ERR_NAME_NOT_RESOLVED),
    565                       false, &html);
    566   // Should have returned a local error page.
    567   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), html);
    568 
    569   // Error page loads.
    570   core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
    571                      NetErrorHelperCore::ERROR_PAGE);
    572   core()->OnCommitLoad(NetErrorHelperCore::SUB_FRAME, error_url());
    573   core()->OnFinishLoad(NetErrorHelperCore::SUB_FRAME);
    574   EXPECT_EQ(0, update_count());
    575   EXPECT_EQ(0, error_html_update_count());
    576 }
    577 
    578 // Much like above tests, but with a bunch of spurious DNS status messages that
    579 // should have no effect.
    580 TEST_F(NetErrorHelperCoreTest, SubFrameDnsErrorSpuriousStatus) {
    581   // Original page starts loading.
    582   core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
    583                      NetErrorHelperCore::NON_ERROR_PAGE);
    584   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    585 
    586   // It fails, and an error page is requested.
    587   std::string html;
    588   core()->GetErrorHTML(NetErrorHelperCore::SUB_FRAME,
    589                       NetError(net::ERR_NAME_NOT_RESOLVED),
    590                       false, &html);
    591   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    592 
    593   // Should have returned a local error page.
    594   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), html);
    595 
    596   // Error page loads.
    597 
    598   core()->OnStartLoad(NetErrorHelperCore::SUB_FRAME,
    599                      NetErrorHelperCore::ERROR_PAGE);
    600   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    601 
    602   core()->OnCommitLoad(NetErrorHelperCore::SUB_FRAME, error_url());
    603   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    604 
    605   core()->OnFinishLoad(NetErrorHelperCore::SUB_FRAME);
    606   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    607 
    608   EXPECT_EQ(0, update_count());
    609   EXPECT_EQ(0, error_html_update_count());
    610 }
    611 
    612 //------------------------------------------------------------------------------
    613 // Tests for updating the error page in response to DNS probe results.  None
    614 // of these have navigation corrections enabled.
    615 //------------------------------------------------------------------------------
    616 
    617 // Test case where the error page finishes loading before receiving any DNS
    618 // probe messages.
    619 TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbe) {
    620   // Original page starts loading.
    621   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    622                      NetErrorHelperCore::NON_ERROR_PAGE);
    623 
    624   // It fails, and an error page is requested.
    625   std::string html;
    626   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    627                       NetError(net::ERR_NAME_NOT_RESOLVED),
    628                       false, &html);
    629   // Should have returned a local error page indicating a probe may run.
    630   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    631 
    632   // Error page loads.
    633   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    634                      NetErrorHelperCore::ERROR_PAGE);
    635   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    636   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    637   EXPECT_EQ(0, update_count());
    638 
    639   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    640   EXPECT_EQ(1, update_count());
    641   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
    642             last_error_html());
    643 
    644   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    645   EXPECT_EQ(2, update_count());
    646   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
    647             last_error_html());
    648 
    649   // Any other probe updates should be ignored.
    650   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    651   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    652   EXPECT_EQ(2, update_count());
    653   EXPECT_EQ(0, error_html_update_count());
    654 }
    655 
    656 // Same as above, but the probe is not run.
    657 TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbeNotRun) {
    658   // Original page starts loading.
    659   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    660                      NetErrorHelperCore::NON_ERROR_PAGE);
    661 
    662   // It fails, and an error page is requested.
    663   std::string html;
    664   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    665                       NetError(net::ERR_NAME_NOT_RESOLVED),
    666                       false, &html);
    667   // Should have returned a local error page indicating a probe may run.
    668   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    669 
    670   // Error page loads.
    671   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    672                      NetErrorHelperCore::ERROR_PAGE);
    673   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    674   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    675   EXPECT_EQ(0, update_count());
    676 
    677   // When the not run status arrives, the page should revert to the normal dns
    678   // error page.
    679   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_NOT_RUN);
    680   EXPECT_EQ(1, update_count());
    681   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
    682 
    683   // Any other probe updates should be ignored.
    684   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    685   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    686   EXPECT_EQ(1, update_count());
    687   EXPECT_EQ(0, error_html_update_count());
    688 }
    689 
    690 // Same as above, but the probe result is inconclusive.
    691 TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbeInconclusive) {
    692   // Original page starts loading.
    693   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    694                      NetErrorHelperCore::NON_ERROR_PAGE);
    695 
    696   // It fails, and an error page is requested.
    697   std::string html;
    698   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    699                       NetError(net::ERR_NAME_NOT_RESOLVED),
    700                       false, &html);
    701   // Should have returned a local error page indicating a probe may run.
    702   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    703 
    704   // Error page loads.
    705   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    706                      NetErrorHelperCore::ERROR_PAGE);
    707   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    708   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    709   EXPECT_EQ(0, update_count());
    710 
    711   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    712   EXPECT_EQ(1, update_count());
    713   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
    714             last_error_html());
    715 
    716   // When the inconclusive status arrives, the page should revert to the normal
    717   // dns error page.
    718   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE);
    719   EXPECT_EQ(2, update_count());
    720   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
    721 
    722   // Any other probe updates should be ignored.
    723   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE);
    724   EXPECT_EQ(2, update_count());
    725   EXPECT_EQ(0, error_html_update_count());
    726 }
    727 
    728 // Same as above, but the probe result is no internet.
    729 TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbeNoInternet) {
    730   // Original page starts loading.
    731   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    732                      NetErrorHelperCore::NON_ERROR_PAGE);
    733 
    734   // It fails, and an error page is requested.
    735   std::string html;
    736   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    737                       NetError(net::ERR_NAME_NOT_RESOLVED),
    738                       false, &html);
    739   // Should have returned a local error page indicating a probe may run.
    740   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    741 
    742   // Error page loads.
    743   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    744                      NetErrorHelperCore::ERROR_PAGE);
    745   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    746   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    747   EXPECT_EQ(0, update_count());
    748 
    749   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    750   EXPECT_EQ(1, update_count());
    751   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
    752             last_error_html());
    753 
    754   // When the inconclusive status arrives, the page should revert to the normal
    755   // dns error page.
    756   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
    757   EXPECT_EQ(2, update_count());
    758   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET),
    759             last_error_html());
    760 
    761   // Any other probe updates should be ignored.
    762   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
    763   EXPECT_EQ(2, update_count());
    764   EXPECT_EQ(0, error_html_update_count());
    765 }
    766 
    767 // Same as above, but the probe result is bad config.
    768 TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbeBadConfig) {
    769   // Original page starts loading.
    770   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    771                      NetErrorHelperCore::NON_ERROR_PAGE);
    772 
    773   // It fails, and an error page is requested.
    774   std::string html;
    775   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    776                       NetError(net::ERR_NAME_NOT_RESOLVED),
    777                       false, &html);
    778   // Should have returned a local error page indicating a probe may run.
    779   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    780 
    781   // Error page loads.
    782   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    783                      NetErrorHelperCore::ERROR_PAGE);
    784   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    785   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    786   EXPECT_EQ(0, update_count());
    787 
    788   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    789   EXPECT_EQ(1, update_count());
    790   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
    791             last_error_html());
    792 
    793   // When the inconclusive status arrives, the page should revert to the normal
    794   // dns error page.
    795   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG);
    796   EXPECT_EQ(2, update_count());
    797   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG),
    798             last_error_html());
    799 
    800   // Any other probe updates should be ignored.
    801   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG);
    802   EXPECT_EQ(2, update_count());
    803   EXPECT_EQ(0, error_html_update_count());
    804 }
    805 
    806 // Test case where the error page finishes loading after receiving the start
    807 // DNS probe message.
    808 TEST_F(NetErrorHelperCoreTest, FinishedAfterStartProbe) {
    809   // Original page starts loading.
    810   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    811                      NetErrorHelperCore::NON_ERROR_PAGE);
    812 
    813   // It fails, and an error page is requested.
    814   std::string html;
    815   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    816                       NetError(net::ERR_NAME_NOT_RESOLVED),
    817                       false, &html);
    818   // Should have returned a local error page indicating a probe may run.
    819   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    820 
    821   // Error page loads.
    822   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    823                      NetErrorHelperCore::ERROR_PAGE);
    824   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    825 
    826   // Nothing should be done when a probe status comes in before loading
    827   // finishes.
    828   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    829   EXPECT_EQ(0, update_count());
    830 
    831   // When loading finishes, however, the buffered probe status should be sent
    832   // to the page.
    833   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    834   EXPECT_EQ(1, update_count());
    835   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
    836             last_error_html());
    837 
    838   // Should update the page again when the probe result comes in.
    839   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    840   EXPECT_EQ(2, update_count());
    841   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
    842             last_error_html());
    843 
    844   // Any other probe updates should be ignored.
    845   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_NOT_RUN);
    846   EXPECT_EQ(2, update_count());
    847 }
    848 
    849 // Test case where the error page finishes loading before receiving any DNS
    850 // probe messages and the request is a POST.
    851 TEST_F(NetErrorHelperCoreTest, FinishedBeforeProbePost) {
    852   // Original page starts loading.
    853   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    854                      NetErrorHelperCore::NON_ERROR_PAGE);
    855 
    856   // It fails, and an error page is requested.
    857   std::string html;
    858   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    859                       NetError(net::ERR_NAME_NOT_RESOLVED),
    860                       true, &html);
    861   // Should have returned a local error page indicating a probe may run.
    862   EXPECT_EQ(ErrorToString(
    863                 ProbeError(chrome_common_net::DNS_PROBE_POSSIBLE),
    864                            true),
    865             html);
    866 
    867   // Error page loads.
    868   EXPECT_EQ(0, enable_page_helper_functions_count());
    869   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    870                      NetErrorHelperCore::ERROR_PAGE);
    871   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    872   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    873   EXPECT_EQ(0, update_count());
    874   EXPECT_EQ(1, enable_page_helper_functions_count());
    875 
    876   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    877   EXPECT_EQ(1, update_count());
    878   EXPECT_EQ(ErrorToString(
    879                 ProbeError(chrome_common_net::DNS_PROBE_STARTED), true),
    880             last_error_html());
    881 
    882   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    883   EXPECT_EQ(2, update_count());
    884   EXPECT_EQ(ErrorToString(
    885                 ProbeError(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
    886                            true),
    887             last_error_html());
    888   EXPECT_EQ(0, error_html_update_count());
    889 }
    890 
    891 // Test case where the probe finishes before the page is committed.
    892 TEST_F(NetErrorHelperCoreTest, ProbeFinishesEarly) {
    893   // Original page starts loading.
    894   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    895                      NetErrorHelperCore::NON_ERROR_PAGE);
    896 
    897   // It fails, and an error page is requested.
    898   std::string html;
    899   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    900                       NetError(net::ERR_NAME_NOT_RESOLVED),
    901                       false, &html);
    902   // Should have returned a local error page indicating a probe may run.
    903   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    904 
    905   // Error page starts loading.
    906   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    907                      NetErrorHelperCore::ERROR_PAGE);
    908 
    909   // Nothing should be done when the probe statuses come in before loading
    910   // finishes.
    911   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    912   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    913   EXPECT_EQ(0, update_count());
    914 
    915   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    916   EXPECT_EQ(0, update_count());
    917 
    918   // When loading finishes, however, the buffered probe status should be sent
    919   // to the page.
    920   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    921   EXPECT_EQ(1, update_count());
    922   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
    923             last_error_html());
    924 
    925   // Any other probe updates should be ignored.
    926   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    927   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    928   EXPECT_EQ(1, update_count());
    929 }
    930 
    931 // Test case where one error page loads completely before a new navigation
    932 // results in another error page.  Probes are run for both pages.
    933 TEST_F(NetErrorHelperCoreTest, TwoErrorsWithProbes) {
    934   // Original page starts loading.
    935   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    936                      NetErrorHelperCore::NON_ERROR_PAGE);
    937 
    938   // It fails, and an error page is requested.
    939   std::string html;
    940   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    941                       NetError(net::ERR_NAME_NOT_RESOLVED),
    942                       false, &html);
    943   // Should have returned a local error page indicating a probe may run.
    944   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    945 
    946   // Error page loads.
    947   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    948                      NetErrorHelperCore::ERROR_PAGE);
    949   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    950   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    951 
    952   // Probe results come in.
    953   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    954   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
    955   EXPECT_EQ(2, update_count());
    956   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
    957             last_error_html());
    958 
    959   // The process starts again.
    960 
    961   // Normal page starts loading.
    962   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    963                      NetErrorHelperCore::NON_ERROR_PAGE);
    964 
    965   // It fails, and an error page is requested.
    966   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
    967                       NetError(net::ERR_NAME_NOT_RESOLVED),
    968                       false, &html);
    969   // Should have returned a local error page indicating a probe may run.
    970   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
    971 
    972   // Error page loads.
    973   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    974                      NetErrorHelperCore::ERROR_PAGE);
    975   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
    976   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
    977   EXPECT_EQ(2, update_count());
    978 
    979   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
    980   EXPECT_EQ(3, update_count());
    981   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
    982             last_error_html());
    983 
    984   // The probe returns a different result this time.
    985   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
    986   EXPECT_EQ(4, update_count());
    987   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET),
    988             last_error_html());
    989   EXPECT_EQ(0, error_html_update_count());
    990 }
    991 
    992 // Test case where one error page loads completely before a new navigation
    993 // results in another error page.  Probe results for the first probe are only
    994 // received after the second load starts, but before it commits.
    995 TEST_F(NetErrorHelperCoreTest, TwoErrorsWithProbesAfterSecondStarts) {
    996   // Original page starts loading.
    997   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
    998                      NetErrorHelperCore::NON_ERROR_PAGE);
    999 
   1000   // It fails, and an error page is requested.
   1001   std::string html;
   1002   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1003                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1004                       false, &html);
   1005   // Should have returned a local error page indicating a probe may run.
   1006   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
   1007 
   1008   // Error page loads.
   1009   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1010                      NetErrorHelperCore::ERROR_PAGE);
   1011   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1012   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1013 
   1014   // The process starts again.
   1015 
   1016   // Normal page starts loading.
   1017   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1018                      NetErrorHelperCore::NON_ERROR_PAGE);
   1019 
   1020   // It fails, and an error page is requested.
   1021   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1022                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1023                       false, &html);
   1024   // Should have returned a local error page indicating a probe may run.
   1025   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
   1026 
   1027   // Error page starts to load.
   1028   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1029                      NetErrorHelperCore::ERROR_PAGE);
   1030 
   1031   // Probe results come in, and the first page is updated.
   1032   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1033   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1034   EXPECT_EQ(2, update_count());
   1035   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
   1036             last_error_html());
   1037 
   1038   // Second page finishes loading, and is updated using the same probe result.
   1039   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1040   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1041   EXPECT_EQ(3, update_count());
   1042   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
   1043             last_error_html());
   1044 
   1045   // Other probe results should be ignored.
   1046   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
   1047   EXPECT_EQ(3, update_count());
   1048   EXPECT_EQ(0, error_html_update_count());
   1049 }
   1050 
   1051 // Same as above, but a new page is loaded before the error page commits.
   1052 TEST_F(NetErrorHelperCoreTest, ErrorPageLoadInterrupted) {
   1053   // Original page starts loading.
   1054   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1055                      NetErrorHelperCore::NON_ERROR_PAGE);
   1056 
   1057   // It fails, and an error page is requested.
   1058   std::string html;
   1059   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1060                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1061                       false, &html);
   1062   // Should have returned a local error page indicating a probe may run.
   1063   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
   1064 
   1065   // Error page starts loading.
   1066   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1067                      NetErrorHelperCore::ERROR_PAGE);
   1068   // Probe statuses come in, but should be ignored.
   1069   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1070   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1071   EXPECT_EQ(0, update_count());
   1072 
   1073   // A new navigation begins while the error page is loading.
   1074   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1075                      NetErrorHelperCore::NON_ERROR_PAGE);
   1076 
   1077   // And fails.
   1078   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1079                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1080                       false, &html);
   1081   // Should have returned a local error page indicating a probe may run.
   1082   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE), html);
   1083 
   1084   // Error page finishes loading.
   1085   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1086   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1087 
   1088   // Probe results come in.
   1089   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1090   EXPECT_EQ(1, update_count());
   1091   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
   1092             last_error_html());
   1093 
   1094   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET);
   1095   EXPECT_EQ(2, update_count());
   1096   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET),
   1097             last_error_html());
   1098   EXPECT_EQ(0, error_html_update_count());
   1099 }
   1100 
   1101 //------------------------------------------------------------------------------
   1102 // Navigation correction tests.
   1103 //------------------------------------------------------------------------------
   1104 
   1105 // Check that corrections are not used for HTTPS URLs.
   1106 TEST_F(NetErrorHelperCoreTest, NoCorrectionsForHttps) {
   1107   // Original page starts loading.
   1108   EnableNavigationCorrections();
   1109   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1110                      NetErrorHelperCore::NON_ERROR_PAGE);
   1111 
   1112   // The HTTPS page fails to load.
   1113   std::string html;
   1114   blink::WebURLError error = NetError(net::ERR_NAME_NOT_RESOLVED);
   1115   error.unreachableURL = GURL(kFailedHttpsUrl);
   1116   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME, error, false, &html);
   1117 
   1118   blink::WebURLError probe_error =
   1119       ProbeError(chrome_common_net::DNS_PROBE_POSSIBLE);
   1120   probe_error.unreachableURL = GURL(kFailedHttpsUrl);
   1121   EXPECT_EQ(ErrorToString(probe_error, false), html);
   1122   EXPECT_FALSE(is_url_being_fetched());
   1123   EXPECT_FALSE(last_error_page_params());
   1124 
   1125   // The blank page loads, no error page is loaded.
   1126   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1127                      NetErrorHelperCore::ERROR_PAGE);
   1128   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1129   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1130   EXPECT_FALSE(is_url_being_fetched());
   1131   EXPECT_FALSE(last_error_page_params());
   1132 
   1133   // Page is updated in response to DNS probes as normal.
   1134   EXPECT_EQ(0, update_count());
   1135   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1136   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1137   EXPECT_EQ(2, update_count());
   1138   EXPECT_FALSE(last_error_page_params());
   1139   blink::WebURLError final_probe_error =
   1140       ProbeError(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1141   final_probe_error.unreachableURL = GURL(kFailedHttpsUrl);
   1142   EXPECT_EQ(ErrorToString(final_probe_error, false), last_error_html());
   1143 }
   1144 
   1145 // The blank page loads, then the navigation corrections request succeeds and is
   1146 // loaded.  Then the probe results come in.
   1147 TEST_F(NetErrorHelperCoreTest, CorrectionsReceivedBeforeProbe) {
   1148   // Original page starts loading.
   1149   EnableNavigationCorrections();
   1150   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1151                      NetErrorHelperCore::NON_ERROR_PAGE);
   1152 
   1153   // It fails.
   1154   std::string html;
   1155   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1156                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1157                       false, &html);
   1158   EXPECT_TRUE(html.empty());
   1159   EXPECT_FALSE(is_url_being_fetched());
   1160   EXPECT_FALSE(last_error_page_params());
   1161 
   1162   // The blank page loads.
   1163   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1164                       NetErrorHelperCore::ERROR_PAGE);
   1165   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1166 
   1167   // Corrections retrieval starts when the error page finishes loading.
   1168   EXPECT_FALSE(is_url_being_fetched());
   1169   EXPECT_FALSE(last_error_page_params());
   1170   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1171   EXPECT_TRUE(is_url_being_fetched());
   1172   EXPECT_FALSE(last_error_page_params());
   1173 
   1174   // Corrections are retrieved.
   1175   NavigationCorrectionsLoadSuccess(kDefaultCorrections,
   1176                                    arraysize(kDefaultCorrections));
   1177   EXPECT_EQ(1, error_html_update_count());
   1178   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
   1179   ExpectDefaultNavigationCorrections();
   1180   EXPECT_FALSE(is_url_being_fetched());
   1181 
   1182   // Corrections load.
   1183   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1184                       NetErrorHelperCore::ERROR_PAGE);
   1185   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1186   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1187 
   1188   // Any probe statuses should be ignored.
   1189   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1190   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1191 
   1192   EXPECT_EQ(0, update_count());
   1193   EXPECT_EQ(1, error_html_update_count());
   1194 }
   1195 
   1196 // The blank page finishes loading, then probe results come in, and then
   1197 // the navigation corrections request succeeds.
   1198 TEST_F(NetErrorHelperCoreTest, CorrectionsRetrievedAfterProbes) {
   1199   // Original page starts loading.
   1200   EnableNavigationCorrections();
   1201   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1202                      NetErrorHelperCore::NON_ERROR_PAGE);
   1203 
   1204   // It fails, and corrections are requested.
   1205   std::string html;
   1206   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1207                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1208                       false, &html);
   1209   EXPECT_TRUE(html.empty());
   1210 
   1211   // The blank page loads.
   1212   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1213                      NetErrorHelperCore::ERROR_PAGE);
   1214   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1215   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1216   EXPECT_TRUE(is_url_being_fetched());
   1217   EXPECT_FALSE(last_error_page_params());
   1218 
   1219   // Probe statuses should be ignored.
   1220   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1221   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1222   EXPECT_EQ(0, update_count());
   1223   EXPECT_EQ(0, error_html_update_count());
   1224   EXPECT_FALSE(last_error_page_params());
   1225 
   1226   // Corrections are retrieved.
   1227   EXPECT_TRUE(is_url_being_fetched());
   1228   NavigationCorrectionsLoadSuccess(kDefaultCorrections,
   1229                                    arraysize(kDefaultCorrections));
   1230   EXPECT_EQ(1, error_html_update_count());
   1231   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
   1232   ExpectDefaultNavigationCorrections();
   1233   EXPECT_FALSE(is_url_being_fetched());
   1234 
   1235   // Corrections load.
   1236   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1237                      NetErrorHelperCore::ERROR_PAGE);
   1238   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1239   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1240   EXPECT_EQ(1, error_html_update_count());
   1241   EXPECT_EQ(0, update_count());
   1242 }
   1243 
   1244 // The corrections request fails and then the error page loads for an error that
   1245 // does not trigger DNS probes.
   1246 TEST_F(NetErrorHelperCoreTest, CorrectionsFailLoadNoProbes) {
   1247   // Original page starts loading.
   1248   EnableNavigationCorrections();
   1249   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1250                      NetErrorHelperCore::NON_ERROR_PAGE);
   1251 
   1252   // It fails, and corrections are requested.
   1253   std::string html;
   1254   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1255                       NetError(net::ERR_CONNECTION_FAILED),
   1256                       false, &html);
   1257   EXPECT_TRUE(html.empty());
   1258 
   1259   // The blank page loads.
   1260   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1261                      NetErrorHelperCore::ERROR_PAGE);
   1262   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1263   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1264 
   1265   // Corrections request fails, final error page is shown.
   1266   EXPECT_TRUE(is_url_being_fetched());
   1267   NavigationCorrectionsLoadFailure();
   1268   EXPECT_EQ(1, error_html_update_count());
   1269   EXPECT_EQ(last_error_html(), NetErrorString(net::ERR_CONNECTION_FAILED));
   1270   EXPECT_FALSE(is_url_being_fetched());
   1271   EXPECT_EQ(0, update_count());
   1272   EXPECT_FALSE(last_error_page_params());
   1273 
   1274   // Error page loads.
   1275   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1276                      NetErrorHelperCore::ERROR_PAGE);
   1277   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1278   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1279 
   1280   // If probe statuses come in last from another page load, they should be
   1281   // ignored.
   1282   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1283   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1284   EXPECT_EQ(0, update_count());
   1285   EXPECT_EQ(1, error_html_update_count());
   1286 }
   1287 
   1288 // The corrections request fails and then the error page loads before probe
   1289 // results are received.
   1290 TEST_F(NetErrorHelperCoreTest, CorrectionsFailLoadBeforeProbe) {
   1291   // Original page starts loading.
   1292   EnableNavigationCorrections();
   1293   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1294                      NetErrorHelperCore::NON_ERROR_PAGE);
   1295 
   1296   // It fails, and corrections are requested.
   1297   std::string html;
   1298   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1299                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1300                       false, &html);
   1301   EXPECT_TRUE(html.empty());
   1302 
   1303   // The blank page loads.
   1304   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1305                      NetErrorHelperCore::ERROR_PAGE);
   1306   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1307   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1308 
   1309   // Corrections request fails, probe pending page shown.
   1310   EXPECT_TRUE(is_url_being_fetched());
   1311   NavigationCorrectionsLoadFailure();
   1312   EXPECT_EQ(1, error_html_update_count());
   1313   EXPECT_EQ(last_error_html(),
   1314             ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE));
   1315   EXPECT_FALSE(is_url_being_fetched());
   1316   EXPECT_EQ(0, update_count());
   1317 
   1318   // Probe page loads.
   1319   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1320                      NetErrorHelperCore::ERROR_PAGE);
   1321   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1322   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1323 
   1324   // Probe statuses comes in, and page is updated.
   1325   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1326   EXPECT_EQ(1, update_count());
   1327   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
   1328             last_error_html());
   1329 
   1330   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1331   EXPECT_EQ(2, update_count());
   1332   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
   1333             last_error_html());
   1334 
   1335   // The commit results in sending a second probe status, which is ignored.
   1336   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1337   EXPECT_EQ(2, update_count());
   1338   EXPECT_EQ(1, error_html_update_count());
   1339 }
   1340 
   1341 // The corrections request fails after receiving probe results.
   1342 TEST_F(NetErrorHelperCoreTest, CorrectionsFailAfterProbe) {
   1343   // Original page starts loading.
   1344   EnableNavigationCorrections();
   1345   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1346                      NetErrorHelperCore::NON_ERROR_PAGE);
   1347 
   1348   // It fails, and corrections are requested.
   1349   std::string html;
   1350   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1351                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1352                       false, &html);
   1353   EXPECT_TRUE(html.empty());
   1354 
   1355   // The blank page loads.
   1356   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1357                      NetErrorHelperCore::ERROR_PAGE);
   1358   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1359   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1360 
   1361   // Results come in, but end up being ignored.
   1362   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1363   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1364   EXPECT_EQ(0, update_count());
   1365 
   1366   // Corrections request fails, probe pending page shown.
   1367   EXPECT_TRUE(is_url_being_fetched());
   1368   NavigationCorrectionsLoadFailure();
   1369   EXPECT_EQ(1, error_html_update_count());
   1370   EXPECT_EQ(last_error_html(),
   1371             ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE));
   1372   EXPECT_FALSE(is_url_being_fetched());
   1373   EXPECT_EQ(0, update_count());
   1374 
   1375   // Probe page loads.
   1376   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1377                      NetErrorHelperCore::ERROR_PAGE);
   1378   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1379   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1380 
   1381   // Probe statuses comes in, and page is updated.
   1382   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1383   EXPECT_EQ(1, update_count());
   1384   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
   1385             last_error_html());
   1386   EXPECT_EQ(1, error_html_update_count());
   1387 }
   1388 
   1389 // An error page load that would normally load correction is interrupted
   1390 // by a new navigation before the blank page commits.
   1391 TEST_F(NetErrorHelperCoreTest, CorrectionsInterruptedBeforeCommit) {
   1392   // Original page starts loading.
   1393   EnableNavigationCorrections();
   1394   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1395                      NetErrorHelperCore::NON_ERROR_PAGE);
   1396 
   1397   // It fails, and corrections are requested.
   1398   std::string html;
   1399   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1400                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1401                       false, &html);
   1402   EXPECT_TRUE(html.empty());
   1403 
   1404   // The blank page starts loading.
   1405   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1406                      NetErrorHelperCore::ERROR_PAGE);
   1407 
   1408   // A new page load starts.
   1409   EXPECT_FALSE(is_url_being_fetched());
   1410   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1411                      NetErrorHelperCore::NON_ERROR_PAGE);
   1412 
   1413   // A new page load interrupts the original load.
   1414   EXPECT_FALSE(is_url_being_fetched());
   1415   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1416                      NetErrorHelperCore::NON_ERROR_PAGE);
   1417   EXPECT_FALSE(is_url_being_fetched());
   1418   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
   1419   EXPECT_FALSE(is_url_being_fetched());
   1420   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1421 
   1422   EXPECT_FALSE(is_url_being_fetched());
   1423   EXPECT_EQ(0, update_count());
   1424   EXPECT_EQ(0, error_html_update_count());
   1425 }
   1426 
   1427 // An error page load that would normally load corrections is interrupted
   1428 // by a new navigation before the blank page finishes loading.
   1429 TEST_F(NetErrorHelperCoreTest, CorrectionsInterruptedBeforeLoad) {
   1430   // Original page starts loading.
   1431   EnableNavigationCorrections();
   1432   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1433                      NetErrorHelperCore::NON_ERROR_PAGE);
   1434 
   1435   // It fails, and corrections are requested.
   1436   std::string html;
   1437   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1438                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1439                       false, &html);
   1440   EXPECT_TRUE(html.empty());
   1441 
   1442   // The blank page starts loading and is committed.
   1443   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1444                      NetErrorHelperCore::ERROR_PAGE);
   1445   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1446 
   1447   // A new page load interrupts the original load.
   1448   EXPECT_FALSE(is_url_being_fetched());
   1449   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1450                      NetErrorHelperCore::NON_ERROR_PAGE);
   1451   EXPECT_FALSE(is_url_being_fetched());
   1452   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, default_url());
   1453   EXPECT_FALSE(is_url_being_fetched());
   1454   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1455 
   1456   EXPECT_FALSE(is_url_being_fetched());
   1457   EXPECT_EQ(0, update_count());
   1458   EXPECT_EQ(0, error_html_update_count());
   1459 }
   1460 
   1461 // The corrections request is cancelled due to a new navigation.  The new
   1462 // navigation fails and then loads corrections successfully.
   1463 TEST_F(NetErrorHelperCoreTest, CorrectionsInterrupted) {
   1464   // Original page starts loading.
   1465   EnableNavigationCorrections();
   1466   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1467                      NetErrorHelperCore::NON_ERROR_PAGE);
   1468 
   1469   // It fails, and corrections are requested.
   1470   std::string html;
   1471   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1472                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1473                       false, &html);
   1474   EXPECT_TRUE(html.empty());
   1475 
   1476   // The blank page loads.
   1477   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1478                      NetErrorHelperCore::ERROR_PAGE);
   1479   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1480   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1481   EXPECT_TRUE(is_url_being_fetched());
   1482 
   1483   // Results come in, but end up being ignored.
   1484   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1485   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1486   EXPECT_EQ(0, update_count());
   1487 
   1488   // A new load appears!
   1489   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1490                      NetErrorHelperCore::NON_ERROR_PAGE);
   1491   EXPECT_FALSE(is_url_being_fetched());
   1492 
   1493   // It fails, and corrections are requested again once a blank page is loaded.
   1494   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1495                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1496                       false, &html);
   1497   EXPECT_TRUE(html.empty());
   1498   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1499                      NetErrorHelperCore::ERROR_PAGE);
   1500   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1501   EXPECT_FALSE(is_url_being_fetched());
   1502   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1503   EXPECT_TRUE(is_url_being_fetched());
   1504 
   1505   // Corrections request succeeds.
   1506   NavigationCorrectionsLoadSuccess(kDefaultCorrections,
   1507                                    arraysize(kDefaultCorrections));
   1508   EXPECT_EQ(1, error_html_update_count());
   1509   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
   1510   ExpectDefaultNavigationCorrections();
   1511   EXPECT_FALSE(is_url_being_fetched());
   1512 
   1513   // Probe statuses come in, and are ignored.
   1514   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1515   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1516   EXPECT_EQ(0, update_count());
   1517 }
   1518 
   1519 // The corrections request is cancelled due to call to Stop().  The cross
   1520 // process navigation is cancelled, and then a new load fails and tries to load
   1521 // corrections again, unsuccessfully.
   1522 TEST_F(NetErrorHelperCoreTest, CorrectionsStopped) {
   1523   // Original page starts loading.
   1524   EnableNavigationCorrections();
   1525   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1526                      NetErrorHelperCore::NON_ERROR_PAGE);
   1527 
   1528   // It fails, and corrections are requested.
   1529   std::string html;
   1530   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1531                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1532                       false, &html);
   1533   EXPECT_TRUE(html.empty());
   1534 
   1535   // The blank page loads.
   1536   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1537                      NetErrorHelperCore::ERROR_PAGE);
   1538   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1539   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1540 
   1541   EXPECT_TRUE(is_url_being_fetched());
   1542   core()->OnStop();
   1543   EXPECT_FALSE(is_url_being_fetched());
   1544 
   1545   // Results come in, but end up being ignored.
   1546   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1547   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1548   EXPECT_EQ(0, update_count());
   1549 
   1550   // Cross process navigation must have been cancelled, and a new load appears!
   1551   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1552                      NetErrorHelperCore::NON_ERROR_PAGE);
   1553 
   1554   // It fails, and corrections are requested again.
   1555   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1556                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1557                       false, &html);
   1558   EXPECT_TRUE(html.empty());
   1559 
   1560   // The blank page loads again.
   1561   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1562                      NetErrorHelperCore::ERROR_PAGE);
   1563   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1564   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1565   EXPECT_TRUE(is_url_being_fetched());
   1566 
   1567   // Corrections request fails, probe pending page shown.
   1568   NavigationCorrectionsLoadFailure();
   1569   EXPECT_EQ(1, error_html_update_count());
   1570   EXPECT_EQ(last_error_html(),
   1571             ProbeErrorString(chrome_common_net::DNS_PROBE_POSSIBLE));
   1572   EXPECT_FALSE(is_url_being_fetched());
   1573 
   1574   // Probe page loads.
   1575   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1576                      NetErrorHelperCore::ERROR_PAGE);
   1577   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1578   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1579 
   1580   // Probe statuses comes in, and page is updated.
   1581   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_STARTED);
   1582   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_STARTED),
   1583             last_error_html());
   1584   EXPECT_EQ(1, update_count());
   1585 
   1586   core()->OnNetErrorInfo(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   1587   EXPECT_EQ(2, update_count());
   1588   EXPECT_EQ(ProbeErrorString(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN),
   1589             last_error_html());
   1590   EXPECT_EQ(1, error_html_update_count());
   1591 }
   1592 
   1593 // Check the case corrections are disabled while the blank page (Loaded
   1594 // before the corrections page) is being loaded.
   1595 TEST_F(NetErrorHelperCoreTest, CorrectionsDisabledBeforeFetch) {
   1596   // Original page starts loading.
   1597   EnableNavigationCorrections();
   1598   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1599                      NetErrorHelperCore::NON_ERROR_PAGE);
   1600 
   1601   // It fails, and corrections are requested.
   1602   std::string html;
   1603   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1604                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1605                       false, &html);
   1606   EXPECT_TRUE(html.empty());
   1607 
   1608   // The blank page loads.
   1609   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1610                      NetErrorHelperCore::ERROR_PAGE);
   1611   // Corrections is disabled.
   1612   DisableNavigationCorrections();
   1613   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1614   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1615   EXPECT_TRUE(is_url_being_fetched());
   1616   EXPECT_FALSE(last_error_page_params());
   1617 
   1618   // Corrections are retrieved.
   1619   NavigationCorrectionsLoadSuccess(kDefaultCorrections,
   1620                                    arraysize(kDefaultCorrections));
   1621   EXPECT_EQ(1, error_html_update_count());
   1622   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
   1623   EXPECT_FALSE(is_url_being_fetched());
   1624   ExpectDefaultNavigationCorrections();
   1625 
   1626   // Corrections load.
   1627   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1628                      NetErrorHelperCore::ERROR_PAGE);
   1629   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1630   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1631   EXPECT_EQ(1, error_html_update_count());
   1632   EXPECT_EQ(0, update_count());
   1633 }
   1634 
   1635 // Check the case corrections is disabled while fetching the corrections for
   1636 // a failed page load.
   1637 TEST_F(NetErrorHelperCoreTest, CorrectionsDisabledDuringFetch) {
   1638   // Original page starts loading.
   1639   EnableNavigationCorrections();
   1640   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1641                      NetErrorHelperCore::NON_ERROR_PAGE);
   1642 
   1643   // It fails, and corrections are requested.
   1644   std::string html;
   1645   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1646                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1647                       false, &html);
   1648   EXPECT_TRUE(html.empty());
   1649 
   1650   // The blank page loads.
   1651   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1652                      NetErrorHelperCore::ERROR_PAGE);
   1653   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1654   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1655   EXPECT_TRUE(is_url_being_fetched());
   1656   EXPECT_FALSE(last_error_page_params());
   1657 
   1658   // Corrections are disabled.
   1659   DisableNavigationCorrections();
   1660 
   1661   // Corrections are retrieved.
   1662   NavigationCorrectionsLoadSuccess(kDefaultCorrections,
   1663                                    arraysize(kDefaultCorrections));
   1664   EXPECT_EQ(1, error_html_update_count());
   1665   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
   1666   EXPECT_FALSE(is_url_being_fetched());
   1667   ExpectDefaultNavigationCorrections();
   1668 
   1669   // Corrections load.
   1670   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1671                      NetErrorHelperCore::ERROR_PAGE);
   1672   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1673   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1674   EXPECT_EQ(1, error_html_update_count());
   1675   EXPECT_EQ(0, update_count());
   1676 }
   1677 
   1678 // Checks corrections are is used when there are no search suggestions.
   1679 TEST_F(NetErrorHelperCoreTest, CorrectionsWithoutSearch) {
   1680   const NavigationCorrection kCorrections[] = {
   1681     {"urlCorrection", "http://somewhere_else/", "btn", "data", false, false},
   1682   };
   1683 
   1684   // Original page starts loading.
   1685   EnableNavigationCorrections();
   1686   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1687                      NetErrorHelperCore::NON_ERROR_PAGE);
   1688 
   1689   // It fails, and corrections are requested.
   1690   std::string html;
   1691   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1692                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1693                       false, &html);
   1694   EXPECT_TRUE(html.empty());
   1695 
   1696   // The blank page loads.
   1697   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1698                      NetErrorHelperCore::ERROR_PAGE);
   1699   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1700   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1701   EXPECT_TRUE(is_url_being_fetched());
   1702   EXPECT_FALSE(last_error_page_params());
   1703 
   1704   // Corrections are retrieved.
   1705   NavigationCorrectionsLoadSuccess(kCorrections, arraysize(kCorrections));
   1706   EXPECT_EQ(1, error_html_update_count());
   1707   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
   1708   EXPECT_FALSE(is_url_being_fetched());
   1709 
   1710   // Check params.
   1711   ASSERT_TRUE(last_error_page_params());
   1712   EXPECT_FALSE(last_error_page_params()->suggest_reload);
   1713   EXPECT_EQ(1u, last_error_page_params()->override_suggestions->GetSize());
   1714   EXPECT_FALSE(last_error_page_params()->search_url.is_valid());
   1715   EXPECT_EQ("", last_error_page_params()->search_terms);
   1716 
   1717   // Corrections load.
   1718   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1719                      NetErrorHelperCore::ERROR_PAGE);
   1720   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1721   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1722   EXPECT_EQ(1, error_html_update_count());
   1723   EXPECT_EQ(0, update_count());
   1724 }
   1725 
   1726 // Checks corrections are used when there are only search suggestions.
   1727 TEST_F(NetErrorHelperCoreTest, CorrectionsOnlySearchSuggestion) {
   1728   const NavigationCorrection kCorrections[] = {
   1729     {"webSearchQuery", kSuggestedSearchTerms, "frm", "data", false, false},
   1730   };
   1731 
   1732   // Original page starts loading.
   1733   EnableNavigationCorrections();
   1734   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1735                      NetErrorHelperCore::NON_ERROR_PAGE);
   1736 
   1737   // It fails, and corrections are requested.
   1738   std::string html;
   1739   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1740                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1741                       false, &html);
   1742   EXPECT_TRUE(html.empty());
   1743 
   1744   // The blank page loads.
   1745   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1746                      NetErrorHelperCore::ERROR_PAGE);
   1747   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1748   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1749   EXPECT_TRUE(is_url_being_fetched());
   1750   EXPECT_FALSE(last_error_page_params());
   1751 
   1752   // Corrections are retrieved.
   1753   NavigationCorrectionsLoadSuccess(kCorrections, arraysize(kCorrections));
   1754   EXPECT_EQ(1, error_html_update_count());
   1755   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
   1756   EXPECT_FALSE(is_url_being_fetched());
   1757 
   1758   // Check params.
   1759   ASSERT_TRUE(last_error_page_params());
   1760   EXPECT_FALSE(last_error_page_params()->suggest_reload);
   1761   EXPECT_EQ(0u, last_error_page_params()->override_suggestions->GetSize());
   1762   EXPECT_EQ(GURL(kSearchUrl), last_error_page_params()->search_url);
   1763   EXPECT_EQ(kSuggestedSearchTerms, last_error_page_params()->search_terms);
   1764 
   1765   // Corrections load.
   1766   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1767                      NetErrorHelperCore::ERROR_PAGE);
   1768   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1769   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1770   EXPECT_EQ(1, error_html_update_count());
   1771   EXPECT_EQ(0, update_count());
   1772 }
   1773 
   1774 // The correction service returns a non-JSON result.
   1775 TEST_F(NetErrorHelperCoreTest, CorrectionServiceReturnsNonJsonResult) {
   1776   // Original page starts loading.
   1777   EnableNavigationCorrections();
   1778   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1779                      NetErrorHelperCore::NON_ERROR_PAGE);
   1780 
   1781   // It fails, and corrections are requested.
   1782   std::string html;
   1783   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1784                       NetError(net::ERR_CONNECTION_FAILED),
   1785                       false, &html);
   1786   EXPECT_TRUE(html.empty());
   1787 
   1788   // The blank page loads.
   1789   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1790                      NetErrorHelperCore::ERROR_PAGE);
   1791   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1792   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1793 
   1794   // Corrections request fails, final error page is shown.
   1795   EXPECT_TRUE(is_url_being_fetched());
   1796   NavigationCorrectionsLoadFinished("Weird Response");
   1797   EXPECT_EQ(1, error_html_update_count());
   1798   EXPECT_EQ(last_error_html(), NetErrorString(net::ERR_CONNECTION_FAILED));
   1799   EXPECT_FALSE(is_url_being_fetched());
   1800   EXPECT_EQ(0, update_count());
   1801   EXPECT_FALSE(last_error_page_params());
   1802 
   1803   // Error page loads.
   1804   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1805                      NetErrorHelperCore::ERROR_PAGE);
   1806   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1807   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1808 }
   1809 
   1810 // The correction service returns a JSON result that isn't a valid list of
   1811 // corrections.
   1812 TEST_F(NetErrorHelperCoreTest, CorrectionServiceReturnsInvalidJsonResult) {
   1813   // Original page starts loading.
   1814   EnableNavigationCorrections();
   1815   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1816                      NetErrorHelperCore::NON_ERROR_PAGE);
   1817 
   1818   // It fails, and corrections are requested.
   1819   std::string html;
   1820   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1821                       NetError(net::ERR_CONNECTION_FAILED),
   1822                       false, &html);
   1823   EXPECT_TRUE(html.empty());
   1824 
   1825   // The blank page loads.
   1826   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1827                      NetErrorHelperCore::ERROR_PAGE);
   1828   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1829   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1830 
   1831   // Corrections request fails, final error page is shown.
   1832   EXPECT_TRUE(is_url_being_fetched());
   1833   NavigationCorrectionsLoadFinished("{\"result\": 42}");
   1834   EXPECT_EQ(1, error_html_update_count());
   1835   EXPECT_EQ(last_error_html(), NetErrorString(net::ERR_CONNECTION_FAILED));
   1836   EXPECT_FALSE(is_url_being_fetched());
   1837   EXPECT_EQ(0, update_count());
   1838   EXPECT_FALSE(last_error_page_params());
   1839 
   1840   // Error page loads.
   1841   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1842                      NetErrorHelperCore::ERROR_PAGE);
   1843   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1844   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1845 }
   1846 
   1847 TEST_F(NetErrorHelperCoreTest, CorrectionClickTracking) {
   1848   // Go through the standard navigation correction steps.
   1849 
   1850   // Original page starts loading.
   1851   EnableNavigationCorrections();
   1852   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1853                      NetErrorHelperCore::NON_ERROR_PAGE);
   1854 
   1855   // It fails.
   1856   std::string html;
   1857   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   1858                       NetError(net::ERR_NAME_NOT_RESOLVED),
   1859                       false, &html);
   1860   EXPECT_TRUE(html.empty());
   1861   EXPECT_FALSE(is_url_being_fetched());
   1862   EXPECT_FALSE(last_error_page_params());
   1863 
   1864   // The blank page loads.
   1865   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1866                       NetErrorHelperCore::ERROR_PAGE);
   1867   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1868 
   1869   // Corrections retrieval starts when the error page finishes loading.
   1870   EXPECT_FALSE(is_url_being_fetched());
   1871   EXPECT_FALSE(last_error_page_params());
   1872   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1873   EXPECT_TRUE(is_url_being_fetched());
   1874   EXPECT_FALSE(last_error_page_params());
   1875 
   1876   // Corrections are retrieved.
   1877   NavigationCorrectionsLoadSuccess(kDefaultCorrections,
   1878                                    arraysize(kDefaultCorrections));
   1879   EXPECT_EQ(1, error_html_update_count());
   1880   EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
   1881   ExpectDefaultNavigationCorrections();
   1882   EXPECT_FALSE(is_url_being_fetched());
   1883 
   1884   // Corrections load.
   1885   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   1886                       NetErrorHelperCore::ERROR_PAGE);
   1887   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   1888   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   1889 
   1890   EXPECT_EQ(0, tracking_request_count());
   1891 
   1892   // Invalid clicks should be ignored.
   1893   core()->TrackClick(-1);
   1894   core()->TrackClick(arraysize(kDefaultCorrections));
   1895   EXPECT_EQ(0, tracking_request_count());
   1896 
   1897   for (size_t i = 0; i < arraysize(kDefaultCorrections); ++i) {
   1898     // Skip links that do not appear in the page.
   1899     if (kDefaultCorrections[i].is_porn || kDefaultCorrections[i].is_soft_porn)
   1900       continue;
   1901 
   1902     int old_tracking_request_count = tracking_request_count();
   1903     core()->TrackClick(i);
   1904     EXPECT_EQ(old_tracking_request_count + 1, tracking_request_count());
   1905     EXPECT_EQ(GURL(kNavigationCorrectionUrl), last_tracking_url());
   1906 
   1907     // Make sure all expected strings appear in output.
   1908     EXPECT_TRUE(last_tracking_request_body().find(
   1909                     kDefaultCorrections[i].url_correction));
   1910     EXPECT_TRUE(last_tracking_request_body().find(
   1911                     kDefaultCorrections[i].click_data));
   1912     EXPECT_TRUE(last_tracking_request_body().find(
   1913                     kDefaultCorrections[i].click_type));
   1914     EXPECT_TRUE(last_tracking_request_body().find(
   1915                     kNavigationCorrectionEventId));
   1916     EXPECT_TRUE(last_tracking_request_body().find(
   1917                     kNavigationCorrectionFingerprint));
   1918   }
   1919 
   1920   // Make sure duplicate tracking requests are ignored.
   1921   for (size_t i = 0; i < arraysize(kDefaultCorrections); ++i) {
   1922     // Skip links that do not appear in the page.
   1923     if (kDefaultCorrections[i].is_porn || kDefaultCorrections[i].is_soft_porn)
   1924       continue;
   1925 
   1926     int old_tracking_request_count = tracking_request_count();
   1927     core()->TrackClick(i);
   1928     EXPECT_EQ(old_tracking_request_count, tracking_request_count());
   1929   }
   1930 
   1931   EXPECT_EQ(0, update_count());
   1932   EXPECT_EQ(1, error_html_update_count());
   1933 }
   1934 
   1935 TEST_F(NetErrorHelperCoreTest, AutoReloadDisabled) {
   1936   DoErrorLoad(net::ERR_CONNECTION_RESET);
   1937 
   1938   EXPECT_FALSE(timer()->IsRunning());
   1939   EXPECT_EQ(0, reload_count());
   1940 }
   1941 
   1942 class NetErrorHelperCoreAutoReloadTest : public NetErrorHelperCoreTest {
   1943  public:
   1944   virtual void SetUp() {
   1945     NetErrorHelperCoreTest::SetUp();
   1946     SetUpCore(true, false, true);
   1947   }
   1948 };
   1949 
   1950 TEST_F(NetErrorHelperCoreAutoReloadTest, Succeeds) {
   1951   DoErrorLoad(net::ERR_CONNECTION_RESET);
   1952 
   1953   EXPECT_TRUE(timer()->IsRunning());
   1954   EXPECT_EQ(0, reload_count());
   1955 
   1956   timer()->Fire();
   1957   EXPECT_FALSE(timer()->IsRunning());
   1958   EXPECT_EQ(1, reload_count());
   1959 
   1960   DoSuccessLoad();
   1961 
   1962   EXPECT_FALSE(timer()->IsRunning());
   1963 }
   1964 
   1965 TEST_F(NetErrorHelperCoreAutoReloadTest, Retries) {
   1966   DoErrorLoad(net::ERR_CONNECTION_RESET);
   1967 
   1968   EXPECT_TRUE(timer()->IsRunning());
   1969   base::TimeDelta first_delay = timer()->GetCurrentDelay();
   1970   EXPECT_EQ(0, reload_count());
   1971 
   1972   timer()->Fire();
   1973   EXPECT_FALSE(timer()->IsRunning());
   1974   EXPECT_EQ(1, reload_count());
   1975 
   1976   DoErrorLoad(net::ERR_CONNECTION_RESET);
   1977 
   1978   EXPECT_TRUE(timer()->IsRunning());
   1979   EXPECT_GT(timer()->GetCurrentDelay(), first_delay);
   1980 }
   1981 
   1982 TEST_F(NetErrorHelperCoreAutoReloadTest, StopsTimerOnStop) {
   1983   DoErrorLoad(net::ERR_CONNECTION_RESET);
   1984   EXPECT_TRUE(timer()->IsRunning());
   1985   core()->OnStop();
   1986   EXPECT_FALSE(timer()->IsRunning());
   1987 }
   1988 
   1989 TEST_F(NetErrorHelperCoreAutoReloadTest, StopsLoadingOnStop) {
   1990   DoErrorLoad(net::ERR_CONNECTION_RESET);
   1991   EXPECT_EQ(0, core()->auto_reload_count());
   1992   timer()->Fire();
   1993   EXPECT_EQ(1, core()->auto_reload_count());
   1994   EXPECT_EQ(1, reload_count());
   1995   core()->OnStop();
   1996   EXPECT_FALSE(timer()->IsRunning());
   1997   EXPECT_EQ(0, core()->auto_reload_count());
   1998 }
   1999 
   2000 TEST_F(NetErrorHelperCoreAutoReloadTest, StopsOnOtherLoadStart) {
   2001   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2002   EXPECT_TRUE(timer()->IsRunning());
   2003   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2004                      NetErrorHelperCore::NON_ERROR_PAGE);
   2005   EXPECT_FALSE(timer()->IsRunning());
   2006   EXPECT_EQ(0, core()->auto_reload_count());
   2007 }
   2008 
   2009 TEST_F(NetErrorHelperCoreAutoReloadTest, ResetsCountOnSuccess) {
   2010   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2011   base::TimeDelta delay = timer()->GetCurrentDelay();
   2012   EXPECT_EQ(0, core()->auto_reload_count());
   2013   timer()->Fire();
   2014   EXPECT_EQ(1, core()->auto_reload_count());
   2015   EXPECT_EQ(1, reload_count());
   2016   DoSuccessLoad();
   2017   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2018   EXPECT_EQ(0, core()->auto_reload_count());
   2019   EXPECT_EQ(timer()->GetCurrentDelay(), delay);
   2020   timer()->Fire();
   2021   EXPECT_EQ(1, core()->auto_reload_count());
   2022   EXPECT_EQ(2, reload_count());
   2023   DoSuccessLoad();
   2024   EXPECT_EQ(0, core()->auto_reload_count());
   2025 }
   2026 
   2027 TEST_F(NetErrorHelperCoreAutoReloadTest, RestartsOnOnline) {
   2028   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2029   base::TimeDelta delay = timer()->GetCurrentDelay();
   2030   timer()->Fire();
   2031   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2032   EXPECT_TRUE(timer()->IsRunning());
   2033   EXPECT_NE(delay, timer()->GetCurrentDelay());
   2034   core()->NetworkStateChanged(false);
   2035   EXPECT_FALSE(timer()->IsRunning());
   2036   core()->NetworkStateChanged(true);
   2037   EXPECT_TRUE(timer()->IsRunning());
   2038   EXPECT_EQ(delay, timer()->GetCurrentDelay());
   2039 }
   2040 
   2041 TEST_F(NetErrorHelperCoreAutoReloadTest, DoesNotStartOnOnline) {
   2042   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2043   timer()->Fire();
   2044   DoSuccessLoad();
   2045   EXPECT_FALSE(timer()->IsRunning());
   2046   core()->NetworkStateChanged(true);
   2047   EXPECT_FALSE(timer()->IsRunning());
   2048 }
   2049 
   2050 TEST_F(NetErrorHelperCoreAutoReloadTest, DoesNotStartOffline) {
   2051   core()->NetworkStateChanged(false);
   2052   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2053   EXPECT_FALSE(timer()->IsRunning());
   2054   core()->NetworkStateChanged(true);
   2055   EXPECT_TRUE(timer()->IsRunning());
   2056 }
   2057 
   2058 TEST_F(NetErrorHelperCoreAutoReloadTest, DoesNotRestartOnOnlineAfterStop) {
   2059   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2060   timer()->Fire();
   2061   core()->OnStop();
   2062   core()->NetworkStateChanged(true);
   2063   EXPECT_FALSE(timer()->IsRunning());
   2064 }
   2065 
   2066 TEST_F(NetErrorHelperCoreAutoReloadTest, WithDnsProbes) {
   2067   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2068   DoDnsProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN);
   2069   timer()->Fire();
   2070   EXPECT_EQ(1, reload_count());
   2071 }
   2072 
   2073 TEST_F(NetErrorHelperCoreAutoReloadTest, ExponentialBackoffLevelsOff) {
   2074   base::TimeDelta previous = base::TimeDelta::FromMilliseconds(0);
   2075   const int kMaxTries = 50;
   2076   int tries = 0;
   2077   for (tries = 0; tries < kMaxTries; tries++) {
   2078     DoErrorLoad(net::ERR_CONNECTION_RESET);
   2079     EXPECT_TRUE(timer()->IsRunning());
   2080     if (previous == timer()->GetCurrentDelay())
   2081       break;
   2082     previous = timer()->GetCurrentDelay();
   2083     timer()->Fire();
   2084   }
   2085 
   2086   EXPECT_LT(tries, kMaxTries);
   2087 }
   2088 
   2089 TEST_F(NetErrorHelperCoreAutoReloadTest, SlowError) {
   2090   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2091                      NetErrorHelperCore::NON_ERROR_PAGE);
   2092   std::string html;
   2093   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   2094                       NetError(net::ERR_CONNECTION_RESET), false, &html);
   2095   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2096                      NetErrorHelperCore::ERROR_PAGE);
   2097   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   2098   EXPECT_FALSE(timer()->IsRunning());
   2099   // Start a new non-error page load.
   2100   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2101                      NetErrorHelperCore::NON_ERROR_PAGE);
   2102   EXPECT_FALSE(timer()->IsRunning());
   2103   // Finish the error page load.
   2104   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   2105   EXPECT_FALSE(timer()->IsRunning());
   2106   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   2107   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   2108   EXPECT_FALSE(timer()->IsRunning());
   2109 }
   2110 
   2111 TEST_F(NetErrorHelperCoreAutoReloadTest, OnlineSlowError) {
   2112   core()->NetworkStateChanged(false);
   2113   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2114                      NetErrorHelperCore::NON_ERROR_PAGE);
   2115   std::string html;
   2116   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   2117                       NetError(net::ERR_CONNECTION_RESET), false, &html);
   2118   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2119                      NetErrorHelperCore::ERROR_PAGE);
   2120   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   2121   EXPECT_FALSE(timer()->IsRunning());
   2122   core()->NetworkStateChanged(true);
   2123   EXPECT_FALSE(timer()->IsRunning());
   2124   core()->NetworkStateChanged(false);
   2125   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   2126   EXPECT_FALSE(timer()->IsRunning());
   2127   core()->NetworkStateChanged(true);
   2128   EXPECT_TRUE(timer()->IsRunning());
   2129 }
   2130 
   2131 TEST_F(NetErrorHelperCoreAutoReloadTest, OnlinePendingError) {
   2132   core()->NetworkStateChanged(false);
   2133   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2134                      NetErrorHelperCore::NON_ERROR_PAGE);
   2135   std::string html;
   2136   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   2137                       NetError(net::ERR_CONNECTION_RESET), false, &html);
   2138   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2139                      NetErrorHelperCore::ERROR_PAGE);
   2140   EXPECT_FALSE(timer()->IsRunning());
   2141   core()->NetworkStateChanged(true);
   2142   EXPECT_FALSE(timer()->IsRunning());
   2143   core()->NetworkStateChanged(false);
   2144   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   2145   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   2146   EXPECT_FALSE(timer()->IsRunning());
   2147   core()->NetworkStateChanged(true);
   2148   EXPECT_TRUE(timer()->IsRunning());
   2149 }
   2150 
   2151 TEST_F(NetErrorHelperCoreAutoReloadTest, OnlinePartialErrorReplacement) {
   2152   core()->NetworkStateChanged(false);
   2153   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2154                      NetErrorHelperCore::NON_ERROR_PAGE);
   2155   std::string html;
   2156   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   2157                       NetError(net::ERR_CONNECTION_RESET), false, &html);
   2158   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2159                      NetErrorHelperCore::ERROR_PAGE);
   2160   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
   2161   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   2162   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2163                      NetErrorHelperCore::NON_ERROR_PAGE);
   2164   core()->GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
   2165                       NetError(net::ERR_CONNECTION_RESET), false, &html);
   2166   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2167                      NetErrorHelperCore::ERROR_PAGE);
   2168   EXPECT_FALSE(timer()->IsRunning());
   2169   core()->NetworkStateChanged(true);
   2170   EXPECT_FALSE(timer()->IsRunning());
   2171 }
   2172 
   2173 TEST_F(NetErrorHelperCoreAutoReloadTest, ShouldSuppressNonReloadableErrorPage) {
   2174   DoErrorLoad(net::ERR_ABORTED);
   2175   EXPECT_FALSE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
   2176                                               GURL(kFailedUrl)));
   2177 }
   2178 
   2179 TEST_F(NetErrorHelperCoreAutoReloadTest, ShouldSuppressErrorPage) {
   2180   // Set up the environment to test ShouldSuppressErrorPage: auto-reload is
   2181   // enabled, an error page is loaded, and the auto-reload callback is running.
   2182   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2183   timer()->Fire();
   2184 
   2185   EXPECT_FALSE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::SUB_FRAME,
   2186                                               GURL(kFailedUrl)));
   2187   EXPECT_FALSE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
   2188                                               GURL("http://some.other.url")));
   2189   EXPECT_TRUE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
   2190                                              GURL(kFailedUrl)));
   2191 }
   2192 
   2193 TEST_F(NetErrorHelperCoreAutoReloadTest, HiddenAndShown) {
   2194   SetUpCore(true, true, true);
   2195   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2196   EXPECT_TRUE(timer()->IsRunning());
   2197   core()->OnWasHidden();
   2198   EXPECT_FALSE(timer()->IsRunning());
   2199   core()->OnWasShown();
   2200   EXPECT_TRUE(timer()->IsRunning());
   2201 }
   2202 
   2203 TEST_F(NetErrorHelperCoreAutoReloadTest, HiddenWhileOnline) {
   2204   SetUpCore(true, true, true);
   2205   core()->NetworkStateChanged(false);
   2206   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2207   EXPECT_FALSE(timer()->IsRunning());
   2208   core()->OnWasHidden();
   2209   core()->NetworkStateChanged(true);
   2210   EXPECT_FALSE(timer()->IsRunning());
   2211   core()->NetworkStateChanged(false);
   2212   core()->OnWasShown();
   2213   EXPECT_FALSE(timer()->IsRunning());
   2214   core()->NetworkStateChanged(true);
   2215   EXPECT_TRUE(timer()->IsRunning());
   2216   core()->NetworkStateChanged(false);
   2217   core()->OnWasHidden();
   2218   EXPECT_FALSE(timer()->IsRunning());
   2219   core()->NetworkStateChanged(true);
   2220   EXPECT_FALSE(timer()->IsRunning());
   2221   core()->OnWasShown();
   2222   EXPECT_TRUE(timer()->IsRunning());
   2223 }
   2224 
   2225 TEST_F(NetErrorHelperCoreAutoReloadTest, ShownWhileNotReloading) {
   2226   SetUpCore(true, true, false);
   2227   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2228   EXPECT_FALSE(timer()->IsRunning());
   2229   core()->OnWasShown();
   2230   EXPECT_TRUE(timer()->IsRunning());
   2231 }
   2232 
   2233 class NetErrorHelperCoreHistogramTest
   2234     : public NetErrorHelperCoreAutoReloadTest {
   2235  public:
   2236   virtual void SetUp() OVERRIDE {
   2237     NetErrorHelperCoreAutoReloadTest::SetUp();
   2238   }
   2239 
   2240   static const char kCountAtStop[];
   2241   static const char kErrorAtStop[];
   2242   static const char kCountAtSuccess[];
   2243   static const char kErrorAtSuccess[];
   2244   static const char kErrorAtFirstSuccess[];
   2245 
   2246  protected:
   2247   base::HistogramTester histogram_tester_;
   2248 };
   2249 
   2250 const char NetErrorHelperCoreHistogramTest::kCountAtStop[] =
   2251     "Net.AutoReload.CountAtStop";
   2252 const char NetErrorHelperCoreHistogramTest::kErrorAtStop[] =
   2253     "Net.AutoReload.ErrorAtStop";
   2254 const char NetErrorHelperCoreHistogramTest::kCountAtSuccess[] =
   2255     "Net.AutoReload.CountAtSuccess";
   2256 const char NetErrorHelperCoreHistogramTest::kErrorAtSuccess[] =
   2257     "Net.AutoReload.ErrorAtSuccess";
   2258 const char NetErrorHelperCoreHistogramTest::kErrorAtFirstSuccess[] =
   2259     "Net.AutoReload.ErrorAtFirstSuccess";
   2260 
   2261 // Test that the success histograms are updated when auto-reload succeeds at the
   2262 // first attempt, and that the failure histograms are not updated.
   2263 TEST_F(NetErrorHelperCoreHistogramTest, SuccessAtFirstAttempt) {
   2264   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2265   timer()->Fire();
   2266   DoSuccessLoad();
   2267 
   2268   // All of CountAtSuccess, ErrorAtSuccess, and ErrorAtFirstSuccess should
   2269   // reflect this successful load. The failure histograms should be unchanged.
   2270   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1);
   2271   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1);
   2272   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1);
   2273   histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
   2274   histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
   2275 }
   2276 
   2277 // Test that the success histograms are updated when auto-reload succeeds but
   2278 // not on the first attempt, and that the first-success histogram is not
   2279 // updated.
   2280 TEST_F(NetErrorHelperCoreHistogramTest, SuccessAtSecondAttempt) {
   2281   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2282   timer()->Fire();
   2283   EXPECT_TRUE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
   2284                                              default_url()));
   2285 //  DoErrorLoad(net::ERR_CONNECTION_RESET);
   2286   timer()->Fire();
   2287   DoSuccessLoad();
   2288 
   2289   // CountAtSuccess and ErrorAtSuccess should reflect this successful load, but
   2290   // not ErrorAtFirstSuccess since it wasn't a first success.
   2291   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1);
   2292   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1);
   2293   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
   2294   histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
   2295   histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
   2296 }
   2297 
   2298 // Test that a user stop (caused by the user pressing the 'Stop' button)
   2299 // registers as an auto-reload failure if an auto-reload attempt is in flight.
   2300 // Note that "user stop" is also caused by a cross-process navigation, for which
   2301 // the browser process will send an OnStop to the old process.
   2302 TEST_F(NetErrorHelperCoreHistogramTest, UserStop) {
   2303   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2304   timer()->Fire();
   2305   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2306                      NetErrorHelperCore::NON_ERROR_PAGE);
   2307   core()->OnStop();
   2308 
   2309   // CountAtStop and ErrorAtStop should reflect the failure.
   2310   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
   2311   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
   2312   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
   2313   histogram_tester_.ExpectTotalCount(kCountAtStop, 1);
   2314   histogram_tester_.ExpectTotalCount(kErrorAtStop, 1);
   2315 }
   2316 
   2317 // Test that a user stop (caused by the user pressing the 'Stop' button)
   2318 // registers as an auto-reload failure even if an auto-reload attempt has not
   2319 // been launched yet (i.e., if the timer is running, but no reload is in
   2320 // flight), because this means auto-reload didn't successfully replace the error
   2321 // page.
   2322 TEST_F(NetErrorHelperCoreHistogramTest, OtherPageLoaded) {
   2323   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2324   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2325                      NetErrorHelperCore::NON_ERROR_PAGE);
   2326   core()->OnStop();
   2327 
   2328   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
   2329   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
   2330   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
   2331   histogram_tester_.ExpectTotalCount(kCountAtStop, 1);
   2332   histogram_tester_.ExpectTotalCount(kErrorAtStop, 1);
   2333 }
   2334 
   2335 // Test that a commit of a different URL (caused by the user navigating to a
   2336 // different page) with an auto-reload attempt in flight registers as an
   2337 // auto-reload failure.
   2338 TEST_F(NetErrorHelperCoreHistogramTest, OtherPageLoadedAfterTimerFires) {
   2339   const GURL kTestUrl("https://anotherurl");
   2340   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2341   timer()->Fire();
   2342   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2343                      NetErrorHelperCore::NON_ERROR_PAGE);
   2344   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME,
   2345                       kTestUrl);
   2346   core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
   2347 
   2348   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
   2349   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
   2350   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
   2351   histogram_tester_.ExpectTotalCount(kCountAtStop, 1);
   2352   histogram_tester_.ExpectTotalCount(kErrorAtStop, 1);
   2353 }
   2354 
   2355 // Test that a commit of the same URL with an auto-reload attempt in flight
   2356 // registers as an auto-reload success.
   2357 TEST_F(NetErrorHelperCoreHistogramTest, SamePageLoadedAfterTimerFires) {
   2358   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2359   timer()->Fire();
   2360   DoSuccessLoad();
   2361 
   2362   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1);
   2363   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1);
   2364   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1);
   2365   histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
   2366   histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
   2367 }
   2368 
   2369 TEST_F(NetErrorHelperCoreHistogramTest, SamePageLoadedAfterLoadStarts) {
   2370   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2371   timer()->Fire();
   2372   // Autoreload attempt starts
   2373   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2374                      NetErrorHelperCore::NON_ERROR_PAGE);
   2375   // User does a manual reload
   2376   DoSuccessLoad();
   2377 
   2378   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 1);
   2379   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 1);
   2380   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 1);
   2381   histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
   2382   histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
   2383 }
   2384 
   2385 // In this test case, the user presses the reload button manually after an
   2386 // auto-reload fails and the error page is suppressed.
   2387 TEST_F(NetErrorHelperCoreHistogramTest, ErrorPageLoadedAfterTimerFires) {
   2388   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2389   timer()->Fire();
   2390   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2391                      NetErrorHelperCore::NON_ERROR_PAGE);
   2392   EXPECT_TRUE(core()->ShouldSuppressErrorPage(NetErrorHelperCore::MAIN_FRAME,
   2393                                              default_url()));
   2394   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2395 
   2396   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
   2397   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
   2398   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
   2399   histogram_tester_.ExpectTotalCount(kCountAtStop, 0);
   2400   histogram_tester_.ExpectTotalCount(kErrorAtStop, 0);
   2401 }
   2402 
   2403 TEST_F(NetErrorHelperCoreHistogramTest, SuccessPageLoadedBeforeTimerFires) {
   2404   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2405   core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
   2406                      NetErrorHelperCore::NON_ERROR_PAGE);
   2407   core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME,
   2408                       GURL(kFailedHttpsUrl));
   2409 
   2410   histogram_tester_.ExpectTotalCount(kCountAtSuccess, 0);
   2411   histogram_tester_.ExpectTotalCount(kErrorAtSuccess, 0);
   2412   histogram_tester_.ExpectTotalCount(kErrorAtFirstSuccess, 0);
   2413   histogram_tester_.ExpectTotalCount(kCountAtStop, 1);
   2414   histogram_tester_.ExpectTotalCount(kErrorAtStop, 1);
   2415 }
   2416 
   2417 
   2418 TEST_F(NetErrorHelperCoreTest, ExplicitReloadSucceeds) {
   2419   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2420   EXPECT_EQ(0, reload_count());
   2421   core()->ExecuteButtonPress(NetErrorHelperCore::RELOAD_BUTTON);
   2422   EXPECT_EQ(1, reload_count());
   2423 }
   2424 
   2425 TEST_F(NetErrorHelperCoreTest, ExplicitLoadStaleSucceeds) {
   2426   DoErrorLoad(net::ERR_CONNECTION_RESET);
   2427   EXPECT_EQ(0, load_stale_count());
   2428   core()->ExecuteButtonPress(NetErrorHelperCore::LOAD_STALE_BUTTON);
   2429   EXPECT_EQ(1, load_stale_count());
   2430   EXPECT_EQ(GURL(kFailedUrl), load_stale_url());
   2431 }
   2432 
   2433 } // namespace
   2434