Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(897)

Side by Side Diff: chrome/browser/android/offline_pages/prerendering_offliner.cc

Issue 2818783002: [Offline pages]: Implement background loader to save on last retry, and record last retry success U… (Closed)
Patch Set: Resolving code review comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698