| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "chrome/browser/android/offline_pages/prerendering_offliner.h" | 5 #include "chrome/browser/android/offline_pages/prerendering_offliner.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
| 9 #include "base/sys_info.h" | 9 #include "base/sys_info.h" |
| 10 #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" | 10 #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 | 31 |
| 32 PrerenderingOffliner::PrerenderingOffliner( | 32 PrerenderingOffliner::PrerenderingOffliner( |
| 33 content::BrowserContext* browser_context, | 33 content::BrowserContext* browser_context, |
| 34 const OfflinerPolicy* policy, | 34 const OfflinerPolicy* policy, |
| 35 OfflinePageModel* offline_page_model) | 35 OfflinePageModel* offline_page_model) |
| 36 : browser_context_(browser_context), | 36 : browser_context_(browser_context), |
| 37 policy_(policy), | 37 policy_(policy), |
| 38 offline_page_model_(offline_page_model), | 38 offline_page_model_(offline_page_model), |
| 39 pending_request_(nullptr), | 39 pending_request_(nullptr), |
| 40 is_low_end_device_(base::SysInfo::IsLowEndDevice()), | 40 is_low_end_device_(base::SysInfo::IsLowEndDevice()), |
| 41 saved_on_last_retry_(false), |
| 41 app_listener_(nullptr), | 42 app_listener_(nullptr), |
| 42 weak_ptr_factory_(this) {} | 43 weak_ptr_factory_(this) {} |
| 43 | 44 |
| 44 PrerenderingOffliner::~PrerenderingOffliner() {} | 45 PrerenderingOffliner::~PrerenderingOffliner() {} |
| 45 | 46 |
| 46 void PrerenderingOffliner::OnNetworkProgress(const SavePageRequest& request, | 47 void PrerenderingOffliner::OnNetworkProgress(const SavePageRequest& request, |
| 47 int64_t bytes) { | 48 int64_t bytes) { |
| 48 if (!pending_request_ || !progress_callback_) | 49 if (!pending_request_ || !progress_callback_) |
| 49 return; | 50 return; |
| 50 | 51 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 | 152 |
| 152 // Clear pending request and app listener here and then inform loader we | 153 // Clear pending request and app listener here and then inform loader we |
| 153 // are done with WebContents. | 154 // are done with WebContents. |
| 154 pending_request_.reset(nullptr); | 155 pending_request_.reset(nullptr); |
| 155 app_listener_.reset(nullptr); | 156 app_listener_.reset(nullptr); |
| 156 GetOrCreateLoader()->StopLoading(); | 157 GetOrCreateLoader()->StopLoading(); |
| 157 | 158 |
| 158 // Determine status and run the completion callback. | 159 // Determine status and run the completion callback. |
| 159 Offliner::RequestStatus save_status; | 160 Offliner::RequestStatus save_status; |
| 160 if (save_result == SavePageResult::SUCCESS) { | 161 if (save_result == SavePageResult::SUCCESS) { |
| 161 save_status = RequestStatus::SAVED; | 162 if (saved_on_last_retry_) |
| 163 save_status = RequestStatus::SAVED_ON_LAST_RETRY; |
| 164 else |
| 165 save_status = RequestStatus::SAVED; |
| 162 } else { | 166 } else { |
| 163 // TODO(dougarnett): Consider reflecting some recommendation to retry the | 167 // TODO(dougarnett): Consider reflecting some recommendation to retry the |
| 164 // request based on specific save error cases. | 168 // request based on specific save error cases. |
| 165 save_status = RequestStatus::SAVE_FAILED; | 169 save_status = RequestStatus::SAVE_FAILED; |
| 166 } | 170 } |
| 171 saved_on_last_retry_ = false; |
| 167 completion_callback_.Run(request, save_status); | 172 completion_callback_.Run(request, save_status); |
| 168 } | 173 } |
| 169 | 174 |
| 170 bool PrerenderingOffliner::LoadAndSave( | 175 bool PrerenderingOffliner::LoadAndSave( |
| 171 const SavePageRequest& request, | 176 const SavePageRequest& request, |
| 172 const CompletionCallback& completion_callback, | 177 const CompletionCallback& completion_callback, |
| 173 const ProgressCallback& progress_callback) { | 178 const ProgressCallback& progress_callback) { |
| 174 DCHECK(!pending_request_.get()); | 179 DCHECK(!pending_request_.get()); |
| 175 | 180 |
| 176 if (pending_request_) { | 181 if (pending_request_) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 | 228 |
| 224 if (!OfflinePageModel::CanSaveURL(request.url())) { | 229 if (!OfflinePageModel::CanSaveURL(request.url())) { |
| 225 DVLOG(1) << "Not able to save page for requested url: " << request.url(); | 230 DVLOG(1) << "Not able to save page for requested url: " << request.url(); |
| 226 return false; | 231 return false; |
| 227 } | 232 } |
| 228 | 233 |
| 229 // Track copy of pending request for callback handling. | 234 // Track copy of pending request for callback handling. |
| 230 pending_request_.reset(new SavePageRequest(request)); | 235 pending_request_.reset(new SavePageRequest(request)); |
| 231 completion_callback_ = completion_callback; | 236 completion_callback_ = completion_callback; |
| 232 progress_callback_ = progress_callback; | 237 progress_callback_ = progress_callback; |
| 238 saved_on_last_retry_ = false; |
| 233 | 239 |
| 234 // Kick off load page attempt. | 240 // Kick off load page attempt. |
| 235 bool accepted = GetOrCreateLoader()->LoadPage( | 241 bool accepted = GetOrCreateLoader()->LoadPage( |
| 236 request.url(), base::Bind(&PrerenderingOffliner::OnLoadPageDone, | 242 request.url(), base::Bind(&PrerenderingOffliner::OnLoadPageDone, |
| 237 weak_ptr_factory_.GetWeakPtr(), request), | 243 weak_ptr_factory_.GetWeakPtr(), request), |
| 238 base::Bind(&PrerenderingOffliner::OnNetworkProgress, | 244 base::Bind(&PrerenderingOffliner::OnNetworkProgress, |
| 239 weak_ptr_factory_.GetWeakPtr(), request)); | 245 weak_ptr_factory_.GetWeakPtr(), request)); |
| 240 if (!accepted) { | 246 if (!accepted) { |
| 241 pending_request_.reset(nullptr); | 247 pending_request_.reset(nullptr); |
| 242 } else { | 248 } else { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 261 callback.Run(request_id); | 267 callback.Run(request_id); |
| 262 } | 268 } |
| 263 | 269 |
| 264 bool PrerenderingOffliner::HandleTimeout(const SavePageRequest& request) { | 270 bool PrerenderingOffliner::HandleTimeout(const SavePageRequest& request) { |
| 265 if (pending_request_) { | 271 if (pending_request_) { |
| 266 DCHECK(request.request_id() == pending_request_->request_id()); | 272 DCHECK(request.request_id() == pending_request_->request_id()); |
| 267 if (GetOrCreateLoader()->IsLowbarMet() && | 273 if (GetOrCreateLoader()->IsLowbarMet() && |
| 268 (request.started_attempt_count() + 1 >= policy_->GetMaxStartedTries() || | 274 (request.started_attempt_count() + 1 >= policy_->GetMaxStartedTries() || |
| 269 request.completed_attempt_count() + 1 >= | 275 request.completed_attempt_count() + 1 >= |
| 270 policy_->GetMaxCompletedTries())) { | 276 policy_->GetMaxCompletedTries())) { |
| 277 saved_on_last_retry_ = true; |
| 271 GetOrCreateLoader()->StartSnapshot(); | 278 GetOrCreateLoader()->StartSnapshot(); |
| 272 return true; | 279 return true; |
| 273 } | 280 } |
| 274 } | 281 } |
| 275 return false; | 282 return false; |
| 276 } | 283 } |
| 277 | 284 |
| 278 void PrerenderingOffliner::SetLoaderForTesting( | 285 void PrerenderingOffliner::SetLoaderForTesting( |
| 279 std::unique_ptr<PrerenderingLoader> loader) { | 286 std::unique_ptr<PrerenderingLoader> loader) { |
| 280 DCHECK(!loader_); | 287 DCHECK(!loader_); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 void PrerenderingOffliner::HandleApplicationStateChangeCancel( | 330 void PrerenderingOffliner::HandleApplicationStateChangeCancel( |
| 324 const SavePageRequest& request, | 331 const SavePageRequest& request, |
| 325 int64_t offline_id) { | 332 int64_t offline_id) { |
| 326 // This shouldn't be immediate, but account for case where request was reset | 333 // This shouldn't be immediate, but account for case where request was reset |
| 327 // while waiting for callback. | 334 // while waiting for callback. |
| 328 if (pending_request_ && pending_request_->request_id() != offline_id) | 335 if (pending_request_ && pending_request_->request_id() != offline_id) |
| 329 return; | 336 return; |
| 330 completion_callback_.Run(request, RequestStatus::FOREGROUND_CANCELED); | 337 completion_callback_.Run(request, RequestStatus::FOREGROUND_CANCELED); |
| 331 } | 338 } |
| 332 } // namespace offline_pages | 339 } // namespace offline_pages |
| OLD | NEW |