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