| 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 "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" | 8 #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" |
| 9 #include "components/offline_pages/background/save_page_request.h" | 9 #include "components/offline_pages/background/save_page_request.h" |
| 10 #include "components/offline_pages/offline_page_model.h" | 10 #include "components/offline_pages/offline_page_model.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 // WebContents are being destroyed) - whichever callback occurs first. | 51 // WebContents are being destroyed) - whichever callback occurs first. |
| 52 DCHECK(web_contents); | 52 DCHECK(web_contents); |
| 53 std::unique_ptr<OfflinePageArchiver> archiver( | 53 std::unique_ptr<OfflinePageArchiver> archiver( |
| 54 new OfflinePageMHTMLArchiver(web_contents)); | 54 new OfflinePageMHTMLArchiver(web_contents)); |
| 55 SavePage(request.url(), request.client_id(), std::move(archiver), | 55 SavePage(request.url(), request.client_id(), std::move(archiver), |
| 56 base::Bind(&PrerenderingOffliner::OnSavePageDone, | 56 base::Bind(&PrerenderingOffliner::OnSavePageDone, |
| 57 weak_ptr_factory_.GetWeakPtr(), request, | 57 weak_ptr_factory_.GetWeakPtr(), request, |
| 58 completion_callback)); | 58 completion_callback)); |
| 59 } else { | 59 } else { |
| 60 // Clear pending request and then run the completion callback. | 60 // Clear pending request and then run the completion callback. |
| 61 pending_request_ = nullptr; | 61 pending_request_.reset(nullptr); |
| 62 completion_callback.Run(request, load_status); | 62 completion_callback.Run(request, load_status); |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 | 65 |
| 66 void PrerenderingOffliner::OnSavePageDone( | 66 void PrerenderingOffliner::OnSavePageDone( |
| 67 const SavePageRequest& request, | 67 const SavePageRequest& request, |
| 68 const CompletionCallback& completion_callback, | 68 const CompletionCallback& completion_callback, |
| 69 SavePageResult save_result, | 69 SavePageResult save_result, |
| 70 int64_t offline_id) { | 70 int64_t offline_id) { |
| 71 // Check if request is still pending receiving a callback. | 71 // Check if request is still pending receiving a callback. |
| 72 if (!pending_request_) | 72 if (!pending_request_) |
| 73 return; | 73 return; |
| 74 | 74 |
| 75 // Also check that save callback is for same request as pending request | 75 // Also check that save callback is for same request as pending request |
| 76 // (since SavePage request is not cancel-able currently and could be old). | 76 // (since SavePage request is not cancel-able currently and could be old). |
| 77 if (request.request_id() != pending_request_->request_id()) { | 77 if (request.request_id() != pending_request_->request_id()) { |
| 78 DVLOG(1) << "Ignoring save callback for old request"; | 78 DVLOG(1) << "Ignoring save callback for old request"; |
| 79 return; | 79 return; |
| 80 } | 80 } |
| 81 | 81 |
| 82 // Clear pending request here and inform loader we are done with WebContents. | 82 // Clear pending request here and inform loader we are done with WebContents. |
| 83 pending_request_ = nullptr; | 83 pending_request_.reset(nullptr); |
| 84 GetOrCreateLoader()->StopLoading(); | 84 GetOrCreateLoader()->StopLoading(); |
| 85 | 85 |
| 86 // Determine status and run the completion callback. | 86 // Determine status and run the completion callback. |
| 87 Offliner::RequestStatus save_status; | 87 Offliner::RequestStatus save_status; |
| 88 if (save_result == SavePageResult::SUCCESS) { | 88 if (save_result == SavePageResult::SUCCESS) { |
| 89 save_status = RequestStatus::SAVED; | 89 save_status = RequestStatus::SAVED; |
| 90 } else { | 90 } else { |
| 91 // TODO(dougarnett): Consider reflecting some recommendation to retry the | 91 // TODO(dougarnett): Consider reflecting some recommendation to retry the |
| 92 // request based on specific save error cases. | 92 // request based on specific save error cases. |
| 93 save_status = RequestStatus::FAILED_SAVE; | 93 save_status = RequestStatus::FAILED_SAVE; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 105 if (!GetOrCreateLoader()->CanPrerender()) { | 105 if (!GetOrCreateLoader()->CanPrerender()) { |
| 106 DVLOG(1) << "Prerendering not allowed/configured"; | 106 DVLOG(1) << "Prerendering not allowed/configured"; |
| 107 return false; | 107 return false; |
| 108 } | 108 } |
| 109 | 109 |
| 110 if (!OfflinePageModel::CanSaveURL(request.url())) { | 110 if (!OfflinePageModel::CanSaveURL(request.url())) { |
| 111 DVLOG(1) << "Not able to save page for requested url: " << request.url(); | 111 DVLOG(1) << "Not able to save page for requested url: " << request.url(); |
| 112 return false; | 112 return false; |
| 113 } | 113 } |
| 114 | 114 |
| 115 // Track pending request for callback handling. | 115 // Track copy of pending request for callback handling. |
| 116 pending_request_ = &request; | 116 pending_request_.reset(new SavePageRequest(request)); |
| 117 | 117 |
| 118 // Kick off load page attempt. | 118 // Kick off load page attempt. |
| 119 bool accepted = GetOrCreateLoader()->LoadPage( | 119 bool accepted = GetOrCreateLoader()->LoadPage( |
| 120 request.url(), | 120 request.url(), |
| 121 base::Bind(&PrerenderingOffliner::OnLoadPageDone, | 121 base::Bind(&PrerenderingOffliner::OnLoadPageDone, |
| 122 weak_ptr_factory_.GetWeakPtr(), request, callback)); | 122 weak_ptr_factory_.GetWeakPtr(), request, callback)); |
| 123 if (!accepted) | 123 if (!accepted) |
| 124 pending_request_ = nullptr; | 124 pending_request_.reset(nullptr); |
| 125 | 125 |
| 126 return accepted; | 126 return accepted; |
| 127 } | 127 } |
| 128 | 128 |
| 129 void PrerenderingOffliner::Cancel() { | 129 void PrerenderingOffliner::Cancel() { |
| 130 if (pending_request_) { | 130 if (pending_request_) { |
| 131 pending_request_ = nullptr; | 131 pending_request_.reset(nullptr); |
| 132 GetOrCreateLoader()->StopLoading(); | 132 GetOrCreateLoader()->StopLoading(); |
| 133 // TODO(dougarnett): Consider ability to cancel SavePage request. | 133 // TODO(dougarnett): Consider ability to cancel SavePage request. |
| 134 } | 134 } |
| 135 } | 135 } |
| 136 | 136 |
| 137 void PrerenderingOffliner::SetLoaderForTesting( | 137 void PrerenderingOffliner::SetLoaderForTesting( |
| 138 std::unique_ptr<PrerenderingLoader> loader) { | 138 std::unique_ptr<PrerenderingLoader> loader) { |
| 139 DCHECK(!loader_); | 139 DCHECK(!loader_); |
| 140 loader_ = std::move(loader); | 140 loader_ = std::move(loader); |
| 141 } | 141 } |
| 142 | 142 |
| 143 void PrerenderingOffliner::SavePage( | 143 void PrerenderingOffliner::SavePage( |
| 144 const GURL& url, | 144 const GURL& url, |
| 145 const ClientId& client_id, | 145 const ClientId& client_id, |
| 146 std::unique_ptr<OfflinePageArchiver> archiver, | 146 std::unique_ptr<OfflinePageArchiver> archiver, |
| 147 const SavePageCallback& callback) { | 147 const SavePageCallback& callback) { |
| 148 DCHECK(offline_page_model_); | 148 DCHECK(offline_page_model_); |
| 149 offline_page_model_->SavePage(url, client_id, std::move(archiver), callback); | 149 offline_page_model_->SavePage(url, client_id, std::move(archiver), callback); |
| 150 } | 150 } |
| 151 | 151 |
| 152 PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() { | 152 PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() { |
| 153 if (!loader_) { | 153 if (!loader_) { |
| 154 loader_.reset(new PrerenderingLoader(browser_context_)); | 154 loader_.reset(new PrerenderingLoader(browser_context_)); |
| 155 } | 155 } |
| 156 return loader_.get(); | 156 return loader_.get(); |
| 157 } | 157 } |
| 158 | 158 |
| 159 } // namespace offline_pages | 159 } // namespace offline_pages |
| OLD | NEW |