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

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

Issue 2158913002: Make DataUseTabModel and DataUseMatcher more independent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months 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 <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/bind.h"
10 #include "base/callback.h"
9 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
10 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
11 #include "base/strings/string16.h" 13 #include "base/strings/string16.h"
12 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
14 #include "base/time/default_tick_clock.h" 16 #include "base/time/default_tick_clock.h"
15 #include "base/time/tick_clock.h" 17 #include "base/time/tick_clock.h"
16 #include "base/time/time.h" 18 #include "base/time/time.h"
17 #include "chrome/browser/android/data_usage/data_use_matcher.h" 19 #include "chrome/browser/android/data_usage/data_use_matcher.h"
18 #include "chrome/browser/android/data_usage/external_data_use_observer.h" 20 #include "chrome/browser/android/data_usage/external_data_use_observer.h"
21 #include "chrome/browser/android/data_usage/external_data_use_observer_bridge.h"
19 #include "components/variations/variations_associated_data.h" 22 #include "components/variations/variations_associated_data.h"
20 #include "content/public/browser/browser_thread.h" 23 #include "content/public/browser/browser_thread.h"
21 #include "content/public/browser/navigation_entry.h" 24 #include "content/public/browser/navigation_entry.h"
22 #include "url/gurl.h" 25 #include "url/gurl.h"
23 26
24 namespace { 27 namespace {
25 28
26 // Default maximum number of tabs to maintain session information about. May be 29 // Default maximum number of tabs to maintain session information about. May be
27 // overridden by the field trial. 30 // overridden by the field trial.
28 const size_t kDefaultMaxTabEntries = 200; 31 const size_t kDefaultMaxTabEntries = 200;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 } // namespace 133 } // namespace
131 134
132 namespace chrome { 135 namespace chrome {
133 136
134 namespace android { 137 namespace android {
135 138
136 // static 139 // static
137 const char DataUseTabModel::kDefaultTag[] = "ChromeTab"; 140 const char DataUseTabModel::kDefaultTag[] = "ChromeTab";
138 const char DataUseTabModel::kCustomTabTag[] = "ChromeCustomTab"; 141 const char DataUseTabModel::kCustomTabTag[] = "ChromeCustomTab";
139 142
140 DataUseTabModel::DataUseTabModel() 143 DataUseTabModel::DataUseTabModel(
144 const base::Closure& fetch_matching_rules_callback,
145 const base::Callback<void(bool)>& on_matching_rules_fetched_callback)
141 : max_tab_entries_(GetMaxTabEntries()), 146 : max_tab_entries_(GetMaxTabEntries()),
142 max_sessions_per_tab_(GetMaxSessionsPerTab()), 147 max_sessions_per_tab_(GetMaxSessionsPerTab()),
143 closed_tab_expiration_duration_(GetClosedTabExpirationDuration()), 148 closed_tab_expiration_duration_(GetClosedTabExpirationDuration()),
144 open_tab_expiration_duration_(GetOpenTabExpirationDuration()), 149 open_tab_expiration_duration_(GetOpenTabExpirationDuration()),
150 tick_clock_(new base::DefaultTickClock()),
151 data_use_matcher_(new DataUseMatcher(
152 base::Bind(&DataUseTabModel::OnTrackingLabelRemoved, GetWeakPtr()),
153 on_matching_rules_fetched_callback,
154 GetDefaultMatchingRuleExpirationDuration())),
155 fetch_matching_rules_callback_(fetch_matching_rules_callback),
145 is_ready_for_navigation_event_(false), 156 is_ready_for_navigation_event_(false),
146 is_control_app_installed_(false), 157 is_control_app_installed_(false),
147 weak_factory_(this) { 158 weak_factory_(this) {
148 // Detach from current thread since rest of DataUseTabModel lives on the UI 159 // Detach from current thread since rest of DataUseTabModel lives on the UI
149 // thread and the current thread may not be UI thread.. 160 // thread and the current thread may not be UI thread..
150 thread_checker_.DetachFromThread(); 161 thread_checker_.DetachFromThread();
151 } 162 }
152 163
153 DataUseTabModel::~DataUseTabModel() { 164 DataUseTabModel::~DataUseTabModel() {
154 DCHECK(thread_checker_.CalledOnValidThread()); 165 DCHECK(thread_checker_.CalledOnValidThread());
155 } 166 }
156 167
157 base::WeakPtr<DataUseTabModel> DataUseTabModel::GetWeakPtr() { 168 base::WeakPtr<DataUseTabModel> DataUseTabModel::GetWeakPtr() {
158 DCHECK(thread_checker_.CalledOnValidThread()); 169 DCHECK(thread_checker_.CalledOnValidThread());
159 return weak_factory_.GetWeakPtr(); 170 return weak_factory_.GetWeakPtr();
160 } 171 }
161 172
162 void DataUseTabModel::InitOnUIThread( 173 void DataUseTabModel::InitOnUIThread() {
163 const ExternalDataUseObserverBridge* external_data_use_observer_bridge) {
164 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 174 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
165 DCHECK(thread_checker_.CalledOnValidThread()); 175 DCHECK(thread_checker_.CalledOnValidThread());
166 DCHECK(external_data_use_observer_bridge);
167
168 tick_clock_.reset(new base::DefaultTickClock());
169 data_use_matcher_.reset(
170 new DataUseMatcher(GetWeakPtr(), external_data_use_observer_bridge,
171 GetDefaultMatchingRuleExpirationDuration()));
172 } 176 }
173 177
174 void DataUseTabModel::OnNavigationEvent( 178 void DataUseTabModel::OnNavigationEvent(
175 SessionID::id_type tab_id, 179 SessionID::id_type tab_id,
176 TransitionType transition, 180 TransitionType transition,
177 const GURL& url, 181 const GURL& url,
178 const std::string& package, 182 const std::string& package,
179 content::NavigationEntry* navigation_entry) { 183 content::NavigationEntry* navigation_entry) {
180 DCHECK(thread_checker_.CalledOnValidThread()); 184 DCHECK(thread_checker_.CalledOnValidThread());
181 DCHECK(IsValidTabID(tab_id)); 185 DCHECK(IsValidTabID(tab_id));
182 DCHECK(!navigation_entry || (navigation_entry->GetURL() == url)); 186 DCHECK(!navigation_entry || (navigation_entry->GetURL() == url));
183 187
184 std::string current_label, new_label; 188 std::string current_label, new_label;
185 bool is_package_match; 189 bool is_package_match;
186 190
187 if (is_control_app_installed_ && !data_use_matcher_->HasRules()) 191 if (is_control_app_installed_ && !data_use_matcher_->HasRules())
188 data_use_matcher_->FetchMatchingRules(); 192 fetch_matching_rules_callback_.Run();
189 193
190 GetCurrentAndNewLabelForNavigationEvent(tab_id, transition, url, package, 194 GetCurrentAndNewLabelForNavigationEvent(tab_id, transition, url, package,
191 navigation_entry, &current_label, 195 navigation_entry, &current_label,
192 &new_label, &is_package_match); 196 &new_label, &is_package_match);
193 if (!current_label.empty() && new_label.empty()) { 197 if (!current_label.empty() && new_label.empty()) {
194 EndTrackingDataUse(tab_id); 198 EndTrackingDataUse(tab_id);
195 } else if (current_label.empty() && !new_label.empty()) { 199 } else if (current_label.empty() && !new_label.empty()) {
196 StartTrackingDataUse( 200 StartTrackingDataUse(
197 tab_id, new_label, 201 tab_id, new_label,
198 ((transition == TRANSITION_CUSTOM_TAB) && is_package_match)); 202 ((transition == TRANSITION_CUSTOM_TAB) && is_package_match));
(...skipping 12 matching lines...) Expand all
211 TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id); 215 TabEntryMap::iterator tab_entry_iterator = active_tabs_.find(tab_id);
212 if (tab_entry_iterator == active_tabs_.end()) 216 if (tab_entry_iterator == active_tabs_.end())
213 return; 217 return;
214 218
215 TabDataUseEntry& tab_entry = tab_entry_iterator->second; 219 TabDataUseEntry& tab_entry = tab_entry_iterator->second;
216 if (tab_entry.IsTrackingDataUse()) 220 if (tab_entry.IsTrackingDataUse())
217 tab_entry.EndTracking(); 221 tab_entry.EndTracking();
218 tab_entry.OnTabCloseEvent(); 222 tab_entry.OnTabCloseEvent();
219 } 223 }
220 224
221 void DataUseTabModel::OnTrackingLabelRemoved(std::string label) { 225 void DataUseTabModel::OnTrackingLabelRemoved(const std::string& label) {
222 for (auto& tab_entry : active_tabs_) 226 for (auto& tab_entry : active_tabs_)
223 tab_entry.second.EndTrackingWithLabel(label); 227 tab_entry.second.EndTrackingWithLabel(label);
224 } 228 }
225 229
226 bool DataUseTabModel::GetTrackingInfoForTabAtTime( 230 bool DataUseTabModel::GetTrackingInfoForTabAtTime(
227 SessionID::id_type tab_id, 231 SessionID::id_type tab_id,
228 base::TimeTicks timestamp, 232 base::TimeTicks timestamp,
229 TrackingInfo* output_tracking_info) const { 233 TrackingInfo* output_tracking_info) const {
230 DCHECK(thread_checker_.CalledOnValidThread()); 234 DCHECK(thread_checker_.CalledOnValidThread());
231 235
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 std::vector<std::string> empty; 308 std::vector<std::string> empty;
305 if (!is_control_app_installed_) { 309 if (!is_control_app_installed_) {
306 // Clear rules. 310 // Clear rules.
307 data_use_matcher_->RegisterURLRegexes(empty, empty, empty); 311 data_use_matcher_->RegisterURLRegexes(empty, empty, empty);
308 if (!is_ready_for_navigation_event_) { 312 if (!is_ready_for_navigation_event_) {
309 is_ready_for_navigation_event_ = true; 313 is_ready_for_navigation_event_ = true;
310 NotifyObserversOfDataUseTabModelReady(); 314 NotifyObserversOfDataUseTabModelReady();
311 } 315 }
312 } else { 316 } else {
313 // Fetch the matching rules when the app is installed. 317 // Fetch the matching rules when the app is installed.
314 data_use_matcher_->FetchMatchingRules(); 318 fetch_matching_rules_callback_.Run();
315 } 319 }
316 } 320 }
317 321
318 base::TimeTicks DataUseTabModel::NowTicks() const { 322 base::TimeTicks DataUseTabModel::NowTicks() const {
319 DCHECK(thread_checker_.CalledOnValidThread()); 323 DCHECK(thread_checker_.CalledOnValidThread());
320 return tick_clock_->NowTicks(); 324 return tick_clock_->NowTicks();
321 } 325 }
322 326
323 bool DataUseTabModel::IsCustomTabPackageMatch(SessionID::id_type tab_id) const { 327 bool DataUseTabModel::IsCustomTabPackageMatch(SessionID::id_type tab_id) const {
324 DCHECK(thread_checker_.CalledOnValidThread()); 328 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 NowTicks() - 521 NowTicks() -
518 oldest_tab_entry_iterator->second.GetLatestStartOrEndTime(), 522 oldest_tab_entry_iterator->second.GetLatestStartOrEndTime(),
519 base::TimeDelta::FromMinutes(1), base::TimeDelta::FromHours(1), 50); 523 base::TimeDelta::FromMinutes(1), base::TimeDelta::FromHours(1), 50);
520 active_tabs_.erase(oldest_tab_entry_iterator); 524 active_tabs_.erase(oldest_tab_entry_iterator);
521 } 525 }
522 } 526 }
523 527
524 } // namespace android 528 } // namespace android
525 529
526 } // namespace chrome 530 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698