Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / net / spdyproxy / data_reduction_proxy_settings_android.cc
1 // Copyright 2013 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/net/spdyproxy/data_reduction_proxy_settings_android.h"
6
7 #include "base/android/build_info.h"
8 #include "base/android/jni_android.h"
9 #include "base/android/jni_string.h"
10 #include "base/bind.h"
11 #include "base/command_line.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/metrics/field_trial.h"
14 #include "base/metrics/histogram.h"
15 #include "base/prefs/pref_member.h"
16 #include "base/prefs/pref_service.h"
17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/utf_string_conversions.h"
19 #include "chrome/browser/browser_process.h"
20 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_configurator.h"
21 #include "chrome/browser/prefs/proxy_prefs.h"
22 #include "chrome/browser/profiles/profile.h"
23 #include "chrome/browser/profiles/profile_manager.h"
24 #include "chrome/common/chrome_switches.h"
25 #include "chrome/common/pref_names.h"
26 #include "components/data_reduction_proxy/browser/data_reduction_proxy_configurator.h"
27 #include "components/data_reduction_proxy/browser/data_reduction_proxy_settings.h"
28 #include "jni/DataReductionProxySettings_jni.h"
29 #include "net/base/auth.h"
30 #include "net/base/host_port_pair.h"
31 #include "net/base/load_flags.h"
32 #include "net/base/net_errors.h"
33 #include "net/url_request/url_fetcher.h"
34 #include "net/url_request/url_fetcher_delegate.h"
35 #include "net/url_request/url_request_status.h"
36
37 using base::android::CheckException;
38 using base::android::ConvertJavaStringToUTF8;
39 using base::android::ConvertUTF16ToJavaString;
40 using base::android::ConvertUTF8ToJavaString;
41 using base::android::ScopedJavaLocalRef;
42 using data_reduction_proxy::DataReductionProxySettings;
43
44 namespace {
45
46 // The C++ definition of enum SpdyProxyAuthState defined in
47 // tools/histograms/histograms.xml.
48 // New values should be added at the end before |NUM_SPDY_PROXY_AUTH_STATE|.
49 enum {
50   CHROME_STARTUP,
51   SPDY_PROXY_AUTH_ON_AT_STARTUP,
52   SPDY_PROXY_AUTH_ON_BY_USER,
53   SPDY_PROXY_AUTH_OFF_BY_USER,
54   // Used by UMA histograms and should always be the last value.
55   NUM_SPDY_PROXY_AUTH_STATE
56 };
57
58 const char kEnabled[] = "Enabled";
59
60 }  // namespace
61
62 DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid(
63     JNIEnv* env, jobject obj) : DataReductionProxySettings() {
64 #if defined(SPDY_PROXY_AUTH_VALUE)
65   set_key(SPDY_PROXY_AUTH_VALUE);
66 #endif
67   SetAllowed(IsIncludedInFieldTrialOrFlags());
68   SetPromoAllowed(base::FieldTrialList::FindFullName(
69       "DataCompressionProxyPromoVisibility") == kEnabled);
70 }
71
72 DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid() {
73 #if defined(SPDY_PROXY_AUTH_VALUE)
74   set_key(SPDY_PROXY_AUTH_VALUE);
75 #endif
76 }
77
78 DataReductionProxySettingsAndroid::~DataReductionProxySettingsAndroid() {
79 }
80
81 void DataReductionProxySettingsAndroid::InitDataReductionProxySettings(
82     JNIEnv* env,
83     jobject obj) {
84   PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
85
86   scoped_ptr<data_reduction_proxy::DataReductionProxyConfigurator>
87       configurator(new DataReductionProxyChromeConfigurator(prefs));
88   SetProxyConfigurator(configurator.Pass());
89   DataReductionProxySettings::InitDataReductionProxySettings(
90       prefs,
91       g_browser_process->local_state(),
92       ProfileManager::GetActiveUserProfile()->GetRequestContext());
93 }
94
95 void DataReductionProxySettingsAndroid::BypassHostPattern(
96     JNIEnv* env, jobject obj, jstring pattern) {
97   config()->AddHostPatternToBypass(
98       ConvertJavaStringToUTF8(env, pattern));
99 }
100 void DataReductionProxySettingsAndroid::BypassURLPattern(
101     JNIEnv* env, jobject obj, jstring pattern) {
102   config()->AddURLPatternToBypass(ConvertJavaStringToUTF8(env, pattern));
103 }
104
105 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyAllowed(
106     JNIEnv* env, jobject obj) {
107   return DataReductionProxySettings::IsDataReductionProxyAllowed();
108 }
109
110 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyPromoAllowed(
111     JNIEnv* env, jobject obj) {
112   return DataReductionProxySettings::IsDataReductionProxyPromoAllowed();
113 }
114
115 ScopedJavaLocalRef<jstring>
116 DataReductionProxySettingsAndroid::GetDataReductionProxyOrigin(
117     JNIEnv* env, jobject obj) {
118   return ConvertUTF8ToJavaString(
119       env, DataReductionProxySettings::GetDataReductionProxyOrigin());
120 }
121
122 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyEnabled(
123     JNIEnv* env, jobject obj) {
124   return DataReductionProxySettings::IsDataReductionProxyEnabled();
125 }
126
127 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyManaged(
128     JNIEnv* env, jobject obj) {
129   return DataReductionProxySettings::IsDataReductionProxyManaged();
130 }
131
132 void DataReductionProxySettingsAndroid::SetDataReductionProxyEnabled(
133     JNIEnv* env,
134     jobject obj,
135     jboolean enabled) {
136   DataReductionProxySettings::SetDataReductionProxyEnabled(enabled);
137 }
138
139 jlong DataReductionProxySettingsAndroid::GetDataReductionLastUpdateTime(
140     JNIEnv* env, jobject obj) {
141   return DataReductionProxySettings::GetDataReductionLastUpdateTime();
142 }
143
144 base::android::ScopedJavaLocalRef<jobject>
145 DataReductionProxySettingsAndroid::GetContentLengths(JNIEnv* env,
146                                                      jobject obj) {
147   int64 original_content_length;
148   int64 received_content_length;
149   int64 last_update_internal;
150   DataReductionProxySettings::GetContentLengths(
151       data_reduction_proxy::kNumDaysInHistorySummary,
152       &original_content_length,
153       &received_content_length,
154       &last_update_internal);
155
156   return Java_ContentLengths_create(env,
157                                     original_content_length,
158                                     received_content_length);
159 }
160
161 jboolean DataReductionProxySettingsAndroid::IsAcceptableAuthChallenge(
162     JNIEnv* env,
163     jobject obj,
164     jstring host,
165     jstring realm) {
166   scoped_refptr<net::AuthChallengeInfo> auth_info(new net::AuthChallengeInfo);
167   auth_info->realm = ConvertJavaStringToUTF8(env, realm);
168   auth_info->challenger =
169       net::HostPortPair::FromString(ConvertJavaStringToUTF8(env, host));
170   return DataReductionProxySettings::IsAcceptableAuthChallenge(auth_info.get());
171 }
172
173 ScopedJavaLocalRef<jstring>
174 DataReductionProxySettingsAndroid::GetTokenForAuthChallenge(JNIEnv* env,
175                                                             jobject obj,
176                                                             jstring host,
177                                                             jstring realm) {
178   scoped_refptr<net::AuthChallengeInfo> auth_info(new net::AuthChallengeInfo);
179   auth_info->realm = ConvertJavaStringToUTF8(env, realm);
180   auth_info->challenger =
181       net::HostPortPair::FromString(ConvertJavaStringToUTF8(env, host));
182
183   // If an empty string != null in Java, then here we should test for the
184   // token being empty and return a java null.
185   return ConvertUTF16ToJavaString(env,
186       DataReductionProxySettings::GetTokenForAuthChallenge(auth_info.get()));
187  }
188
189 ScopedJavaLocalRef<jlongArray>
190 DataReductionProxySettingsAndroid::GetDailyOriginalContentLengths(
191     JNIEnv* env, jobject obj) {
192   return GetDailyContentLengths(
193       env, data_reduction_proxy::prefs::kDailyHttpOriginalContentLength);
194 }
195
196 ScopedJavaLocalRef<jlongArray>
197 DataReductionProxySettingsAndroid::GetDailyReceivedContentLengths(
198     JNIEnv* env, jobject obj) {
199   return GetDailyContentLengths(
200       env, data_reduction_proxy::prefs::kDailyHttpReceivedContentLength);
201 }
202
203 // static
204 bool DataReductionProxySettingsAndroid::Register(JNIEnv* env) {
205   bool register_natives_impl_result = RegisterNativesImpl(env);
206   return register_natives_impl_result;
207 }
208
209 void DataReductionProxySettingsAndroid::AddDefaultProxyBypassRules() {
210    DataReductionProxySettings::AddDefaultProxyBypassRules();
211   // Chrome cannot authenticate with the data reduction proxy when fetching URLs
212   // from the settings menu.
213   config()->AddURLPatternToBypass("http://www.google.com/policies/privacy*");
214 }
215
216 void DataReductionProxySettingsAndroid::SetProxyConfigs(bool enabled,
217                                                         bool restricted,
218                                                         bool at_startup) {
219   // Sanity check: If there's no fallback proxy, we can't do a restricted mode.
220   std::string fallback = GetDataReductionProxyFallback();
221   if (fallback.empty() && enabled && restricted)
222       enabled = false;
223
224   LogProxyState(enabled, restricted, at_startup);
225
226   if (enabled) {
227     config()->Enable(restricted,
228                      !fallback_allowed(),
229                      DataReductionProxySettings::GetDataReductionProxyOrigin(),
230                      GetDataReductionProxyFallback());
231   } else {
232     config()->Disable();
233   }
234 }
235
236 ScopedJavaLocalRef<jlongArray>
237 DataReductionProxySettingsAndroid::GetDailyContentLengths(
238     JNIEnv* env,  const char* pref_name) {
239   jlongArray result = env->NewLongArray(
240       data_reduction_proxy::kNumDaysInHistory);
241
242   DataReductionProxySettings::ContentLengthList lengths  =
243       DataReductionProxySettings::GetDailyContentLengths(pref_name);
244
245   if (!lengths.empty()) {
246     DCHECK_EQ(lengths.size(), data_reduction_proxy::kNumDaysInHistory);
247     env->SetLongArrayRegion(result, 0, lengths.size(), &lengths[0]);
248     return ScopedJavaLocalRef<jlongArray>(env, result);
249   }
250
251   return ScopedJavaLocalRef<jlongArray>(env, result);
252 }
253
254
255
256 // Used by generated jni code.
257 static jlong Init(JNIEnv* env, jobject obj) {
258   DataReductionProxySettingsAndroid* settings =
259       new DataReductionProxySettingsAndroid(env, obj);
260   return reinterpret_cast<intptr_t>(settings);
261 }