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

Unified Diff: chrome/browser/android/offline_pages/prerendering_offliner.cc

Issue 2149773002: PrerenderingOffliner will abort background load if it sees chrome transitioning to foreground on lo… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Revise some comments wrt app listener setting/clearing Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/android/offline_pages/prerendering_offliner.cc
diff --git a/chrome/browser/android/offline_pages/prerendering_offliner.cc b/chrome/browser/android/offline_pages/prerendering_offliner.cc
index cf8625f981e0317f05337ac6c03c83c4addc7a84..9579bed9e40a19695119b1f96f88eedcdde481f1 100644
--- a/chrome/browser/android/offline_pages/prerendering_offliner.cc
+++ b/chrome/browser/android/offline_pages/prerendering_offliner.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/android/offline_pages/prerendering_offliner.h"
#include "base/bind.h"
+#include "base/sys_info.h"
#include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h"
#include "components/offline_pages/background/save_page_request.h"
#include "components/offline_pages/offline_page_model.h"
@@ -20,13 +21,14 @@ PrerenderingOffliner::PrerenderingOffliner(
: browser_context_(browser_context),
offline_page_model_(offline_page_model),
pending_request_(nullptr),
+ is_low_end_device_(base::SysInfo::IsLowEndDevice()),
+ app_listener_(nullptr),
weak_ptr_factory_(this) {}
PrerenderingOffliner::~PrerenderingOffliner() {}
void PrerenderingOffliner::OnLoadPageDone(
const SavePageRequest& request,
- const CompletionCallback& completion_callback,
Offliner::RequestStatus load_status,
content::WebContents* web_contents) {
// Check if request is still pending receiving a callback.
@@ -61,33 +63,34 @@ void PrerenderingOffliner::OnLoadPageDone(
SavePage(web_contents->GetLastCommittedURL(), request.client_id(),
std::move(archiver),
base::Bind(&PrerenderingOffliner::OnSavePageDone,
- weak_ptr_factory_.GetWeakPtr(), request,
- completion_callback));
+ weak_ptr_factory_.GetWeakPtr(), request));
} else {
- // Clear pending request and then run the completion callback.
+ // Clear pending request and app listener then run completion callback.
pending_request_.reset(nullptr);
- completion_callback.Run(request, load_status);
+ app_listener_.reset(nullptr);
+ completion_callback_.Run(request, load_status);
}
}
void PrerenderingOffliner::OnSavePageDone(
const SavePageRequest& request,
- const CompletionCallback& completion_callback,
SavePageResult save_result,
int64_t offline_id) {
// Check if request is still pending receiving a callback.
if (!pending_request_)
return;
- // Also check that save callback is for same request as pending request
+ // Also check that this completed request is same as the pending one
// (since SavePage request is not cancel-able currently and could be old).
if (request.request_id() != pending_request_->request_id()) {
DVLOG(1) << "Ignoring save callback for old request";
return;
}
- // Clear pending request here and inform loader we are done with WebContents.
+ // Clear pending request and app listener here and then inform loader we
+ // are done with WebContents.
pending_request_.reset(nullptr);
+ app_listener_.reset(nullptr);
GetOrCreateLoader()->StopLoading();
// Determine status and run the completion callback.
@@ -99,7 +102,7 @@ void PrerenderingOffliner::OnSavePageDone(
// request based on specific save error cases.
save_status = RequestStatus::SAVE_FAILED;
}
- completion_callback.Run(request, save_status);
+ completion_callback_.Run(request, save_status);
}
bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request,
@@ -121,14 +124,20 @@ bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request,
// Track copy of pending request for callback handling.
pending_request_.reset(new SavePageRequest(request));
+ completion_callback_ = callback;
// Kick off load page attempt.
bool accepted = GetOrCreateLoader()->LoadPage(
- request.url(),
- base::Bind(&PrerenderingOffliner::OnLoadPageDone,
- weak_ptr_factory_.GetWeakPtr(), request, callback));
- if (!accepted)
+ request.url(), base::Bind(&PrerenderingOffliner::OnLoadPageDone,
+ weak_ptr_factory_.GetWeakPtr(), request));
+ if (!accepted) {
pending_request_.reset(nullptr);
+ } else {
+ // Create app listener for the pending request.
+ app_listener_.reset(new base::android::ApplicationStatusListener(
+ base::Bind(&PrerenderingOffliner::OnApplicationStateChange,
+ weak_ptr_factory_.GetWeakPtr())));
+ }
return accepted;
}
@@ -136,6 +145,7 @@ bool PrerenderingOffliner::LoadAndSave(const SavePageRequest& request,
void PrerenderingOffliner::Cancel() {
if (pending_request_) {
pending_request_.reset(nullptr);
+ app_listener_.reset(nullptr);
GetOrCreateLoader()->StopLoading();
// TODO(dougarnett): Consider ability to cancel SavePage request.
}
@@ -147,13 +157,23 @@ void PrerenderingOffliner::SetLoaderForTesting(
loader_ = std::move(loader);
}
+void PrerenderingOffliner::SetLowEndDeviceForTesting(bool is_low_end_device) {
+ is_low_end_device_ = is_low_end_device;
+}
+
+void PrerenderingOffliner::SetApplicationStateForTesting(
+ base::android::ApplicationState application_state) {
+ OnApplicationStateChange(application_state);
+}
+
void PrerenderingOffliner::SavePage(
const GURL& url,
const ClientId& client_id,
std::unique_ptr<OfflinePageArchiver> archiver,
- const SavePageCallback& callback) {
+ const SavePageCallback& save_callback) {
DCHECK(offline_page_model_);
- offline_page_model_->SavePage(url, client_id, std::move(archiver), callback);
+ offline_page_model_->SavePage(url, client_id, std::move(archiver),
+ save_callback);
}
PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() {
@@ -163,4 +183,17 @@ PrerenderingLoader* PrerenderingOffliner::GetOrCreateLoader() {
return loader_.get();
}
+void PrerenderingOffliner::OnApplicationStateChange(
+ base::android::ApplicationState application_state) {
+ if (pending_request_ && is_low_end_device_ &&
+ application_state ==
+ base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES) {
+ DVLOG(1) << "App became active, canceling current offlining request";
+ SavePageRequest* request = pending_request_.get();
+ Cancel();
+ completion_callback_.Run(*request,
+ Offliner::RequestStatus::FOREGROUND_CANCELED);
+ }
+}
+
} // namespace offline_pages

Powered by Google App Engine
This is Rietveld 408576698