| Index: chrome/browser/android/data_usage/data_use_tab_model.cc
|
| diff --git a/chrome/browser/android/data_usage/data_use_tab_model.cc b/chrome/browser/android/data_usage/data_use_tab_model.cc
|
| index dea0659f0209f14ca52b02af348c47aa2ac497f3..33c7b6a785dd1812524098fc2e4af493f7613e66 100644
|
| --- a/chrome/browser/android/data_usage/data_use_tab_model.cc
|
| +++ b/chrome/browser/android/data_usage/data_use_tab_model.cc
|
| @@ -5,10 +5,11 @@
|
| #include "chrome/browser/android/data_usage/data_use_tab_model.h"
|
|
|
| #include "base/metrics/histogram_macros.h"
|
| +#include "base/single_thread_task_runner.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/time/time.h"
|
| #include "chrome/browser/android/data_usage/external_data_use_observer.h"
|
| -#include "chrome/browser/android/data_usage/tab_data_use_entry.h"
|
| +#include "components/data_usage/core/data_use.h"
|
| #include "components/variations/variations_associated_data.h"
|
|
|
| namespace {
|
| @@ -25,7 +26,7 @@ const char kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram[] =
|
| "DataUse.TabModel.UnexpiredTabEntryRemovalDuration";
|
|
|
| // Returns true if |tab_id| is a valid tab ID.
|
| -bool IsValidTabID(int32_t tab_id) {
|
| +bool IsValidTabID(SessionID::id_type tab_id) {
|
| return tab_id >= 0;
|
| }
|
|
|
| @@ -53,9 +54,11 @@ DataUseTabModel::DataUseTabModel(
|
| const ExternalDataUseObserver* data_use_observer,
|
| scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
|
| : data_use_observer_(data_use_observer),
|
| - observer_list_(new base::ObserverListThreadSafe<TabDataUseObserver>),
|
| max_tab_entries_(GetMaxTabEntries()),
|
| - weak_factory_(this) {}
|
| + ui_task_runner_(ui_task_runner),
|
| + weak_factory_(this) {
|
| + DCHECK(ui_task_runner_);
|
| +}
|
|
|
| DataUseTabModel::~DataUseTabModel() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| @@ -66,7 +69,7 @@ base::WeakPtr<DataUseTabModel> DataUseTabModel::GetWeakPtr() {
|
| return weak_factory_.GetWeakPtr();
|
| }
|
|
|
| -void DataUseTabModel::OnNavigationEvent(int32_t tab_id,
|
| +void DataUseTabModel::OnNavigationEvent(SessionID::id_type tab_id,
|
| TransitionType transition,
|
| const GURL& url,
|
| const std::string& package) {
|
| @@ -75,6 +78,7 @@ void DataUseTabModel::OnNavigationEvent(int32_t tab_id,
|
|
|
| switch (transition) {
|
| case TRANSITION_OMNIBOX_SEARCH:
|
| + case TRANSITION_OMNIBOX_NAVIGATION:
|
| case TRANSITION_FROM_EXTERNAL_APP: {
|
| // Enter events.
|
| bool start_tracking = false;
|
| @@ -103,11 +107,8 @@ void DataUseTabModel::OnNavigationEvent(int32_t tab_id,
|
| break;
|
| }
|
|
|
| - case TRANSITION_FROM_NAVSUGGEST:
|
| - case TRANSITION_OMNIBOX_NAVIGATION:
|
| case TRANSITION_BOOKMARK:
|
| case TRANSITION_HISTORY_ITEM:
|
| - case TRANSITION_TO_EXTERNAL_APP:
|
| // Exit events.
|
| EndTrackingDataUse(tab_id);
|
| break;
|
| @@ -118,7 +119,7 @@ void DataUseTabModel::OnNavigationEvent(int32_t tab_id,
|
| }
|
| }
|
|
|
| -void DataUseTabModel::OnTabCloseEvent(int32_t tab_id) {
|
| +void DataUseTabModel::OnTabCloseEvent(SessionID::id_type tab_id) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(IsValidTabID(tab_id));
|
|
|
| @@ -159,29 +160,54 @@ bool DataUseTabModel::GetLabelForDataUse(const data_usage::DataUse& data_use,
|
| return false; // Tab session not found.
|
| }
|
|
|
| -void DataUseTabModel::AddObserver(TabDataUseObserver* observer) {
|
| - observer_list_->AddObserver(observer);
|
| +void DataUseTabModel::AddObserver(
|
| + const TabDataUseObserver* observer,
|
| + const base::WeakPtr<TabDataUseObserver> weak_ptr_observer) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (observers_.find(observer) != observers_.end()) {
|
| + NOTREACHED() << " Same TabDataUseObserver can't be added twice";
|
| + return;
|
| + }
|
| + observers_.insert(ObserverMap::value_type(observer, weak_ptr_observer));
|
| + DCHECK_LT(0U, observers_.size());
|
| }
|
|
|
| -void DataUseTabModel::RemoveObserver(TabDataUseObserver* observer) {
|
| - observer_list_->RemoveObserver(observer);
|
| +void DataUseTabModel::RemoveObserver(const TabDataUseObserver* observer) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (observers_.find(observer) == observers_.end()) {
|
| + NOTREACHED() << " TabDataUseObserver is not registered as an observer";
|
| + return;
|
| + }
|
| + observers_.erase(observer);
|
| }
|
|
|
| base::TimeTicks DataUseTabModel::Now() const {
|
| return base::TimeTicks::Now();
|
| }
|
|
|
| -void DataUseTabModel::NotifyObserversOfTrackingStarting(int32_t tab_id) {
|
| - observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingStarting,
|
| - tab_id);
|
| +void DataUseTabModel::NotifyObserversOfTrackingStarting(
|
| + SessionID::id_type tab_id) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(ui_task_runner_);
|
| + for (const auto& it : observers_) {
|
| + ui_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&TabDataUseObserver::NotifyTrackingStarting,
|
| + it.second, tab_id));
|
| + }
|
| }
|
|
|
| -void DataUseTabModel::NotifyObserversOfTrackingEnding(int32_t tab_id) {
|
| - observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingEnding,
|
| - tab_id);
|
| +void DataUseTabModel::NotifyObserversOfTrackingEnding(
|
| + SessionID::id_type tab_id) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(ui_task_runner_);
|
| + for (const auto& it : observers_) {
|
| + ui_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&TabDataUseObserver::NotifyTrackingEnding,
|
| + it.second, tab_id));
|
| + }
|
| }
|
|
|
| -void DataUseTabModel::StartTrackingDataUse(int32_t tab_id,
|
| +void DataUseTabModel::StartTrackingDataUse(SessionID::id_type tab_id,
|
| const std::string& label) {
|
| // TODO(rajendrant): Explore ability to handle changes in label for current
|
| // session.
|
| @@ -202,7 +228,7 @@ void DataUseTabModel::StartTrackingDataUse(int32_t tab_id,
|
| CompactTabEntries(); // Keep total number of tab entries within limit.
|
| }
|
|
|
| -void DataUseTabModel::EndTrackingDataUse(int32_t tab_id) {
|
| +void DataUseTabModel::EndTrackingDataUse(SessionID::id_type tab_id) {
|
| TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id);
|
| if (tab_entry_iterator != active_tabs_.end() &&
|
| tab_entry_iterator->second.EndTracking()) {
|
|
|