Chromium Code Reviews| 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( |