| Index: chrome/browser/android/data_usage/external_data_use_observer.cc
|
| diff --git a/chrome/browser/android/data_usage/external_data_use_observer.cc b/chrome/browser/android/data_usage/external_data_use_observer.cc
|
| index 781134dc30e055c1610a79886019f3cafc479987..af047556ff4ecb0e1bdd911f669115f03b52bfc6 100644
|
| --- a/chrome/browser/android/data_usage/external_data_use_observer.cc
|
| +++ b/chrome/browser/android/data_usage/external_data_use_observer.cc
|
| @@ -67,6 +67,7 @@ ExternalDataUseObserver::ExternalDataUseObserver(
|
| new ExternalDataUseReporter(kExternalDataUseObserverFieldTrial,
|
| data_use_tab_model_,
|
| external_data_use_observer_bridge_)),
|
| + io_task_runner_(io_task_runner),
|
| ui_task_runner_(ui_task_runner),
|
| last_matching_rules_fetch_time_(base::TimeTicks::Now()),
|
| fetch_matching_rules_duration_(
|
| @@ -75,7 +76,7 @@ ExternalDataUseObserver::ExternalDataUseObserver(
|
| weak_factory_(this) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| DCHECK(data_use_aggregator_);
|
| - DCHECK(io_task_runner);
|
| + DCHECK(io_task_runner_);
|
| DCHECK(ui_task_runner_);
|
|
|
| // Initialize the ExternalDataUseReporter object. It is okay to use
|
| @@ -92,7 +93,7 @@ ExternalDataUseObserver::ExternalDataUseObserver(
|
| FROM_HERE,
|
| base::Bind(&ExternalDataUseObserverBridge::Init,
|
| base::Unretained(external_data_use_observer_bridge_),
|
| - io_task_runner, GetWeakPtr(), data_use_tab_model_));
|
| + io_task_runner_, GetWeakPtr(), data_use_tab_model_));
|
| }
|
|
|
| ExternalDataUseObserver::~ExternalDataUseObserver() {
|
| @@ -126,6 +127,22 @@ void ExternalDataUseObserver::OnDataUse(const data_usage::DataUse& data_use) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(registered_as_data_use_observer_);
|
|
|
| + if (!data_use_list_) {
|
| + data_use_list_.reset(new std::deque<const data_usage::DataUse>());
|
| + // Post a task to the same IO thread, that will get invoked when some of the
|
| + // data use objects are batched.
|
| + io_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&ExternalDataUseObserver::OnDataUseBatchComplete,
|
| + GetWeakPtr()));
|
| + }
|
| +
|
| + data_use_list_->push_back(data_use);
|
| +}
|
| +
|
| +void ExternalDataUseObserver::OnDataUseBatchComplete() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(data_use_list_);
|
| +
|
| const base::TimeTicks now_ticks = base::TimeTicks::Now();
|
|
|
| // If the time when the matching rules were last fetched is more than
|
| @@ -138,9 +155,10 @@ void ExternalDataUseObserver::OnDataUse(const data_usage::DataUse& data_use) {
|
| // It is okay to use base::Unretained here since |external_data_use_reporter_|
|
| // is owned by |this|, and is destroyed on UI thread when |this| is destroyed.
|
| ui_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&ExternalDataUseReporter::OnDataUse,
|
| - base::Unretained(external_data_use_reporter_), data_use));
|
| + FROM_HERE, base::Bind(&ExternalDataUseReporter::OnDataUse,
|
| + base::Unretained(external_data_use_reporter_),
|
| + base::Passed(&data_use_list_)));
|
| + DCHECK(!data_use_list_);
|
| }
|
|
|
| void ExternalDataUseObserver::OnReportDataUseDone(bool success) {
|
|
|