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/external_data_use_observer.h" | 5 #include "chrome/browser/android/data_usage/external_data_use_observer.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/android/jni_string.h" | 9 #include "base/android/jni_string.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 } | 132 } |
133 | 133 |
134 void ExternalDataUseObserver::FetchMatchingRulesOnUIThread() const { | 134 void ExternalDataUseObserver::FetchMatchingRulesOnUIThread() const { |
135 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 135 DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
136 DCHECK(!j_external_data_use_observer_.is_null()); | 136 DCHECK(!j_external_data_use_observer_.is_null()); |
137 JNIEnv* env = base::android::AttachCurrentThread(); | 137 JNIEnv* env = base::android::AttachCurrentThread(); |
138 Java_ExternalDataUseObserver_fetchMatchingRules( | 138 Java_ExternalDataUseObserver_fetchMatchingRules( |
139 env, j_external_data_use_observer_.obj()); | 139 env, j_external_data_use_observer_.obj()); |
140 } | 140 } |
141 | 141 |
142 void ExternalDataUseObserver::FetchMatchingRulesCallback( | 142 void ExternalDataUseObserver::FetchMatchingRulesDone( |
143 JNIEnv* env, | 143 JNIEnv* env, |
144 jobject obj, | 144 jobject obj, |
145 const base::android::JavaParamRef<jobjectArray>& app_package_name, | 145 const base::android::JavaParamRef<jobjectArray>& app_package_name, |
146 const base::android::JavaParamRef<jobjectArray>& domain_path_regex, | 146 const base::android::JavaParamRef<jobjectArray>& domain_path_regex, |
147 const base::android::JavaParamRef<jobjectArray>& label) { | 147 const base::android::JavaParamRef<jobjectArray>& label) { |
148 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 148 DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
149 // Convert to native objects. | 149 // Convert to native objects. |
150 std::vector<std::string> app_package_name_native; | 150 std::vector<std::string> app_package_name_native; |
151 std::vector<std::string> domain_path_regex_native; | 151 std::vector<std::string> domain_path_regex_native; |
152 std::vector<std::string> label_native; | 152 std::vector<std::string> label_native; |
153 | 153 |
154 if (app_package_name && domain_path_regex && label) { | 154 if (app_package_name && domain_path_regex && label) { |
155 base::android::AppendJavaStringArrayToStringVector( | 155 base::android::AppendJavaStringArrayToStringVector( |
156 env, app_package_name, &app_package_name_native); | 156 env, app_package_name, &app_package_name_native); |
157 base::android::AppendJavaStringArrayToStringVector( | 157 base::android::AppendJavaStringArrayToStringVector( |
158 env, domain_path_regex, &domain_path_regex_native); | 158 env, domain_path_regex, &domain_path_regex_native); |
159 base::android::AppendJavaStringArrayToStringVector(env, label, | 159 base::android::AppendJavaStringArrayToStringVector(env, label, |
160 &label_native); | 160 &label_native); |
161 } | 161 } |
162 | 162 |
163 io_task_runner_->PostTask( | 163 io_task_runner_->PostTask( |
164 FROM_HERE, | 164 FROM_HERE, |
165 base::Bind(&ExternalDataUseObserver::FetchMatchingRulesCallbackOnIOThread, | 165 base::Bind(&ExternalDataUseObserver::FetchMatchingRulesDoneOnIOThread, |
166 GetIOWeakPtr(), app_package_name_native, | 166 GetIOWeakPtr(), app_package_name_native, |
167 domain_path_regex_native, label_native)); | 167 domain_path_regex_native, label_native)); |
168 } | 168 } |
169 | 169 |
170 void ExternalDataUseObserver::FetchMatchingRulesCallbackOnIOThread( | 170 void ExternalDataUseObserver::FetchMatchingRulesDoneOnIOThread( |
171 const std::vector<std::string>& app_package_name, | 171 const std::vector<std::string>& app_package_name, |
172 const std::vector<std::string>& domain_path_regex, | 172 const std::vector<std::string>& domain_path_regex, |
173 const std::vector<std::string>& label) { | 173 const std::vector<std::string>& label) { |
174 DCHECK(thread_checker_.CalledOnValidThread()); | 174 DCHECK(thread_checker_.CalledOnValidThread()); |
175 | 175 |
176 RegisterURLRegexes(app_package_name, domain_path_regex, label); | 176 RegisterURLRegexes(app_package_name, domain_path_regex, label); |
177 matching_rules_fetch_pending_ = false; | 177 matching_rules_fetch_pending_ = false; |
178 // Process buffered reports. | 178 // Process buffered reports. |
179 } | 179 } |
180 | 180 |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 const re2::RE2* pattern = matching_rules_[i]->pattern(); | 379 const re2::RE2* pattern = matching_rules_[i]->pattern(); |
380 if (re2::RE2::FullMatch(gurl.spec(), *pattern)) { | 380 if (re2::RE2::FullMatch(gurl.spec(), *pattern)) { |
381 *label = matching_rules_[i]->label(); | 381 *label = matching_rules_[i]->label(); |
382 return true; | 382 return true; |
383 } | 383 } |
384 } | 384 } |
385 | 385 |
386 return false; | 386 return false; |
387 } | 387 } |
388 | 388 |
| 389 ExternalDataUseObserver::DataUseReportKey::DataUseReportKey( |
| 390 const std::string& label, |
| 391 net::NetworkChangeNotifier::ConnectionType connection_type, |
| 392 const std::string& mcc_mnc) |
| 393 : label(label), connection_type(connection_type), mcc_mnc(mcc_mnc) {} |
| 394 |
| 395 bool ExternalDataUseObserver::DataUseReportKey::operator==( |
| 396 const DataUseReportKey& other) const { |
| 397 return label == other.label && connection_type == other.connection_type && |
| 398 mcc_mnc == other.mcc_mnc; |
| 399 } |
| 400 |
| 401 ExternalDataUseObserver::DataUseReport::DataUseReport( |
| 402 const base::Time& start_time, |
| 403 const base::Time& end_time, |
| 404 int64_t bytes_downloaded, |
| 405 int64_t bytes_uploaded) |
| 406 : start_time(start_time), |
| 407 end_time(end_time), |
| 408 bytes_downloaded(bytes_downloaded), |
| 409 bytes_uploaded(bytes_uploaded) {} |
| 410 |
| 411 size_t ExternalDataUseObserver::DataUseReportKeyHash::operator()( |
| 412 const DataUseReportKey& k) const { |
| 413 // The hash is computed by hashing individual variables and combining them |
| 414 // using prime numbers. Prime numbers are used for multiplication because the |
| 415 // number of buckets used by map is always an even number. Using a prime |
| 416 // number ensures that for two different DataUseReportKey objects (say |j| |
| 417 // and |k|), if the hash value of |k.label| is equal to hash value of |
| 418 // |j.mcc_mnc|, then |j| and |k| map to different buckets. Large prime |
| 419 // numbers are used so that hash value is spread over a larger range. |
| 420 std::hash<std::string> hash_function; |
| 421 size_t hash = 1; |
| 422 hash = hash * 23 + hash_function(k.label); |
| 423 hash = hash * 43 + k.connection_type; |
| 424 hash = hash * 83 + hash_function(k.mcc_mnc); |
| 425 return hash; |
| 426 } |
| 427 |
389 ExternalDataUseObserver::MatchingRule::MatchingRule( | 428 ExternalDataUseObserver::MatchingRule::MatchingRule( |
390 const std::string& app_package_name, | 429 const std::string& app_package_name, |
391 scoped_ptr<re2::RE2> pattern, | 430 scoped_ptr<re2::RE2> pattern, |
392 const std::string& label) | 431 const std::string& label) |
393 : app_package_name_(app_package_name), | 432 : app_package_name_(app_package_name), |
394 pattern_(pattern.Pass()), | 433 pattern_(pattern.Pass()), |
395 label_(label) {} | 434 label_(label) {} |
396 | 435 |
397 ExternalDataUseObserver::MatchingRule::~MatchingRule() {} | 436 ExternalDataUseObserver::MatchingRule::~MatchingRule() {} |
398 | 437 |
399 const re2::RE2* ExternalDataUseObserver::MatchingRule::pattern() const { | 438 const re2::RE2* ExternalDataUseObserver::MatchingRule::pattern() const { |
400 return pattern_.get(); | 439 return pattern_.get(); |
401 } | 440 } |
402 | 441 |
403 const std::string& ExternalDataUseObserver::MatchingRule::label() const { | 442 const std::string& ExternalDataUseObserver::MatchingRule::label() const { |
404 return label_; | 443 return label_; |
405 } | 444 } |
406 | 445 |
407 bool RegisterExternalDataUseObserver(JNIEnv* env) { | 446 bool RegisterExternalDataUseObserver(JNIEnv* env) { |
408 return RegisterNativesImpl(env); | 447 return RegisterNativesImpl(env); |
409 } | 448 } |
410 | 449 |
411 } // namespace android | 450 } // namespace android |
412 | 451 |
413 } // namespace chrome | 452 } // namespace chrome |
OLD | NEW |