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