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" | |
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 weak_factory_(this) {} | 37 weak_factory_(this) {} |
38 | 38 |
39 DataUseTabModel::~DataUseTabModel() { | 39 DataUseTabModel::~DataUseTabModel() { |
40 DCHECK(thread_checker_.CalledOnValidThread()); | 40 DCHECK(thread_checker_.CalledOnValidThread()); |
41 } | 41 } |
42 | 42 |
43 base::WeakPtr<DataUseTabModel> DataUseTabModel::GetWeakPtr() { | 43 base::WeakPtr<DataUseTabModel> DataUseTabModel::GetWeakPtr() { |
44 DCHECK(thread_checker_.CalledOnValidThread()); | 44 DCHECK(thread_checker_.CalledOnValidThread()); |
45 return weak_factory_.GetWeakPtr(); | 45 return weak_factory_.GetWeakPtr(); |
46 } | 46 } |
47 | 47 |
48 void DataUseTabModel::OnNavigationEvent(int32_t tab_id, | 48 void DataUseTabModel::OnNavigationEvent(int32_t tab_id, |
49 TransitionType transition, | 49 TransitionType transition, |
50 const GURL& url, | 50 const GURL& url) { |
51 const std::string& package) { | |
52 DCHECK(thread_checker_.CalledOnValidThread()); | 51 DCHECK(thread_checker_.CalledOnValidThread()); |
53 DCHECK(IsValidTabID(tab_id)); | 52 DCHECK(IsValidTabID(tab_id)); |
54 | 53 |
55 // TODO(rajendrant): implementation to use package. | |
56 switch (transition) { | 54 switch (transition) { |
57 case TRANSITION_OMNIBOX_SEARCH: | 55 case TRANSITION_OMNIBOX_SEARCH: |
56 case TRANSITION_OMNIBOX_NAVIGATION: | |
58 case TRANSITION_FROM_EXTERNAL_APP: { | 57 case TRANSITION_FROM_EXTERNAL_APP: { |
59 // Enter events. | 58 // Enter events. |
60 std::string label; | 59 std::string label; |
61 if (data_use_observer_->Matches(url, &label)) { | 60 if (data_use_observer_->Matches(url, &label)) { |
62 // TODO(rajendrant): Need to handle scenarios where these labels change | 61 // TODO(rajendrant): Need to handle scenarios where these labels change |
63 // in the middle of a tab session. Should |data_use_observer_| notify us | 62 // in the middle of a tab session. Should |data_use_observer_| notify us |
64 // about a cleanup. What happens to currently active tab sessions. | 63 // about a cleanup. What happens to currently active tab sessions. |
65 DCHECK(!label.empty()); | 64 DCHECK(!label.empty()); |
66 StartTrackingDataUse(tab_id, label); | 65 StartTrackingDataUse(tab_id, label); |
67 } | 66 } |
68 break; | 67 break; |
69 } | 68 } |
70 | 69 |
71 case TRANSITION_FROM_NAVSUGGEST: | 70 case TRANSITION_FROM_NAVSUGGEST: |
72 case TRANSITION_OMNIBOX_NAVIGATION: | |
73 case TRANSITION_BOOKMARK: | 71 case TRANSITION_BOOKMARK: |
74 case TRANSITION_HISTORY_ITEM: | 72 case TRANSITION_HISTORY_ITEM: |
75 case TRANSITION_TO_EXTERNAL_APP: | 73 case TRANSITION_TO_EXTERNAL_APP: |
76 // Exit events. | 74 // Exit events. |
77 EndTrackingDataUse(tab_id); | 75 EndTrackingDataUse(tab_id); |
78 break; | 76 break; |
79 | 77 |
80 default: | 78 default: |
81 NOTREACHED(); | 79 NOTREACHED(); |
82 break; | 80 break; |
(...skipping 28 matching lines...) Expand all Loading... | |
111 active_tabs_.find(data_use.tab_id); | 109 active_tabs_.find(data_use.tab_id); |
112 if (tab_entry_iterator != active_tabs_.end()) { | 110 if (tab_entry_iterator != active_tabs_.end()) { |
113 return tab_entry_iterator->second.GetLabel(data_use.request_start, | 111 return tab_entry_iterator->second.GetLabel(data_use.request_start, |
114 output_label); | 112 output_label); |
115 } | 113 } |
116 | 114 |
117 return false; // Tab session not found. | 115 return false; // Tab session not found. |
118 } | 116 } |
119 | 117 |
120 void DataUseTabModel::AddObserver(TabDataUseObserver* observer) { | 118 void DataUseTabModel::AddObserver(TabDataUseObserver* observer) { |
121 observer_list_->AddObserver(observer); | 119 observer_list_.AddObserver(observer); |
sclittle
2015/11/18 21:42:03
nit: Add DCHECK(thread_checker_.CalledOnValidThrea
tbansal1
2015/11/19 00:47:06
Done.
| |
122 } | 120 } |
123 | 121 |
124 void DataUseTabModel::RemoveObserver(TabDataUseObserver* observer) { | 122 void DataUseTabModel::RemoveObserver(TabDataUseObserver* observer) { |
125 observer_list_->RemoveObserver(observer); | 123 observer_list_.RemoveObserver(observer); |
sclittle
2015/11/18 21:42:03
nit: Add DCHECK(thread_checker_.CalledOnValidThrea
tbansal1
2015/11/19 00:47:06
Done.
| |
126 } | 124 } |
127 | 125 |
128 void DataUseTabModel::NotifyObserversOfTrackingStarting(int32_t tab_id) { | 126 void DataUseTabModel::NotifyObserversOfTrackingStarting(int32_t tab_id) { |
129 observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingStarting, | 127 FOR_EACH_OBSERVER(TabDataUseObserver, observer_list_, |
sclittle
2015/11/18 21:42:03
nit: Add DCHECK(thread_checker_.CalledOnValidThrea
tbansal1
2015/11/19 00:47:06
Done.
| |
130 tab_id); | 128 NotifyTrackingStarting(tab_id)); |
131 } | 129 } |
132 | 130 |
133 void DataUseTabModel::NotifyObserversOfTrackingEnding(int32_t tab_id) { | 131 void DataUseTabModel::NotifyObserversOfTrackingEnding(int32_t tab_id) { |
134 observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingEnding, | 132 FOR_EACH_OBSERVER(TabDataUseObserver, observer_list_, |
sclittle
2015/11/18 21:42:03
nit: Add DCHECK(thread_checker_.CalledOnValidThrea
tbansal1
2015/11/19 00:47:06
Done.
| |
135 tab_id); | 133 NotifyTrackingEnding(tab_id)); |
136 } | 134 } |
137 | 135 |
138 void DataUseTabModel::StartTrackingDataUse(int32_t tab_id, | 136 void DataUseTabModel::StartTrackingDataUse(int32_t tab_id, |
139 const std::string& label) { | 137 const std::string& label) { |
140 // TODO(rajendrant): Explore ability to handle changes in label for current | 138 // TODO(rajendrant): Explore ability to handle changes in label for current |
141 // session. | 139 // session. |
142 bool new_tab_entry_added = false; | 140 bool new_tab_entry_added = false; |
143 TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id); | 141 TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id); |
144 if (tab_entry_iterator == active_tabs_.end()) { | 142 if (tab_entry_iterator == active_tabs_.end()) { |
145 auto new_entry = | 143 auto new_entry = |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 } | 187 } |
190 } | 188 } |
191 DCHECK(oldest_tab_entry_iterator != active_tabs_.end()); | 189 DCHECK(oldest_tab_entry_iterator != active_tabs_.end()); |
192 active_tabs_.erase(oldest_tab_entry_iterator); | 190 active_tabs_.erase(oldest_tab_entry_iterator); |
193 } | 191 } |
194 } | 192 } |
195 | 193 |
196 } // namespace android | 194 } // namespace android |
197 | 195 |
198 } // namespace chrome | 196 } // namespace chrome |
OLD | NEW |