OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/android/datausage/external_data_use_observer.h" |
| 6 |
| 7 #include "base/android/jni_string.h" |
| 8 #include "jni/ExternalDataUseObserver_jni.h" |
| 9 #include "third_party/re2/re2/re2.h" |
| 10 #include "url/gurl.h" |
| 11 |
| 12 using base::android::ConvertUTF8ToJavaString; |
| 13 |
| 14 namespace chrome { |
| 15 |
| 16 namespace android { |
| 17 |
| 18 ExternalDataUseObserver::ExternalDataUseObserver( |
| 19 data_usage::DataUseAggregator* data_use_aggregator) |
| 20 : data_use_aggregator_(data_use_aggregator) { |
| 21 DCHECK(data_use_aggregator_); |
| 22 |
| 23 JNIEnv* env = base::android::AttachCurrentThread(); |
| 24 j_external_data_use_observer_.Reset(Java_ExternalDataUseObserver_create( |
| 25 env, base::android::GetApplicationContext(), |
| 26 reinterpret_cast<intptr_t>(this))); |
| 27 DCHECK(!j_external_data_use_observer_.is_null()); |
| 28 } |
| 29 |
| 30 ExternalDataUseObserver::~ExternalDataUseObserver() { |
| 31 DCHECK(thread_checker_.CalledOnValidThread()); |
| 32 |
| 33 JNIEnv* env = base::android::AttachCurrentThread(); |
| 34 |
| 35 Java_ExternalDataUseObserver_onDestroy(env, |
| 36 j_external_data_use_observer_.obj()); |
| 37 |
| 38 if (url_patterns_.size() > 0) |
| 39 data_use_aggregator_->RemoveObserver(this); |
| 40 } |
| 41 |
| 42 bool ExternalDataUseObserver::Matches(const GURL& gurl) const { |
| 43 if (!gurl.is_valid() || gurl.is_empty()) |
| 44 return false; |
| 45 |
| 46 for (const re2::RE2* pattern : url_patterns_) { |
| 47 if (re2::RE2::FullMatch(gurl.spec(), *pattern)) |
| 48 return true; |
| 49 } |
| 50 |
| 51 return false; |
| 52 } |
| 53 |
| 54 void ExternalDataUseObserver::OnDataUse( |
| 55 const std::vector<data_usage::DataUse>& data_use_sequence) { |
| 56 DCHECK(thread_checker_.CalledOnValidThread()); |
| 57 DCHECK(!j_external_data_use_observer_.is_null()); |
| 58 |
| 59 JNIEnv* env = base::android::AttachCurrentThread(); |
| 60 |
| 61 for (const auto& data_use : data_use_sequence) { |
| 62 if (!Matches(data_use.url)) |
| 63 continue; |
| 64 |
| 65 // TODO(tbansal): Use buffering to avoid frequent JNI calls. |
| 66 std::string tag = ""; // data_use.tab_id; |
| 67 int64_t bytes_downloaded = data_use.rx_bytes; |
| 68 int64_t bytes_uploaded = data_use.tx_bytes; |
| 69 Java_ExternalDataUseObserver_onDataUse( |
| 70 env, j_external_data_use_observer_.obj(), |
| 71 ConvertUTF8ToJavaString(env, tag).obj(), bytes_downloaded, |
| 72 bytes_uploaded); |
| 73 } |
| 74 } |
| 75 |
| 76 void ExternalDataUseObserver::RegisterURLRegexes( |
| 77 const std::vector<std::string>& url_regexes) { |
| 78 DCHECK(thread_checker_.CalledOnValidThread()); |
| 79 |
| 80 bool registered_as_observer = url_patterns_.size() > 0; |
| 81 if (!registered_as_observer && url_regexes.size() > 0) { |
| 82 registered_as_observer = true; |
| 83 data_use_aggregator_->AddObserver(this); |
| 84 } |
| 85 |
| 86 url_patterns_.clear(); |
| 87 |
| 88 re2::RE2::Options options(re2::RE2::DefaultOptions); |
| 89 options.set_case_sensitive(false); |
| 90 |
| 91 for (const std::string& url_regex : url_regexes) { |
| 92 if (url_regex.empty()) |
| 93 continue; |
| 94 scoped_ptr<re2::RE2> pattern(new re2::RE2(url_regex, options)); |
| 95 if (!pattern->ok()) |
| 96 continue; |
| 97 url_patterns_.push_back(pattern.Pass()); |
| 98 } |
| 99 |
| 100 // Unregister as an observer if no regular expressions were received. |
| 101 if (url_patterns_.size() == 0 && registered_as_observer) |
| 102 data_use_aggregator_->RemoveObserver(this); |
| 103 } |
| 104 |
| 105 bool RegisterExternalDataUseObserver(JNIEnv* env) { |
| 106 return RegisterNativesImpl(env); |
| 107 } |
| 108 |
| 109 } // namespace android |
| 110 |
| 111 } // namespace chrome |
OLD | NEW |