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

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: Added StopLoading call upon Save callback and addressed some petewil comments 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_id_(0),
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 (request.request_id() != pending_request_id_)
35 return;
36
37 if (load_status == Offliner::RequestStatus::LOADED) {
38 // The page has successfully loaded so now try to save the page.
39 // After issuing the save request we will wait for either: the save
40 // callback or a CANCELED load callback (triggered because the loaded
41 // WebContents are being destroyed) - whichever callback occurs first.
42 DCHECK(web_contents);
43 std::unique_ptr<OfflinePageArchiver> archiver(
44 new OfflinePageMHTMLArchiver(web_contents));
45 SavePage(request.url(), request.client_id(), std::move(archiver),
46 base::Bind(&PrerenderingOffliner::OnSavePageDone,
47 weak_ptr_factory_.GetWeakPtr(), request,
48 completion_callback));
49 } else {
50 // Clear pending request and then run its completion callback.
51 ClearPendingRequest();
52 completion_callback.Run(request, load_status);
53 }
54 }
55
56 void PrerenderingOffliner::OnSavePageDone(
57 const SavePageRequest& request,
58 const CompletionCallback& completion_callback,
59 SavePageResult save_result,
60 int64_t offline_id) {
61 // Check if request is still pending receiving a callback.
62 if (request.request_id() != pending_request_id_)
63 return;
64
65 ClearPendingRequest();
66 GetOrCreateLoader()->StopLoading();
67
68 Offliner::RequestStatus save_status;
69 if (save_result == SavePageResult::SUCCESS) {
70 save_status = RequestStatus::SAVED;
71 } else {
72 // TODO(dougarnett): Consider reflecting some recommendation to retry the
73 // request based on specific save error cases.
74 save_status = RequestStatus::FAILED_SAVE;
75 }
76 completion_callback.Run(request, save_status);
26 } 77 }
27 78
28 bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request, 79 bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request,
29 const CompletionCallback& callback) { 80 const CompletionCallback& callback) {
30 if (!offline_page_model_->CanSavePage(request.url())) 81 if (!CanSavePage(request.url()))
31 return false; 82 return false;
32 83
84 // Track pending request for callback handling.
85 SetPendingRequest(request.request_id());
86
33 // Kick off load page attempt. 87 // Kick off load page attempt.
34 return GetOrCreateLoader()->LoadPage( 88 bool accepted = GetOrCreateLoader()->LoadPage(
35 request.url(), base::Bind(&PrerenderingOffliner::OnLoadPageDone, 89 request.url(),
36 weak_ptr_factory_.GetWeakPtr())); 90 base::Bind(&PrerenderingOffliner::OnLoadPageDone,
91 weak_ptr_factory_.GetWeakPtr(), request, callback));
92 if (!accepted)
fgorski 2016/05/24 19:58:28 I understand that callback will be called if LoadP
dougarnett 2016/05/25 18:04:19 Yes, updated the interface method comment.
93 ClearPendingRequest();
94
95 return accepted;
37 } 96 }
38 97
39 void PrerenderingOffliner::Cancel() { 98 void PrerenderingOffliner::Cancel() {
99 ClearPendingRequest();
40 GetOrCreateLoader()->StopLoading(); 100 GetOrCreateLoader()->StopLoading();
101 // TODO(dougarnett): Consider ability to cancel SavePage request.
41 } 102 }
42 103
43 void PrerenderingOffliner::SetLoaderForTesting( 104 void PrerenderingOffliner::SetLoaderForTesting(
44 std::unique_ptr<PrerenderingLoader> loader) { 105 std::unique_ptr<PrerenderingLoader> loader) {
45 DCHECK(!loader_); 106 DCHECK(!loader_);
46 loader_ = std::move(loader); 107 loader_ = std::move(loader);
47 } 108 }
48 109
110 bool PrerenderingOffliner::CanSavePage(const GURL& url) {
111 DCHECK(offline_page_model_);
112 return offline_page_model_->CanSavePage(url);
113 }
114
115 void PrerenderingOffliner::SavePage(
116 const GURL& url,
117 const ClientId& client_id,
118 std::unique_ptr<OfflinePageArchiver> archiver,
119 const SavePageCallback& callback) {
120 DCHECK(offline_page_model_);
121 offline_page_model_->SavePage(url, client_id, std::move(archiver), callback);
122 }
123
49 PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() { 124 PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() {
50 if (!loader_) { 125 if (!loader_) {
51 loader_.reset(new PrerenderingLoader(browser_context_)); 126 loader_.reset(new PrerenderingLoader(browser_context_));
52 } 127 }
53 return loader_.get(); 128 return loader_.get();
54 } 129 }
55 130
131 void PrerenderingOffliner::SetPendingRequest(int64_t request_id) {
132 DCHECK_GT(request_id, 0);
133 DCHECK_EQ(pending_request_id_, 0);
fgorski 2016/05/24 19:58:28 we are using the magic number 0 all over this code
dougarnett 2016/05/25 18:04:19 Revised to keep pointer to pending request instead
134 pending_request_id_ = request_id;
135 }
136
137 void PrerenderingOffliner::ClearPendingRequest() {
138 DCHECK_GT(pending_request_id_, 0);
139 pending_request_id_ = 0;
140 }
141
56 } // namespace offline_pages 142 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698