| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/error_page/renderer/net_error_helper_core.h" | 5 #include "components/error_page/renderer/net_error_helper_core.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 | 370 |
| 371 } // namespace | 371 } // namespace |
| 372 | 372 |
| 373 struct NetErrorHelperCore::ErrorPageInfo { | 373 struct NetErrorHelperCore::ErrorPageInfo { |
| 374 ErrorPageInfo(blink::WebURLError error, bool was_failed_post) | 374 ErrorPageInfo(blink::WebURLError error, bool was_failed_post) |
| 375 : error(error), | 375 : error(error), |
| 376 was_failed_post(was_failed_post), | 376 was_failed_post(was_failed_post), |
| 377 needs_dns_updates(false), | 377 needs_dns_updates(false), |
| 378 needs_load_navigation_corrections(false), | 378 needs_load_navigation_corrections(false), |
| 379 reload_button_in_page(false), | 379 reload_button_in_page(false), |
| 380 load_stale_button_in_page(false), | 380 show_saved_copy_button_in_page(false), |
| 381 is_finished_loading(false), | 381 is_finished_loading(false), |
| 382 auto_reload_triggered(false) { | 382 auto_reload_triggered(false) { |
| 383 } | 383 } |
| 384 | 384 |
| 385 // Information about the failed page load. | 385 // Information about the failed page load. |
| 386 blink::WebURLError error; | 386 blink::WebURLError error; |
| 387 bool was_failed_post; | 387 bool was_failed_post; |
| 388 | 388 |
| 389 // Information about the status of the error page. | 389 // Information about the status of the error page. |
| 390 | 390 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 403 navigation_correction_params; | 403 navigation_correction_params; |
| 404 | 404 |
| 405 scoped_ptr<NavigationCorrectionResponse> navigation_correction_response; | 405 scoped_ptr<NavigationCorrectionResponse> navigation_correction_response; |
| 406 | 406 |
| 407 // All the navigation corrections that have been clicked, for tracking | 407 // All the navigation corrections that have been clicked, for tracking |
| 408 // purposes. | 408 // purposes. |
| 409 std::set<int> clicked_corrections; | 409 std::set<int> clicked_corrections; |
| 410 | 410 |
| 411 // Track if specific buttons are included in an error page, for statistics. | 411 // Track if specific buttons are included in an error page, for statistics. |
| 412 bool reload_button_in_page; | 412 bool reload_button_in_page; |
| 413 bool load_stale_button_in_page; | 413 bool show_saved_copy_button_in_page; |
| 414 | 414 |
| 415 // True if a page has completed loading, at which point it can receive | 415 // True if a page has completed loading, at which point it can receive |
| 416 // updates. | 416 // updates. |
| 417 bool is_finished_loading; | 417 bool is_finished_loading; |
| 418 | 418 |
| 419 // True if the auto-reload timer has fired and a reload is or has been in | 419 // True if the auto-reload timer has fired and a reload is or has been in |
| 420 // flight. | 420 // flight. |
| 421 bool auto_reload_triggered; | 421 bool auto_reload_triggered; |
| 422 }; | 422 }; |
| 423 | 423 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 // Track if an error occurred due to a page button press. | 540 // Track if an error occurred due to a page button press. |
| 541 // This isn't perfect; if (for instance), the server is slow responding | 541 // This isn't perfect; if (for instance), the server is slow responding |
| 542 // to a request generated from the page reload button, and the user hits | 542 // to a request generated from the page reload button, and the user hits |
| 543 // the browser reload button, this code will still believe the | 543 // the browser reload button, this code will still believe the |
| 544 // result is from the page reload button. | 544 // result is from the page reload button. |
| 545 if (committed_error_page_info_ && pending_error_page_info_ && | 545 if (committed_error_page_info_ && pending_error_page_info_ && |
| 546 navigation_from_button_ != NO_BUTTON && | 546 navigation_from_button_ != NO_BUTTON && |
| 547 committed_error_page_info_->error.unreachableURL == | 547 committed_error_page_info_->error.unreachableURL == |
| 548 pending_error_page_info_->error.unreachableURL) { | 548 pending_error_page_info_->error.unreachableURL) { |
| 549 DCHECK(navigation_from_button_ == RELOAD_BUTTON || | 549 DCHECK(navigation_from_button_ == RELOAD_BUTTON || |
| 550 navigation_from_button_ == LOAD_STALE_BUTTON); | 550 navigation_from_button_ == SHOW_SAVED_COPY_BUTTON); |
| 551 chrome_common_net::RecordEvent( | 551 chrome_common_net::RecordEvent( |
| 552 navigation_from_button_ == RELOAD_BUTTON ? | 552 navigation_from_button_ == RELOAD_BUTTON ? |
| 553 chrome_common_net::NETWORK_ERROR_PAGE_RELOAD_BUTTON_ERROR : | 553 chrome_common_net::NETWORK_ERROR_PAGE_RELOAD_BUTTON_ERROR : |
| 554 chrome_common_net::NETWORK_ERROR_PAGE_LOAD_STALE_BUTTON_ERROR); | 554 chrome_common_net::NETWORK_ERROR_PAGE_SHOW_SAVED_COPY_BUTTON_ERROR); |
| 555 } | 555 } |
| 556 navigation_from_button_ = NO_BUTTON; | 556 navigation_from_button_ = NO_BUTTON; |
| 557 | 557 |
| 558 if (committed_error_page_info_ && !pending_error_page_info_ && | 558 if (committed_error_page_info_ && !pending_error_page_info_ && |
| 559 committed_error_page_info_->auto_reload_triggered) { | 559 committed_error_page_info_->auto_reload_triggered) { |
| 560 const blink::WebURLError& error = committed_error_page_info_->error; | 560 const blink::WebURLError& error = committed_error_page_info_->error; |
| 561 const GURL& error_url = error.unreachableURL; | 561 const GURL& error_url = error.unreachableURL; |
| 562 if (url == error_url) | 562 if (url == error_url) |
| 563 ReportAutoReloadSuccess(error, auto_reload_count_); | 563 ReportAutoReloadSuccess(error, auto_reload_count_); |
| 564 else if (url != GURL(content::kUnreachableWebDataURL)) | 564 else if (url != GURL(content::kUnreachableWebDataURL)) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 577 return; | 577 return; |
| 578 } | 578 } |
| 579 | 579 |
| 580 committed_error_page_info_->is_finished_loading = true; | 580 committed_error_page_info_->is_finished_loading = true; |
| 581 | 581 |
| 582 chrome_common_net::RecordEvent(chrome_common_net::NETWORK_ERROR_PAGE_SHOWN); | 582 chrome_common_net::RecordEvent(chrome_common_net::NETWORK_ERROR_PAGE_SHOWN); |
| 583 if (committed_error_page_info_->reload_button_in_page) { | 583 if (committed_error_page_info_->reload_button_in_page) { |
| 584 chrome_common_net::RecordEvent( | 584 chrome_common_net::RecordEvent( |
| 585 chrome_common_net::NETWORK_ERROR_PAGE_RELOAD_BUTTON_SHOWN); | 585 chrome_common_net::NETWORK_ERROR_PAGE_RELOAD_BUTTON_SHOWN); |
| 586 } | 586 } |
| 587 if (committed_error_page_info_->load_stale_button_in_page) { | 587 if (committed_error_page_info_->show_saved_copy_button_in_page) { |
| 588 chrome_common_net::RecordEvent( | 588 chrome_common_net::RecordEvent( |
| 589 chrome_common_net::NETWORK_ERROR_PAGE_LOAD_STALE_BUTTON_SHOWN); | 589 chrome_common_net::NETWORK_ERROR_PAGE_SHOW_SAVED_COPY_BUTTON_SHOWN); |
| 590 } | 590 } |
| 591 | 591 |
| 592 delegate_->EnablePageHelperFunctions(); | 592 delegate_->EnablePageHelperFunctions(); |
| 593 | 593 |
| 594 if (committed_error_page_info_->needs_load_navigation_corrections) { | 594 if (committed_error_page_info_->needs_load_navigation_corrections) { |
| 595 // If there is another pending error page load, |fix_url| should have been | 595 // If there is another pending error page load, |fix_url| should have been |
| 596 // cleared. | 596 // cleared. |
| 597 DCHECK(!pending_error_page_info_); | 597 DCHECK(!pending_error_page_info_); |
| 598 DCHECK(!committed_error_page_info_->needs_dns_updates); | 598 DCHECK(!committed_error_page_info_->needs_dns_updates); |
| 599 delegate_->FetchNavigationCorrections( | 599 delegate_->FetchNavigationCorrections( |
| (...skipping 25 matching lines...) Expand all Loading... |
| 625 DCHECK(!committed_error_page_info_ || | 625 DCHECK(!committed_error_page_info_ || |
| 626 !committed_error_page_info_->needs_load_navigation_corrections); | 626 !committed_error_page_info_->needs_load_navigation_corrections); |
| 627 | 627 |
| 628 pending_error_page_info_.reset(new ErrorPageInfo(error, is_failed_post)); | 628 pending_error_page_info_.reset(new ErrorPageInfo(error, is_failed_post)); |
| 629 pending_error_page_info_->navigation_correction_params.reset( | 629 pending_error_page_info_->navigation_correction_params.reset( |
| 630 new NavigationCorrectionParams(navigation_correction_params_)); | 630 new NavigationCorrectionParams(navigation_correction_params_)); |
| 631 GetErrorHtmlForMainFrame(pending_error_page_info_.get(), error_html); | 631 GetErrorHtmlForMainFrame(pending_error_page_info_.get(), error_html); |
| 632 } else { | 632 } else { |
| 633 // These values do not matter, as error pages in iframes hide the buttons. | 633 // These values do not matter, as error pages in iframes hide the buttons. |
| 634 bool reload_button_in_page; | 634 bool reload_button_in_page; |
| 635 bool load_stale_button_in_page; | 635 bool show_saved_copy_button_in_page; |
| 636 | 636 |
| 637 delegate_->GenerateLocalizedErrorPage( | 637 delegate_->GenerateLocalizedErrorPage( |
| 638 error, is_failed_post, scoped_ptr<ErrorPageParams>(), | 638 error, is_failed_post, scoped_ptr<ErrorPageParams>(), |
| 639 &reload_button_in_page, &load_stale_button_in_page, | 639 &reload_button_in_page, &show_saved_copy_button_in_page, |
| 640 error_html); | 640 error_html); |
| 641 } | 641 } |
| 642 } | 642 } |
| 643 | 643 |
| 644 void NetErrorHelperCore::OnNetErrorInfo( | 644 void NetErrorHelperCore::OnNetErrorInfo( |
| 645 chrome_common_net::DnsProbeStatus status) { | 645 chrome_common_net::DnsProbeStatus status) { |
| 646 DCHECK_NE(chrome_common_net::DNS_PROBE_POSSIBLE, status); | 646 DCHECK_NE(chrome_common_net::DNS_PROBE_POSSIBLE, status); |
| 647 | 647 |
| 648 last_probe_status_ = status; | 648 last_probe_status_ = status; |
| 649 | 649 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 // will just get the results for the next page load. | 690 // will just get the results for the next page load. |
| 691 last_probe_status_ = chrome_common_net::DNS_PROBE_POSSIBLE; | 691 last_probe_status_ = chrome_common_net::DNS_PROBE_POSSIBLE; |
| 692 pending_error_page_info->needs_dns_updates = true; | 692 pending_error_page_info->needs_dns_updates = true; |
| 693 error = GetUpdatedError(error); | 693 error = GetUpdatedError(error); |
| 694 } | 694 } |
| 695 | 695 |
| 696 delegate_->GenerateLocalizedErrorPage( | 696 delegate_->GenerateLocalizedErrorPage( |
| 697 error, pending_error_page_info->was_failed_post, | 697 error, pending_error_page_info->was_failed_post, |
| 698 scoped_ptr<ErrorPageParams>(), | 698 scoped_ptr<ErrorPageParams>(), |
| 699 &pending_error_page_info->reload_button_in_page, | 699 &pending_error_page_info->reload_button_in_page, |
| 700 &pending_error_page_info->load_stale_button_in_page, | 700 &pending_error_page_info->show_saved_copy_button_in_page, |
| 701 error_html); | 701 error_html); |
| 702 } | 702 } |
| 703 | 703 |
| 704 void NetErrorHelperCore::UpdateErrorPage() { | 704 void NetErrorHelperCore::UpdateErrorPage() { |
| 705 DCHECK(committed_error_page_info_->needs_dns_updates); | 705 DCHECK(committed_error_page_info_->needs_dns_updates); |
| 706 DCHECK(committed_error_page_info_->is_finished_loading); | 706 DCHECK(committed_error_page_info_->is_finished_loading); |
| 707 DCHECK_NE(chrome_common_net::DNS_PROBE_POSSIBLE, last_probe_status_); | 707 DCHECK_NE(chrome_common_net::DNS_PROBE_POSSIBLE, last_probe_status_); |
| 708 | 708 |
| 709 UMA_HISTOGRAM_ENUMERATION("DnsProbe.ErrorPageUpdateStatus", | 709 UMA_HISTOGRAM_ENUMERATION("DnsProbe.ErrorPageUpdateStatus", |
| 710 last_probe_status_, | 710 last_probe_status_, |
| 711 chrome_common_net::DNS_PROBE_MAX); | 711 chrome_common_net::DNS_PROBE_MAX); |
| 712 // Every status other than DNS_PROBE_POSSIBLE and DNS_PROBE_STARTED is a | 712 // Every status other than DNS_PROBE_POSSIBLE and DNS_PROBE_STARTED is a |
| 713 // final status code. Once one is reached, the page does not need further | 713 // final status code. Once one is reached, the page does not need further |
| 714 // updates. | 714 // updates. |
| 715 if (last_probe_status_ != chrome_common_net::DNS_PROBE_STARTED) | 715 if (last_probe_status_ != chrome_common_net::DNS_PROBE_STARTED) |
| 716 committed_error_page_info_->needs_dns_updates = false; | 716 committed_error_page_info_->needs_dns_updates = false; |
| 717 | 717 |
| 718 // There is no need to worry about the button display statistics here because | 718 // There is no need to worry about the button display statistics here because |
| 719 // the presentation of the reload and load stale buttons can't be changed | 719 // the presentation of the reload and show saved copy buttons can't be changed |
| 720 // by a DNS error update. | 720 // by a DNS error update. |
| 721 delegate_->UpdateErrorPage( | 721 delegate_->UpdateErrorPage( |
| 722 GetUpdatedError(committed_error_page_info_->error), | 722 GetUpdatedError(committed_error_page_info_->error), |
| 723 committed_error_page_info_->was_failed_post); | 723 committed_error_page_info_->was_failed_post); |
| 724 } | 724 } |
| 725 | 725 |
| 726 void NetErrorHelperCore::OnNavigationCorrectionsFetched( | 726 void NetErrorHelperCore::OnNavigationCorrectionsFetched( |
| 727 const std::string& corrections, | 727 const std::string& corrections, |
| 728 const std::string& accept_languages, | 728 const std::string& accept_languages, |
| 729 bool is_rtl) { | 729 bool is_rtl) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 751 params = CreateErrorPageParams( | 751 params = CreateErrorPageParams( |
| 752 *pending_error_page_info_->navigation_correction_response, | 752 *pending_error_page_info_->navigation_correction_response, |
| 753 pending_error_page_info_->error, | 753 pending_error_page_info_->error, |
| 754 *pending_error_page_info_->navigation_correction_params, | 754 *pending_error_page_info_->navigation_correction_params, |
| 755 accept_languages, is_rtl); | 755 accept_languages, is_rtl); |
| 756 delegate_->GenerateLocalizedErrorPage( | 756 delegate_->GenerateLocalizedErrorPage( |
| 757 pending_error_page_info_->error, | 757 pending_error_page_info_->error, |
| 758 pending_error_page_info_->was_failed_post, | 758 pending_error_page_info_->was_failed_post, |
| 759 params.Pass(), | 759 params.Pass(), |
| 760 &pending_error_page_info_->reload_button_in_page, | 760 &pending_error_page_info_->reload_button_in_page, |
| 761 &pending_error_page_info_->load_stale_button_in_page, | 761 &pending_error_page_info_->show_saved_copy_button_in_page, |
| 762 &error_html); | 762 &error_html); |
| 763 } else { | 763 } else { |
| 764 // Since |navigation_correction_params| in |pending_error_page_info_| is | 764 // Since |navigation_correction_params| in |pending_error_page_info_| is |
| 765 // NULL, this won't trigger another attempt to load corrections. | 765 // NULL, this won't trigger another attempt to load corrections. |
| 766 GetErrorHtmlForMainFrame(pending_error_page_info_.get(), &error_html); | 766 GetErrorHtmlForMainFrame(pending_error_page_info_.get(), &error_html); |
| 767 } | 767 } |
| 768 | 768 |
| 769 // TODO(mmenke): Once the new API is in place, look into replacing this | 769 // TODO(mmenke): Once the new API is in place, look into replacing this |
| 770 // double page load by just updating the error page, like DNS | 770 // double page load by just updating the error page, like DNS |
| 771 // probes do. | 771 // probes do. |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 } | 890 } |
| 891 | 891 |
| 892 void NetErrorHelperCore::ExecuteButtonPress(Button button) { | 892 void NetErrorHelperCore::ExecuteButtonPress(Button button) { |
| 893 switch (button) { | 893 switch (button) { |
| 894 case RELOAD_BUTTON: | 894 case RELOAD_BUTTON: |
| 895 chrome_common_net::RecordEvent( | 895 chrome_common_net::RecordEvent( |
| 896 chrome_common_net::NETWORK_ERROR_PAGE_RELOAD_BUTTON_CLICKED); | 896 chrome_common_net::NETWORK_ERROR_PAGE_RELOAD_BUTTON_CLICKED); |
| 897 navigation_from_button_ = RELOAD_BUTTON; | 897 navigation_from_button_ = RELOAD_BUTTON; |
| 898 Reload(); | 898 Reload(); |
| 899 return; | 899 return; |
| 900 case LOAD_STALE_BUTTON: | 900 case SHOW_SAVED_COPY_BUTTON: |
| 901 chrome_common_net::RecordEvent( | 901 chrome_common_net::RecordEvent( |
| 902 chrome_common_net::NETWORK_ERROR_PAGE_LOAD_STALE_BUTTON_CLICKED); | 902 chrome_common_net::NETWORK_ERROR_PAGE_SHOW_SAVED_COPY_BUTTON_CLICKED); |
| 903 navigation_from_button_ = LOAD_STALE_BUTTON; | 903 navigation_from_button_ = SHOW_SAVED_COPY_BUTTON; |
| 904 delegate_->LoadPageFromCache( | 904 delegate_->LoadPageFromCache( |
| 905 committed_error_page_info_->error.unreachableURL); | 905 committed_error_page_info_->error.unreachableURL); |
| 906 return; | 906 return; |
| 907 case MORE_BUTTON: | 907 case MORE_BUTTON: |
| 908 // Visual effects on page are handled in Javascript code. | 908 // Visual effects on page are handled in Javascript code. |
| 909 chrome_common_net::RecordEvent( | 909 chrome_common_net::RecordEvent( |
| 910 chrome_common_net::NETWORK_ERROR_PAGE_MORE_BUTTON_CLICKED); | 910 chrome_common_net::NETWORK_ERROR_PAGE_MORE_BUTTON_CLICKED); |
| 911 return; | 911 return; |
| 912 case NO_BUTTON: | 912 case NO_BUTTON: |
| 913 NOTREACHED(); | 913 NOTREACHED(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 committed_error_page_info_->error, | 945 committed_error_page_info_->error, |
| 946 *committed_error_page_info_->navigation_correction_params, | 946 *committed_error_page_info_->navigation_correction_params, |
| 947 *response, | 947 *response, |
| 948 *response->corrections[tracking_id]); | 948 *response->corrections[tracking_id]); |
| 949 delegate_->SendTrackingRequest( | 949 delegate_->SendTrackingRequest( |
| 950 committed_error_page_info_->navigation_correction_params->url, | 950 committed_error_page_info_->navigation_correction_params->url, |
| 951 request_body); | 951 request_body); |
| 952 } | 952 } |
| 953 | 953 |
| 954 } // namespace error_page | 954 } // namespace error_page |
| OLD | NEW |