Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/data_usage/data_use_tab_model.h" | 5 #include "chrome/browser/android/data_usage/data_use_tab_model.h" |
| 6 | 6 |
| 7 #include "base/time/time.h" | 7 #include "base/time/time.h" |
| 8 #include "chrome/browser/android/data_usage/external_data_use_observer.h" | 8 #include "chrome/browser/android/data_usage/external_data_use_observer.h" |
| 9 #include "chrome/browser/android/data_usage/tab_data_use_entry.h" | 9 #include "chrome/browser/android/data_usage/tab_data_use_entry.h" |
| 10 #include "content/public/browser/browser_thread.h" | |
|
sclittle
2015/11/20 22:50:54
Remove this include, since you're not actually usi
tbansal1
2015/11/23 17:52:22
Done.
| |
| 10 | 11 |
| 11 namespace { | 12 namespace { |
| 12 | 13 |
| 13 // TODO(rajendrant): To be changeable via field trial. | 14 // TODO(rajendrant): To be changeable via field trial. |
| 14 // Indicates the maximum number of tabs to maintain session information about. | 15 // Indicates the maximum number of tabs to maintain session information about. |
| 15 const size_t kMaxTabEntries = 200; | 16 const size_t kMaxTabEntries = 200; |
| 16 | 17 |
| 17 // Returns true if |tab_id| is a valid tab ID. | 18 // Returns true if |tab_id| is a valid tab ID. |
| 18 bool IsValidTabID(int32_t tab_id) { | 19 bool IsValidTabID(int32_t tab_id) { |
| 19 return tab_id >= 0; | 20 return tab_id >= 0; |
| 20 } | 21 } |
| 21 | 22 |
| 22 } // namespace | 23 } // namespace |
| 23 | 24 |
| 24 namespace chrome { | 25 namespace chrome { |
| 25 | 26 |
| 26 namespace android { | 27 namespace android { |
| 27 | 28 |
| 28 size_t DataUseTabModel::GetMaxTabEntriesForTests() { | 29 size_t DataUseTabModel::GetMaxTabEntriesForTests() { |
| 29 return kMaxTabEntries; | 30 return kMaxTabEntries; |
| 30 } | 31 } |
| 31 | 32 |
| 32 DataUseTabModel::DataUseTabModel( | 33 DataUseTabModel::DataUseTabModel( |
| 33 const ExternalDataUseObserver* data_use_observer, | 34 const ExternalDataUseObserver* data_use_observer, |
| 34 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) | 35 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) |
| 35 : data_use_observer_(data_use_observer), | 36 : data_use_observer_(data_use_observer), |
| 36 observer_list_(new base::ObserverListThreadSafe<TabDataUseObserver>), | 37 ui_task_runner_(ui_task_runner), |
| 37 weak_factory_(this) {} | 38 weak_factory_(this) {} |
| 38 | 39 |
| 39 DataUseTabModel::~DataUseTabModel() { | 40 DataUseTabModel::~DataUseTabModel() { |
| 40 DCHECK(thread_checker_.CalledOnValidThread()); | 41 DCHECK(thread_checker_.CalledOnValidThread()); |
| 41 } | 42 } |
| 42 | 43 |
| 43 base::WeakPtr<DataUseTabModel> DataUseTabModel::GetWeakPtr() { | 44 base::WeakPtr<DataUseTabModel> DataUseTabModel::GetWeakPtr() { |
| 44 DCHECK(thread_checker_.CalledOnValidThread()); | 45 DCHECK(thread_checker_.CalledOnValidThread()); |
| 45 return weak_factory_.GetWeakPtr(); | 46 return weak_factory_.GetWeakPtr(); |
| 46 } | 47 } |
| 47 | 48 |
| 48 void DataUseTabModel::OnNavigationEvent(int32_t tab_id, | 49 void DataUseTabModel::OnNavigationEvent(int32_t tab_id, |
| 49 TransitionType transition, | 50 TransitionType transition, |
| 50 const GURL& url, | 51 const GURL& url, |
| 51 const std::string& package) { | 52 const std::string& package) { |
| 52 DCHECK(thread_checker_.CalledOnValidThread()); | 53 DCHECK(thread_checker_.CalledOnValidThread()); |
| 53 DCHECK(IsValidTabID(tab_id)); | 54 DCHECK(IsValidTabID(tab_id)); |
| 54 | 55 |
| 55 // TODO(rajendrant): implementation to use package. | 56 // TODO(rajendrant): implementation to use package. |
| 56 switch (transition) { | 57 switch (transition) { |
| 57 case TRANSITION_OMNIBOX_SEARCH: | 58 case TRANSITION_OMNIBOX_SEARCH: |
| 59 case TRANSITION_OMNIBOX_NAVIGATION: | |
| 58 case TRANSITION_FROM_EXTERNAL_APP: { | 60 case TRANSITION_FROM_EXTERNAL_APP: { |
| 59 // Enter events. | 61 // Enter events. |
| 60 std::string label; | 62 std::string label; |
| 61 if (data_use_observer_->Matches(url, &label)) { | 63 if (data_use_observer_->Matches(url, &label)) { |
| 62 // TODO(rajendrant): Need to handle scenarios where these labels change | 64 // TODO(rajendrant): Need to handle scenarios where these labels change |
| 63 // in the middle of a tab session. Should |data_use_observer_| notify us | 65 // in the middle of a tab session. Should |data_use_observer_| notify us |
| 64 // about a cleanup. What happens to currently active tab sessions. | 66 // about a cleanup. What happens to currently active tab sessions. |
| 65 DCHECK(!label.empty()); | 67 DCHECK(!label.empty()); |
| 66 StartTrackingDataUse(tab_id, label); | 68 StartTrackingDataUse(tab_id, label); |
| 67 } | 69 } |
| 68 break; | 70 break; |
| 69 } | 71 } |
| 70 | 72 |
| 71 case TRANSITION_FROM_NAVSUGGEST: | 73 case TRANSITION_FROM_NAVSUGGEST: |
| 72 case TRANSITION_OMNIBOX_NAVIGATION: | |
| 73 case TRANSITION_BOOKMARK: | 74 case TRANSITION_BOOKMARK: |
| 74 case TRANSITION_HISTORY_ITEM: | 75 case TRANSITION_HISTORY_ITEM: |
| 75 case TRANSITION_TO_EXTERNAL_APP: | 76 case TRANSITION_TO_EXTERNAL_APP: |
| 76 // Exit events. | 77 // Exit events. |
| 77 EndTrackingDataUse(tab_id); | 78 EndTrackingDataUse(tab_id); |
| 78 break; | 79 break; |
| 79 | 80 |
| 80 default: | 81 default: |
| 81 NOTREACHED(); | 82 NOTREACHED(); |
| 82 break; | 83 break; |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 110 TabEntryMap::const_iterator tab_entry_iterator = | 111 TabEntryMap::const_iterator tab_entry_iterator = |
| 111 active_tabs_.find(data_use.tab_id); | 112 active_tabs_.find(data_use.tab_id); |
| 112 if (tab_entry_iterator != active_tabs_.end()) { | 113 if (tab_entry_iterator != active_tabs_.end()) { |
| 113 return tab_entry_iterator->second.GetLabel(data_use.request_start, | 114 return tab_entry_iterator->second.GetLabel(data_use.request_start, |
| 114 output_label); | 115 output_label); |
| 115 } | 116 } |
| 116 | 117 |
| 117 return false; // Tab session not found. | 118 return false; // Tab session not found. |
| 118 } | 119 } |
| 119 | 120 |
| 120 void DataUseTabModel::AddObserver(TabDataUseObserver* observer) { | 121 void DataUseTabModel::AddObserver( |
| 121 observer_list_->AddObserver(observer); | 122 const TabDataUseObserver* observer, |
| 123 const base::WeakPtr<TabDataUseObserver>& weak_ptr_observer) { | |
| 124 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 125 observers_.insert(ObserverMap::value_type(observer, weak_ptr_observer)); | |
| 122 } | 126 } |
| 123 | 127 |
| 124 void DataUseTabModel::RemoveObserver(TabDataUseObserver* observer) { | 128 void DataUseTabModel::RemoveObserver(const TabDataUseObserver* observer) { |
| 125 observer_list_->RemoveObserver(observer); | 129 DCHECK(thread_checker_.CalledOnValidThread()); |
| 130 observers_.erase(observer); | |
| 126 } | 131 } |
| 127 | 132 |
| 128 void DataUseTabModel::NotifyObserversOfTrackingStarting(int32_t tab_id) { | 133 void DataUseTabModel::NotifyObserversOfTrackingStarting(int32_t tab_id) { |
| 129 observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingStarting, | 134 DCHECK(thread_checker_.CalledOnValidThread()); |
| 130 tab_id); | 135 for (const auto& it : observers_) { |
| 136 ui_task_runner_->PostTask( | |
| 137 FROM_HERE, base::Bind(&TabDataUseObserver::NotifyTrackingStarting, | |
| 138 it.second, tab_id)); | |
| 139 } | |
| 131 } | 140 } |
| 132 | 141 |
| 133 void DataUseTabModel::NotifyObserversOfTrackingEnding(int32_t tab_id) { | 142 void DataUseTabModel::NotifyObserversOfTrackingEnding(int32_t tab_id) { |
| 134 observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingEnding, | 143 DCHECK(thread_checker_.CalledOnValidThread()); |
| 135 tab_id); | 144 for (const auto& it : observers_) { |
| 145 ui_task_runner_->PostTask( | |
| 146 FROM_HERE, base::Bind(&TabDataUseObserver::NotifyTrackingEnding, | |
| 147 it.second, tab_id)); | |
| 148 } | |
| 136 } | 149 } |
| 137 | 150 |
| 138 void DataUseTabModel::StartTrackingDataUse(int32_t tab_id, | 151 void DataUseTabModel::StartTrackingDataUse(int32_t tab_id, |
| 139 const std::string& label) { | 152 const std::string& label) { |
| 140 // TODO(rajendrant): Explore ability to handle changes in label for current | 153 // TODO(rajendrant): Explore ability to handle changes in label for current |
| 141 // session. | 154 // session. |
| 142 bool new_tab_entry_added = false; | 155 bool new_tab_entry_added = false; |
| 143 TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id); | 156 TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id); |
| 144 if (tab_entry_iterator == active_tabs_.end()) { | 157 if (tab_entry_iterator == active_tabs_.end()) { |
| 145 auto new_entry = | 158 auto new_entry = |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 189 } | 202 } |
| 190 } | 203 } |
| 191 DCHECK(oldest_tab_entry_iterator != active_tabs_.end()); | 204 DCHECK(oldest_tab_entry_iterator != active_tabs_.end()); |
| 192 active_tabs_.erase(oldest_tab_entry_iterator); | 205 active_tabs_.erase(oldest_tab_entry_iterator); |
| 193 } | 206 } |
| 194 } | 207 } |
| 195 | 208 |
| 196 } // namespace android | 209 } // namespace android |
| 197 | 210 |
| 198 } // namespace chrome | 211 } // namespace chrome |
| OLD | NEW |