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

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: 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),
19 weak_ptr_factory_(this) {} 20 weak_ptr_factory_(this),
21 pending_request_id_(0) {}
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 (request.request_id() != pending_request_id_)
Pete Williamson 2016/05/24 00:40:07 So if this happens, it looks like the request is i
dougarnett 2016/05/24 19:07:26 The callback is ignored because the request has al
Pete Williamson 2016/05/24 21:18:41 OK, per our discussion, maybe add more DCHECKs to
dougarnett 2016/05/25 18:04:19 Reworked to keep ptr to pending request - hopefull
35 return;
36
37 if (load_status == Offliner::RequestStatus::LOADED) {
38 // Page is loaded so now attempt to save it. We next are waiting for
39 // callback to this save request or may get cancel callback from the
40 // Loader (if this loaded web_contents is being reclaimed).
Pete Williamson 2016/05/24 00:40:07 This sentence is a bit strangely worded, please cl
dougarnett 2016/05/24 19:07:26 I agree - please check new wording
Pete Williamson 2016/05/24 21:18:42 New wording is OK.
dougarnett 2016/05/25 18:04:19 Acknowledged.
41 DCHECK(web_contents);
42 std::unique_ptr<OfflinePageArchiver> archiver(
43 new OfflinePageMHTMLArchiver(web_contents));
44 SavePage(request.url(), request.client_id(), std::move(archiver),
45 base::Bind(&PrerenderingOffliner::OnSavePageDone,
46 weak_ptr_factory_.GetWeakPtr(), request,
Pete Williamson 2016/05/24 00:40:07 I normally just have the class inherit publicly fr
dewittj 2016/05/24 17:56:09 It's generally considered bad form to use Supports
dougarnett 2016/05/24 19:07:26 Are we transitioning to that pattern? The GetWeakP
Pete Williamson 2016/05/24 21:18:41 OK, then we should do as Justin suggests.
dougarnett 2016/05/25 18:04:19 Acknowledged.
47 completion_callback));
48 } else {
49 // Clear pending request and then run its completion callback.
Pete Williamson 2016/05/24 00:40:07 So does this mean we only get one callback for suc
dougarnett 2016/05/24 19:07:26 Yes, only supporting one save attempt initially. I
Pete Williamson 2016/05/24 21:18:42 Ack.
50 ClearPendingRequest();
51 completion_callback.Run(request, load_status);
52 }
53 }
54
55 void PrerenderingOffliner::OnSavePageDone(
56 const SavePageRequest& request,
57 const CompletionCallback& completion_callback,
58 SavePageResult save_result,
59 int64_t offline_id) {
60 // Check if request is still pending receiving a callback.
61 if (request.request_id() != pending_request_id_)
62 return;
63
64 Offliner::RequestStatus save_status;
65 if (save_result == SavePageResult::SUCCESS) {
66 save_status = RequestStatus::SAVED;
67 } else {
68 // TODO(dougarnett): Consider reflecting some recommendation to retry the
69 // request based on specific save error cases.
70 save_status = RequestStatus::FAILED_SAVE;
71 }
72 ClearPendingRequest();
73 completion_callback.Run(request, save_status);
26 } 74 }
27 75
28 bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request, 76 bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request,
29 const CompletionCallback& callback) { 77 const CompletionCallback& callback) {
30 if (!offline_page_model_->CanSavePage(request.url())) 78 if (!CanSavePage(request.url()))
31 return false; 79 return false;
32 80
81 // Track pending request for callback handling. This also ensures
82 // there is no current pending request.
Pete Williamson 2016/05/24 00:40:07 But it only makes sure of that while debugging. D
dougarnett 2016/05/24 19:07:26 Backing off the comment for now. Debug time might
Pete Williamson 2016/05/24 21:18:41 ok
dougarnett 2016/05/25 18:04:19 Revised to return false if already have pending re
83 SetPendingRequest(request.request_id());
84
33 // Kick off load page attempt. 85 // Kick off load page attempt.
34 return GetOrCreateLoader()->LoadPage( 86 bool accepted = GetOrCreateLoader()->LoadPage(
35 request.url(), base::Bind(&PrerenderingOffliner::OnLoadPageDone, 87 request.url(),
36 weak_ptr_factory_.GetWeakPtr())); 88 base::Bind(&PrerenderingOffliner::OnLoadPageDone,
89 weak_ptr_factory_.GetWeakPtr(), request, callback));
Pete Williamson 2016/05/24 00:40:07 You can use AsWeakPtr() here too.
Pete Williamson 2016/05/24 21:18:42 Per Justin's comment above, you can ignore this.
90 if (!accepted)
91 ClearPendingRequest();
92
93 return accepted;
37 } 94 }
38 95
39 void PrerenderingOffliner::Cancel() { 96 void PrerenderingOffliner::Cancel() {
97 ClearPendingRequest();
40 GetOrCreateLoader()->StopLoading(); 98 GetOrCreateLoader()->StopLoading();
99 // TODO(dougarnett): Consider ability to cancel SavePage request.
41 } 100 }
42 101
43 void PrerenderingOffliner::SetLoaderForTesting( 102 void PrerenderingOffliner::SetLoaderForTesting(
44 std::unique_ptr<PrerenderingLoader> loader) { 103 std::unique_ptr<PrerenderingLoader> loader) {
45 DCHECK(!loader_); 104 DCHECK(!loader_);
46 loader_ = std::move(loader); 105 loader_ = std::move(loader);
47 } 106 }
48 107
108 bool PrerenderingOffliner::CanSavePage(const GURL& url) {
109 DCHECK(offline_page_model_);
110 return offline_page_model_->CanSavePage(url);
111 }
112
113 void PrerenderingOffliner::SavePage(
114 const GURL& url,
115 const ClientId& client_id,
116 std::unique_ptr<OfflinePageArchiver> archiver,
117 const SavePageCallback& callback) {
118 DCHECK(offline_page_model_);
119 offline_page_model_->SavePage(url, client_id, std::move(archiver), callback);
120 }
121
49 PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() { 122 PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() {
50 if (!loader_) { 123 if (!loader_) {
51 loader_.reset(new PrerenderingLoader(browser_context_)); 124 loader_.reset(new PrerenderingLoader(browser_context_));
52 } 125 }
53 return loader_.get(); 126 return loader_.get();
54 } 127 }
55 128
129 void PrerenderingOffliner::SetPendingRequest(int64_t request_id) {
130 DCHECK_GT(request_id, 0);
131 DCHECK_EQ(pending_request_id_, 0);
132 pending_request_id_ = request_id;
133 }
134
135 void PrerenderingOffliner::ClearPendingRequest() {
136 DCHECK_GT(pending_request_id_, 0);
137 pending_request_id_ = 0;
138 }
139
56 } // namespace offline_pages 140 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698