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

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: 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"
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698