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

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

Issue 2737343002: [Offline Pages] Allow BackgroundLoader to track network bytes using prerenderer hook-in. (Closed)
Patch Set: mark background contents code as android-only Created 3 years, 9 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/background_loader_offliner.cc
diff --git a/chrome/browser/android/offline_pages/background_loader_offliner.cc b/chrome/browser/android/offline_pages/background_loader_offliner.cc
index 07b32f956610f7021e66e5f8d32a9027f553c854..ac4f9fb5e4ba43a736117b3710d3327ef637dd15 100644
--- a/chrome/browser/android/offline_pages/background_loader_offliner.cc
+++ b/chrome/browser/android/offline_pages/background_loader_offliner.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/android/offline_pages/background_loader_offliner.h"
#include "base/metrics/histogram_macros.h"
+#include "base/supports_user_data.h"
#include "base/sys_info.h"
#include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h"
#include "chrome/browser/android/offline_pages/offliner_helper.h"
@@ -19,7 +20,20 @@
namespace offline_pages {
namespace {
-long kOfflinePageDelayMs = 2000;
+const long kOfflinePageDelayMs = 2000;
+const char kOfflinerDataKey[] = "offliner-key";
Dmitry Titov 2017/03/11 01:10:28 An even better variant of this is to do that: con
chili 2017/03/13 20:41:56 Done. I extended WebContentsUserData, which has in
+
+class OfflinerData : public base::SupportsUserData::Data {
+ public:
+ explicit OfflinerData(BackgroundLoaderOffliner* offliner) {
+ offliner_ = offliner;
+ }
+ BackgroundLoaderOffliner* offliner() { return offliner_; }
+
+ private:
+ BackgroundLoaderOffliner* offliner_;
dewittj 2017/03/11 01:05:13 Please write a comment explaining the reason that
Dmitry Titov 2017/03/11 01:10:28 Would be nice to add a comment to describe why the
chili 2017/03/13 20:41:56 Done.
chili 2017/03/13 20:41:56 Done.
+};
+
} // namespace
BackgroundLoaderOffliner::BackgroundLoaderOffliner(
@@ -32,6 +46,7 @@ BackgroundLoaderOffliner::BackgroundLoaderOffliner(
save_state_(NONE),
page_load_state_(SUCCESS),
page_delay_ms_(kOfflinePageDelayMs),
+ network_bytes_(0LL),
weak_ptr_factory_(this) {
DCHECK(offline_page_model_);
DCHECK(browser_context_);
@@ -39,7 +54,16 @@ BackgroundLoaderOffliner::BackgroundLoaderOffliner(
BackgroundLoaderOffliner::~BackgroundLoaderOffliner() {}
-// TODO(dimich): Invoke progress_callback as appropriate.
+// static
+BackgroundLoaderOffliner* BackgroundLoaderOffliner::FromWebContents(
+ content::WebContents* contents) {
+ OfflinerData* data =
+ static_cast<OfflinerData*>(contents->GetUserData(kOfflinerDataKey));
+ if (data)
+ return data->offliner();
+ return nullptr;
+}
+
bool BackgroundLoaderOffliner::LoadAndSave(
const SavePageRequest& request,
const CompletionCallback& completion_callback,
@@ -109,6 +133,7 @@ bool BackgroundLoaderOffliner::LoadAndSave(
// Track copy of pending request.
pending_request_.reset(new SavePageRequest(request));
completion_callback_ = completion_callback;
+ progress_callback_ = progress_callback;
// Listen for app foreground/background change.
app_listener_.reset(new base::android::ApplicationStatusListener(
@@ -250,6 +275,14 @@ void BackgroundLoaderOffliner::SetPageDelayForTest(long delay_ms) {
page_delay_ms_ = delay_ms;
}
+void BackgroundLoaderOffliner::OnNetworkBytesChanged(int64_t bytes) {
+ if (pending_request_ && save_state_ != SAVING) {
+ network_bytes_ += bytes;
+ SavePageRequest request(*pending_request_.get());
dewittj 2017/03/13 17:38:20 Last I remember, .get() is not required to derefer
chili 2017/03/13 20:41:56 Done.
+ progress_callback_.Run(request, network_bytes_);
+ }
+}
+
void BackgroundLoaderOffliner::SavePage() {
if (!pending_request_.get()) {
DVLOG(1) << "Pending request was cleared during delay.";
@@ -334,6 +367,7 @@ void BackgroundLoaderOffliner::OnPageSaved(SavePageResult save_result,
void BackgroundLoaderOffliner::ResetState() {
pending_request_.reset();
page_load_state_ = SUCCESS;
+ network_bytes_ = 0LL;
// TODO(chili): Remove after RequestCoordinator can handle multiple offliners.
// We reset the loader and observer after completion so loaders
// will not be re-used across different requests/tries. This is a temporary
@@ -342,6 +376,9 @@ void BackgroundLoaderOffliner::ResetState() {
loader_.reset(
new background_loader::BackgroundLoaderContents(browser_context_));
content::WebContentsObserver::Observe(loader_.get()->web_contents());
+ std::unique_ptr<OfflinerData> offliner_data(new OfflinerData(this));
+ loader_.get()->web_contents()->SetUserData(kOfflinerDataKey,
dewittj 2017/03/11 01:05:13 nit: combine this (loader_.get()->web_contents())
chili 2017/03/13 20:41:56 Done.
+ std::move(offliner_data));
}
void BackgroundLoaderOffliner::OnApplicationStateChange(

Powered by Google App Engine
This is Rietveld 408576698