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

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

Issue 2007783002: Adds PrerenderingOffliner implementation for handling Loader callbacks and then performing SavePage… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ploader
Patch Set: Backed out mocked Offliner save methods and SavePage tests and addressed some other feedback Created 4 years, 7 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 "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h"
8 #include "components/offline_pages/background/save_page_request.h" 9 #include "components/offline_pages/background/save_page_request.h"
9 #include "content/public/browser/browser_context.h" 10 #include "content/public/browser/browser_context.h"
10 11
11 namespace offline_pages { 12 namespace offline_pages {
12 13
13 PrerenderingOffliner::PrerenderingOffliner( 14 PrerenderingOffliner::PrerenderingOffliner(
14 content::BrowserContext* browser_context, 15 content::BrowserContext* browser_context,
15 const OfflinerPolicy* policy, 16 const OfflinerPolicy* policy,
16 OfflinePageModel* offline_page_model) 17 OfflinePageModel* offline_page_model)
17 : browser_context_(browser_context), 18 : browser_context_(browser_context),
18 offline_page_model_(offline_page_model), 19 offline_page_model_(offline_page_model),
20 pending_request_(nullptr),
19 weak_ptr_factory_(this) {} 21 weak_ptr_factory_(this) {}
20 22
21 PrerenderingOffliner::~PrerenderingOffliner() {} 23 PrerenderingOffliner::~PrerenderingOffliner() {}
22 24
23 void PrerenderingOffliner::OnLoadPageDone(Offliner::RequestStatus load_status, 25 void PrerenderingOffliner::OnLoadPageDone(
24 content::WebContents* contents) { 26 const SavePageRequest& request,
25 // TODO(dougarnett): Implement save attempt and running CompletionCallback. 27 const CompletionCallback& completion_callback,
28 Offliner::RequestStatus load_status,
29 content::WebContents* web_contents) {
30 // Check if request is still pending receiving a callback.
31 // Note: it is possible to get a loaded page, start the save operation,
32 // and then get another callback from the Loader (eg, if its loaded
33 // WebContents is being destroyed for some resource reclamation).
34 if (!pending_request_)
35 return;
36
37 CHECK_EQ(request.request_id(), pending_request_->request_id());
Pete Williamson 2016/05/25 18:34:38 I'm not sure we need to crash in release if we get
dougarnett 2016/05/26 17:07:06 Trying combo of DCHECK and conditional to ignore.
38
39 if (load_status == Offliner::RequestStatus::LOADED) {
40 // The page has successfully loaded so now try to save the page.
41 // After issuing the save request we will wait for either: the save
42 // callback or a CANCELED load callback (triggered because the loaded
43 // WebContents are being destroyed) - whichever callback occurs first.
44 DCHECK(web_contents);
45 std::unique_ptr<OfflinePageArchiver> archiver(
46 new OfflinePageMHTMLArchiver(web_contents));
47 SavePage(request.url(), request.client_id(), std::move(archiver),
48 base::Bind(&PrerenderingOffliner::OnSavePageDone,
49 weak_ptr_factory_.GetWeakPtr(), request,
50 completion_callback));
51 } else {
52 // Clear pending request and then run the completion callback.
53 pending_request_ = nullptr;
54 completion_callback.Run(request, load_status);
55 }
56 }
57
58 void PrerenderingOffliner::OnSavePageDone(
59 const SavePageRequest& request,
60 const CompletionCallback& completion_callback,
61 SavePageResult save_result,
62 int64_t offline_id) {
63 // Check if request is still pending receiving a callback.
64 if (!pending_request_)
65 return;
66
67 // Also check that save callback is for same request as pending request
68 // (since SavePage request is not cancel-able currently and could be old).
69 if (request.request_id() != pending_request_->request_id()) {
70 DVLOG(1) << "Ignoring save callback for old request";
71 return;
72 }
73
74 // Clear pending request here and inform loader we are done with WebContents.
75 pending_request_ = nullptr;
76 GetOrCreateLoader()->StopLoading();
77
78 // Determine status and run the completion callback.
79 Offliner::RequestStatus save_status;
80 if (save_result == SavePageResult::SUCCESS) {
81 save_status = RequestStatus::SAVED;
82 } else {
83 // TODO(dougarnett): Consider reflecting some recommendation to retry the
84 // request based on specific save error cases.
85 save_status = RequestStatus::FAILED_SAVE;
86 }
87 completion_callback.Run(request, save_status);
26 } 88 }
27 89
28 bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request, 90 bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request,
29 const CompletionCallback& callback) { 91 const CompletionCallback& callback) {
30 if (!offline_page_model_->CanSavePage(request.url())) 92 if (pending_request_) {
93 DVLOG(1) << "Already have pending request";
31 return false; 94 return false;
95 }
96
97 if (!CanSavePage(request.url())) {
98 DVLOG(1) << "Not able to save page";
99 return false;
100 }
101
102 // Track pending request for callback handling.
103 pending_request_ = &request;
32 104
33 // Kick off load page attempt. 105 // Kick off load page attempt.
34 return GetOrCreateLoader()->LoadPage( 106 bool accepted = GetOrCreateLoader()->LoadPage(
35 request.url(), base::Bind(&PrerenderingOffliner::OnLoadPageDone, 107 request.url(),
36 weak_ptr_factory_.GetWeakPtr())); 108 base::Bind(&PrerenderingOffliner::OnLoadPageDone,
109 weak_ptr_factory_.GetWeakPtr(), request, callback));
110 if (!accepted)
111 pending_request_ = nullptr;
112
113 return accepted;
37 } 114 }
38 115
39 void PrerenderingOffliner::Cancel() { 116 void PrerenderingOffliner::Cancel() {
40 GetOrCreateLoader()->StopLoading(); 117 if (pending_request_) {
118 pending_request_ = nullptr;
119 GetOrCreateLoader()->StopLoading();
120 // TODO(dougarnett): Consider ability to cancel SavePage request.
121 }
41 } 122 }
42 123
43 void PrerenderingOffliner::SetLoaderForTesting( 124 void PrerenderingOffliner::SetLoaderForTesting(
44 std::unique_ptr<PrerenderingLoader> loader) { 125 std::unique_ptr<PrerenderingLoader> loader) {
45 DCHECK(!loader_); 126 DCHECK(!loader_);
46 loader_ = std::move(loader); 127 loader_ = std::move(loader);
47 } 128 }
48 129
130 bool PrerenderingOffliner::CanSavePage(const GURL& url) {
131 if (!offline_page_model_) {
132 // Assume we can save if no OfflinePageModel (for unit tests).
133 // TODO(dougarnett): Make OfflinePageModel::CanSavePage() mockable for test.
134 return true;
135 }
136 return offline_page_model_->CanSavePage(url);
137 }
138
139 void PrerenderingOffliner::SavePage(
140 const GURL& url,
141 const ClientId& client_id,
142 std::unique_ptr<OfflinePageArchiver> archiver,
143 const SavePageCallback& callback) {
144 DCHECK(offline_page_model_);
145 offline_page_model_->SavePage(url, client_id, std::move(archiver), callback);
146 }
147
49 PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() { 148 PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() {
50 if (!loader_) { 149 if (!loader_) {
51 loader_.reset(new PrerenderingLoader(browser_context_)); 150 loader_.reset(new PrerenderingLoader(browser_context_));
52 } 151 }
53 return loader_.get(); 152 return loader_.get();
54 } 153 }
55 154
56 } // namespace offline_pages 155 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698