Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Side by Side Diff: chrome/browser/android/data_usage/data_use_tab_model.cc

Issue 1443683002: Notify DataUseTabModel of navigations and tab closures (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased, addressed comments Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698