Chromium Code Reviews| Index: chrome/browser/android/offline_pages/background_loader_offliner.cc |
| diff --git a/chrome/browser/android/offline_pages/background_loader_offliner.cc b/chrome/browser/android/offline_pages/background_loader_offliner.cc |
| index 89d11b6df9f7a9ae0c280b15480b0b409a7355cb..a4033757c2b77b143bd47c7aa160e5e5dcb49d95 100644 |
| --- a/chrome/browser/android/offline_pages/background_loader_offliner.cc |
| +++ b/chrome/browser/android/offline_pages/background_loader_offliner.cc |
| @@ -13,6 +13,7 @@ |
| #include "components/offline_pages/core/client_namespace_constants.h" |
| #include "components/offline_pages/core/offline_page_model.h" |
| #include "content/public/browser/browser_context.h" |
| +#include "content/public/browser/navigation_handle.h" |
| #include "content/public/browser/web_contents.h" |
| namespace offline_pages { |
| @@ -25,6 +26,7 @@ BackgroundLoaderOffliner::BackgroundLoaderOffliner( |
| offline_page_model_(offline_page_model), |
| is_low_end_device_(base::SysInfo::IsLowEndDevice()), |
| save_state_(NONE), |
| + page_load_state_(SUCCESS), |
| weak_ptr_factory_(this) { |
| DCHECK(offline_page_model_); |
| DCHECK(browser_context_); |
| @@ -127,8 +129,21 @@ void BackgroundLoaderOffliner::DidStopLoading() { |
| return; |
| } |
| - save_state_ = SAVING; |
| SavePageRequest request(*pending_request_.get()); |
| + // If there was an error navigating to page, return loading failed. |
| + if (page_load_state_ != SUCCESS) { |
| + Offliner::RequestStatus status = |
| + Offliner::RequestStatus::LOADING_FAILED_NO_RETRY; |
| + if (page_load_state_ == RETRIABLE) |
| + status = Offliner::RequestStatus::LOADING_FAILED; |
| + completion_callback_.Run( |
| + request, |
| + status); |
| + ResetState(); |
| + return; |
| + } |
| + |
| + save_state_ = SAVING; |
| content::WebContents* web_contents( |
| content::WebContentsObserver::web_contents()); |
| @@ -169,12 +184,51 @@ void BackgroundLoaderOffliner::RenderProcessGone( |
| void BackgroundLoaderOffliner::WebContentsDestroyed() { |
| if (pending_request_) { |
| SavePageRequest request(*pending_request_.get()); |
| - completion_callback_.Run(*pending_request_.get(), |
| + completion_callback_.Run(request, |
| Offliner::RequestStatus::LOADING_FAILED); |
| ResetState(); |
| } |
| } |
| +void BackgroundLoaderOffliner::DidFinishNavigation( |
| + content::NavigationHandle* navigation_handle) { |
| + // If there was an error of any kind (certificate, client, DNS, etc), |
| + // Mark as error page. Resetting here causes RecordNavigationMetrics to crash. |
| + if (navigation_handle->IsErrorPage()) { |
| + // TODO(chili): we need to UMA this. |
| + switch (navigation_handle->GetNetErrorCode()) { |
| + case ACCESS_DENIED: |
| + case ADDRESS_INVALID: |
| + case ADDRESS_UNREACHABLE: |
| + case CERT_COMMON_NAME_INVALID: |
| + case CERT_AUTHORITY_INVALID: |
| + case CERT_CONTAINS_ERRORS: |
| + case CERT_INVALID: |
| + case CONNECTION_FAILED: |
| + case DISALLOWED_URL_SCHEME: |
| + case DNS_SERVER_FAILED: |
| + case FILE_NOT_FOUND: |
| + case FILE_PATH_TOO_LONG: |
| + case FILE_TOO_LARGE: |
| + case FILE_VIRUS_INFECTED: |
| + case INVALID_HANDLE: |
| + case INVALID_RESPONSE: |
| + case INVALID_URL: |
| + case NAME_NOT_RESOLVED: |
| + case NAME_RESOLUTION_FAILED: |
| + case MSG_TOO_BIG: |
| + case SSL_CERT_BAD_FORMAT: |
| + case SSL_CLIENT_AUTH_SIGNATURE_FAILED: |
| + case SSL_PROTOCOL_ERROR: |
| + case UNKNOWN_URL_SCHEME: |
| + page_load_state_ = LOADING_FAILED_NO_RETRY; |
| + break; |
| + default: |
| + page_load_state_ = LOADING_FAILED; |
|
Pete Williamson
2017/01/31 23:19:49
RETRIABLE?
chili
2017/02/01 00:34:59
Yes... The one time i didn't wait for compile to f
|
| + } |
| + } |
| +} |
| + |
| void BackgroundLoaderOffliner::OnPageSaved(SavePageResult save_result, |
| int64_t offline_id) { |
| if (!pending_request_) |
| @@ -201,6 +255,7 @@ void BackgroundLoaderOffliner::OnPageSaved(SavePageResult save_result, |
| void BackgroundLoaderOffliner::ResetState() { |
| pending_request_.reset(); |
| + page_load_state_ = SUCCESS; |
| // TODO(chili): Remove after RequestCoordinator can handle multiple offliners. |
| // We reset the loader and observer after completion so loaders |
| // will not be re-used across different requests/tries. This is a temporary |