OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "android_webview/browser/aw_browser_context.h" | 5 #include "android_webview/browser/aw_browser_context.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "android_webview/browser/aw_browser_policy_connector.h" | 9 #include "android_webview/browser/aw_browser_policy_connector.h" |
10 #include "android_webview/browser/aw_form_database_service.h" | 10 #include "android_webview/browser/aw_form_database_service.h" |
11 #include "android_webview/browser/aw_metrics_service_client.h" | 11 #include "android_webview/browser/aw_metrics_service_client.h" |
12 #include "android_webview/browser/aw_permission_manager.h" | 12 #include "android_webview/browser/aw_permission_manager.h" |
13 #include "android_webview/browser/aw_quota_manager_bridge.h" | 13 #include "android_webview/browser/aw_quota_manager_bridge.h" |
14 #include "android_webview/browser/aw_resource_context.h" | 14 #include "android_webview/browser/aw_resource_context.h" |
15 #include "android_webview/browser/jni_dependency_factory.h" | 15 #include "android_webview/browser/jni_dependency_factory.h" |
16 #include "android_webview/browser/net/aw_url_request_context_getter.h" | 16 #include "android_webview/browser/net/aw_url_request_context_getter.h" |
17 #include "android_webview/common/aw_content_client.h" | 17 #include "android_webview/common/aw_content_client.h" |
18 #include "base/base_paths_android.h" | 18 #include "base/base_paths_android.h" |
19 #include "base/bind.h" | 19 #include "base/bind.h" |
20 #include "base/path_service.h" | 20 #include "base/path_service.h" |
21 #include "components/autofill/core/common/autofill_pref_names.h" | 21 #include "components/autofill/core/common/autofill_pref_names.h" |
22 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_comp
ression_stats.h" | |
23 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_d
ata.h" | |
24 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pref
s.h" | |
25 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_serv
ice.h" | |
26 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_sett
ings.h" | |
27 #include "components/data_reduction_proxy/core/browser/data_store.h" | |
28 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_param
s.h" | |
29 #include "components/metrics/metrics_service.h" | 22 #include "components/metrics/metrics_service.h" |
30 #include "components/policy/core/browser/browser_policy_connector_base.h" | 23 #include "components/policy/core/browser/browser_policy_connector_base.h" |
31 #include "components/policy/core/browser/configuration_policy_pref_store.h" | 24 #include "components/policy/core/browser/configuration_policy_pref_store.h" |
32 #include "components/policy/core/browser/url_blacklist_manager.h" | 25 #include "components/policy/core/browser/url_blacklist_manager.h" |
33 #include "components/pref_registry/pref_registry_syncable.h" | 26 #include "components/pref_registry/pref_registry_syncable.h" |
34 #include "components/prefs/in_memory_pref_store.h" | 27 #include "components/prefs/in_memory_pref_store.h" |
35 #include "components/prefs/pref_service.h" | 28 #include "components/prefs/pref_service.h" |
36 #include "components/prefs/pref_service_factory.h" | 29 #include "components/prefs/pref_service_factory.h" |
37 #include "components/url_formatter/url_fixer.h" | 30 #include "components/url_formatter/url_fixer.h" |
38 #include "components/user_prefs/user_prefs.h" | 31 #include "components/user_prefs/user_prefs.h" |
(...skipping 16 matching lines...) Expand all Loading... |
55 // authentication. | 48 // authentication. |
56 const char kAuthAndroidNegotiateAccountType[] = | 49 const char kAuthAndroidNegotiateAccountType[] = |
57 "auth.android_negotiate_account_type"; | 50 "auth.android_negotiate_account_type"; |
58 | 51 |
59 // Whitelist containing servers for which Integrated Authentication is enabled. | 52 // Whitelist containing servers for which Integrated Authentication is enabled. |
60 const char kAuthServerWhitelist[] = "auth.server_whitelist"; | 53 const char kAuthServerWhitelist[] = "auth.server_whitelist"; |
61 | 54 |
62 } // namespace prefs | 55 } // namespace prefs |
63 | 56 |
64 namespace { | 57 namespace { |
65 // Name of the preference that governs enabling the Data Reduction Proxy. | |
66 const char kDataReductionProxyEnabled[] = "data_reduction_proxy.enabled"; | |
67 | 58 |
68 // Shows notifications which correspond to PersistentPrefStore's reading errors. | 59 // Shows notifications which correspond to PersistentPrefStore's reading errors. |
69 void HandleReadError(PersistentPrefStore::PrefReadError error) { | 60 void HandleReadError(PersistentPrefStore::PrefReadError error) { |
70 } | 61 } |
71 | 62 |
72 void DeleteDirRecursively(const base::FilePath& path) { | 63 void DeleteDirRecursively(const base::FilePath& path) { |
73 if (!base::DeleteFile(path, true)) { | 64 if (!base::DeleteFile(path, true)) { |
74 // Deleting a non-existent file is considered successful, so this will | 65 // Deleting a non-existent file is considered successful, so this will |
75 // trigger only in case of real errors. | 66 // trigger only in case of real errors. |
76 LOG(WARNING) << "Failed to delete " << path.AsUTF8Unsafe(); | 67 LOG(WARNING) << "Failed to delete " << path.AsUTF8Unsafe(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = | 100 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = |
110 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); | 101 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); |
111 | 102 |
112 return new policy::URLBlacklistManager(pref_service, background_task_runner, | 103 return new policy::URLBlacklistManager(pref_service, background_task_runner, |
113 io_task_runner, segment_url_callback, | 104 io_task_runner, segment_url_callback, |
114 base::Bind(OverrideBlacklistForURL)); | 105 base::Bind(OverrideBlacklistForURL)); |
115 } | 106 } |
116 | 107 |
117 } // namespace | 108 } // namespace |
118 | 109 |
119 // Data reduction proxy is disabled by default. | |
120 bool AwBrowserContext::data_reduction_proxy_enabled_ = false; | |
121 | |
122 // Delete the legacy cache dir (in the app data dir) in 10 seconds after init. | 110 // Delete the legacy cache dir (in the app data dir) in 10 seconds after init. |
123 int AwBrowserContext::legacy_cache_removal_delay_ms_ = 10000; | 111 int AwBrowserContext::legacy_cache_removal_delay_ms_ = 10000; |
124 | 112 |
125 AwBrowserContext::AwBrowserContext( | 113 AwBrowserContext::AwBrowserContext( |
126 const FilePath path, | 114 const FilePath path, |
127 JniDependencyFactory* native_factory) | 115 JniDependencyFactory* native_factory) |
128 : context_storage_path_(path), | 116 : context_storage_path_(path), |
129 native_factory_(native_factory) { | 117 native_factory_(native_factory) { |
130 DCHECK(!g_browser_context); | 118 DCHECK(!g_browser_context); |
131 g_browser_context = this; | 119 g_browser_context = this; |
(...skipping 17 matching lines...) Expand all Loading... |
149 } | 137 } |
150 | 138 |
151 // static | 139 // static |
152 AwBrowserContext* AwBrowserContext::FromWebContents( | 140 AwBrowserContext* AwBrowserContext::FromWebContents( |
153 content::WebContents* web_contents) { | 141 content::WebContents* web_contents) { |
154 // This is safe; this is the only implementation of the browser context. | 142 // This is safe; this is the only implementation of the browser context. |
155 return static_cast<AwBrowserContext*>(web_contents->GetBrowserContext()); | 143 return static_cast<AwBrowserContext*>(web_contents->GetBrowserContext()); |
156 } | 144 } |
157 | 145 |
158 // static | 146 // static |
159 void AwBrowserContext::SetDataReductionProxyEnabled(bool enabled) { | |
160 // Cache the setting value. It is possible that data reduction proxy is | |
161 // not created yet. | |
162 data_reduction_proxy_enabled_ = enabled; | |
163 AwBrowserContext* context = AwBrowserContext::GetDefault(); | |
164 // Can't enable Data reduction proxy if user pref service is not ready. | |
165 if (context == NULL || context->user_pref_service_.get() == NULL) | |
166 return; | |
167 data_reduction_proxy::DataReductionProxySettings* proxy_settings = | |
168 context->GetDataReductionProxySettings(); | |
169 if (proxy_settings == NULL) | |
170 return; | |
171 // At this point, context->PreMainMessageLoopRun() has run, so | |
172 // context->data_reduction_proxy_io_data() is valid. | |
173 DCHECK(context->GetDataReductionProxyIOData()); | |
174 context->CreateDataReductionProxyStatisticsIfNecessary(); | |
175 proxy_settings->SetDataReductionProxyEnabled(data_reduction_proxy_enabled_); | |
176 } | |
177 | |
178 // static | |
179 void AwBrowserContext::SetLegacyCacheRemovalDelayForTest(int delay_ms) { | 147 void AwBrowserContext::SetLegacyCacheRemovalDelayForTest(int delay_ms) { |
180 legacy_cache_removal_delay_ms_ = delay_ms; | 148 legacy_cache_removal_delay_ms_ = delay_ms; |
181 } | 149 } |
182 | 150 |
183 void AwBrowserContext::PreMainMessageLoopRun() { | 151 void AwBrowserContext::PreMainMessageLoopRun() { |
184 FilePath cache_path; | 152 FilePath cache_path; |
185 const FilePath fallback_cache_dir = | 153 const FilePath fallback_cache_dir = |
186 GetPath().Append(FILE_PATH_LITERAL("Cache")); | 154 GetPath().Append(FILE_PATH_LITERAL("Cache")); |
187 if (PathService::Get(base::DIR_CACHE, &cache_path)) { | 155 if (PathService::Get(base::DIR_CACHE, &cache_path)) { |
188 cache_path = cache_path.Append( | 156 cache_path = cache_path.Append( |
189 FILE_PATH_LITERAL("org.chromium.android_webview")); | 157 FILE_PATH_LITERAL("org.chromium.android_webview")); |
190 // Delay the legacy dir removal to not impact startup performance. | 158 // Delay the legacy dir removal to not impact startup performance. |
191 BrowserThread::PostDelayedTask( | 159 BrowserThread::PostDelayedTask( |
192 BrowserThread::FILE, FROM_HERE, | 160 BrowserThread::FILE, FROM_HERE, |
193 base::Bind(&DeleteDirRecursively, fallback_cache_dir), | 161 base::Bind(&DeleteDirRecursively, fallback_cache_dir), |
194 base::TimeDelta::FromMilliseconds(legacy_cache_removal_delay_ms_)); | 162 base::TimeDelta::FromMilliseconds(legacy_cache_removal_delay_ms_)); |
195 } else { | 163 } else { |
196 cache_path = fallback_cache_dir; | 164 cache_path = fallback_cache_dir; |
197 LOG(WARNING) << "Failed to get cache directory for Android WebView. " | 165 LOG(WARNING) << "Failed to get cache directory for Android WebView. " |
198 << "Using app data directory as a fallback."; | 166 << "Using app data directory as a fallback."; |
199 } | 167 } |
200 | 168 |
201 browser_policy_connector_.reset(new AwBrowserPolicyConnector()); | 169 browser_policy_connector_.reset(new AwBrowserPolicyConnector()); |
202 | 170 |
203 InitUserPrefService(); | 171 InitUserPrefService(); |
204 | 172 |
205 url_request_context_getter_ = new AwURLRequestContextGetter( | 173 url_request_context_getter_ = new AwURLRequestContextGetter( |
206 cache_path, CreateProxyConfigService(), user_pref_service_.get()); | 174 cache_path, CreateProxyConfigService(), user_pref_service_.get()); |
207 | 175 |
208 data_reduction_proxy_io_data_.reset( | |
209 new data_reduction_proxy::DataReductionProxyIOData( | |
210 data_reduction_proxy::Client::WEBVIEW_ANDROID, | |
211 data_reduction_proxy::DataReductionProxyParams::kAllowed, | |
212 url_request_context_getter_->GetNetLog(), | |
213 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), | |
214 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), | |
215 false /* enable */, | |
216 GetUserAgent())); | |
217 data_reduction_proxy_settings_.reset( | |
218 new data_reduction_proxy::DataReductionProxySettings()); | |
219 std::unique_ptr<data_reduction_proxy::DataStore> store( | |
220 new data_reduction_proxy::DataStore()); | |
221 base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); | 176 base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); |
222 scoped_refptr<base::SequencedTaskRunner> db_task_runner = | 177 scoped_refptr<base::SequencedTaskRunner> db_task_runner = |
223 pool->GetSequencedTaskRunnerWithShutdownBehavior( | 178 pool->GetSequencedTaskRunnerWithShutdownBehavior( |
224 pool->GetSequenceToken(), | 179 pool->GetSequenceToken(), |
225 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | 180 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); |
226 data_reduction_proxy_service_.reset( | |
227 new data_reduction_proxy::DataReductionProxyService( | |
228 data_reduction_proxy_settings_.get(), nullptr, | |
229 GetAwURLRequestContext(), std::move(store), | |
230 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), | |
231 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), | |
232 db_task_runner, base::TimeDelta())); | |
233 data_reduction_proxy_io_data_->SetDataReductionProxyService( | |
234 data_reduction_proxy_service_->GetWeakPtr()); | |
235 | |
236 visitedlink_master_.reset( | 181 visitedlink_master_.reset( |
237 new visitedlink::VisitedLinkMaster(this, this, false)); | 182 new visitedlink::VisitedLinkMaster(this, this, false)); |
238 visitedlink_master_->Init(); | 183 visitedlink_master_->Init(); |
239 | 184 |
240 form_database_service_.reset( | 185 form_database_service_.reset( |
241 new AwFormDatabaseService(context_storage_path_)); | 186 new AwFormDatabaseService(context_storage_path_)); |
242 | 187 |
243 // Ensure the storage partition is initialized in time for DataReductionProxy. | |
244 EnsureResourceContextInitialized(this); | 188 EnsureResourceContextInitialized(this); |
245 | 189 |
246 // TODO(dgn) lazy init, see http://crbug.com/521542 | |
247 data_reduction_proxy_settings_->InitDataReductionProxySettings( | |
248 kDataReductionProxyEnabled, user_pref_service_.get(), | |
249 data_reduction_proxy_io_data_.get(), | |
250 std::move(data_reduction_proxy_service_)); | |
251 data_reduction_proxy_settings_->MaybeActivateDataReductionProxy(true); | |
252 | |
253 blacklist_manager_.reset(CreateURLBlackListManager(user_pref_service_.get())); | 190 blacklist_manager_.reset(CreateURLBlackListManager(user_pref_service_.get())); |
254 | 191 |
255 // UMA uses randomly-generated GUIDs (globally unique identifiers) to | 192 // UMA uses randomly-generated GUIDs (globally unique identifiers) to |
256 // anonymously identify logs. Every WebView-using app on every device | 193 // anonymously identify logs. Every WebView-using app on every device |
257 // is given a GUID, stored in this file in the app's data directory. | 194 // is given a GUID, stored in this file in the app's data directory. |
258 const FilePath guid_file_path = | 195 const FilePath guid_file_path = |
259 GetPath().Append(FILE_PATH_LITERAL("metrics_guid")); | 196 GetPath().Append(FILE_PATH_LITERAL("metrics_guid")); |
260 | 197 |
261 AwMetricsServiceClient::GetInstance()->Initialize( | 198 AwMetricsServiceClient::GetInstance()->Initialize( |
262 user_pref_service_.get(), | 199 user_pref_service_.get(), |
(...skipping 11 matching lines...) Expand all Loading... |
274 if (!quota_manager_bridge_.get()) { | 211 if (!quota_manager_bridge_.get()) { |
275 quota_manager_bridge_ = native_factory_->CreateAwQuotaManagerBridge(this); | 212 quota_manager_bridge_ = native_factory_->CreateAwQuotaManagerBridge(this); |
276 } | 213 } |
277 return quota_manager_bridge_.get(); | 214 return quota_manager_bridge_.get(); |
278 } | 215 } |
279 | 216 |
280 AwFormDatabaseService* AwBrowserContext::GetFormDatabaseService() { | 217 AwFormDatabaseService* AwBrowserContext::GetFormDatabaseService() { |
281 return form_database_service_.get(); | 218 return form_database_service_.get(); |
282 } | 219 } |
283 | 220 |
284 data_reduction_proxy::DataReductionProxySettings* | |
285 AwBrowserContext::GetDataReductionProxySettings() { | |
286 return data_reduction_proxy_settings_.get(); | |
287 } | |
288 | |
289 data_reduction_proxy::DataReductionProxyIOData* | |
290 AwBrowserContext::GetDataReductionProxyIOData() { | |
291 return data_reduction_proxy_io_data_.get(); | |
292 } | |
293 | |
294 AwURLRequestContextGetter* AwBrowserContext::GetAwURLRequestContext() { | 221 AwURLRequestContextGetter* AwBrowserContext::GetAwURLRequestContext() { |
295 return url_request_context_getter_.get(); | 222 return url_request_context_getter_.get(); |
296 } | 223 } |
297 | 224 |
298 AwMessagePortService* AwBrowserContext::GetMessagePortService() { | 225 AwMessagePortService* AwBrowserContext::GetMessagePortService() { |
299 if (!message_port_service_.get()) { | 226 if (!message_port_service_.get()) { |
300 message_port_service_.reset( | 227 message_port_service_.reset( |
301 native_factory_->CreateAwMessagePortService()); | 228 native_factory_->CreateAwMessagePortService()); |
302 } | 229 } |
303 return message_port_service_.get(); | 230 return message_port_service_.get(); |
304 } | 231 } |
305 | 232 |
306 // Create user pref service | 233 // Create user pref service |
307 void AwBrowserContext::InitUserPrefService() { | 234 void AwBrowserContext::InitUserPrefService() { |
308 user_prefs::PrefRegistrySyncable* pref_registry = | 235 user_prefs::PrefRegistrySyncable* pref_registry = |
309 new user_prefs::PrefRegistrySyncable(); | 236 new user_prefs::PrefRegistrySyncable(); |
310 // We only use the autocomplete feature of Autofill, which is controlled via | 237 // We only use the autocomplete feature of Autofill, which is controlled via |
311 // the manager_delegate. We don't use the rest of Autofill, which is why it is | 238 // the manager_delegate. We don't use the rest of Autofill, which is why it is |
312 // hardcoded as disabled here. | 239 // hardcoded as disabled here. |
313 pref_registry->RegisterBooleanPref(autofill::prefs::kAutofillEnabled, false); | 240 pref_registry->RegisterBooleanPref(autofill::prefs::kAutofillEnabled, false); |
314 pref_registry->RegisterBooleanPref(kDataReductionProxyEnabled, false); | |
315 data_reduction_proxy::RegisterSimpleProfilePrefs(pref_registry); | |
316 policy::URLBlacklistManager::RegisterProfilePrefs(pref_registry); | 241 policy::URLBlacklistManager::RegisterProfilePrefs(pref_registry); |
317 | 242 |
318 pref_registry->RegisterStringPref(prefs::kAuthServerWhitelist, std::string()); | 243 pref_registry->RegisterStringPref(prefs::kAuthServerWhitelist, std::string()); |
319 pref_registry->RegisterStringPref(prefs::kAuthAndroidNegotiateAccountType, | 244 pref_registry->RegisterStringPref(prefs::kAuthAndroidNegotiateAccountType, |
320 std::string()); | 245 std::string()); |
321 | 246 |
322 metrics::MetricsService::RegisterPrefs(pref_registry); | 247 metrics::MetricsService::RegisterPrefs(pref_registry); |
323 | 248 |
324 PrefServiceFactory pref_service_factory; | 249 PrefServiceFactory pref_service_factory; |
325 pref_service_factory.set_user_prefs(make_scoped_refptr( | 250 pref_service_factory.set_user_prefs(make_scoped_refptr( |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 } | 364 } |
440 | 365 |
441 void AwBrowserContext::RebuildTable( | 366 void AwBrowserContext::RebuildTable( |
442 const scoped_refptr<URLEnumerator>& enumerator) { | 367 const scoped_refptr<URLEnumerator>& enumerator) { |
443 // Android WebView rebuilds from WebChromeClient.getVisitedHistory. The client | 368 // Android WebView rebuilds from WebChromeClient.getVisitedHistory. The client |
444 // can change in the lifetime of this WebView and may not yet be set here. | 369 // can change in the lifetime of this WebView and may not yet be set here. |
445 // Therefore this initialization path is not used. | 370 // Therefore this initialization path is not used. |
446 enumerator->OnComplete(true); | 371 enumerator->OnComplete(true); |
447 } | 372 } |
448 | 373 |
449 void AwBrowserContext::CreateDataReductionProxyStatisticsIfNecessary() { | |
450 DCHECK(user_pref_service_.get()); | |
451 DCHECK(GetDataReductionProxySettings()); | |
452 data_reduction_proxy::DataReductionProxyService* | |
453 data_reduction_proxy_service = | |
454 GetDataReductionProxySettings()->data_reduction_proxy_service(); | |
455 DCHECK(data_reduction_proxy_service); | |
456 if (data_reduction_proxy_service->compression_stats()) | |
457 return; | |
458 // We don't care about commit_delay for now. It is just a dummy value. | |
459 base::TimeDelta commit_delay = base::TimeDelta::FromMinutes(60); | |
460 data_reduction_proxy_service->EnableCompressionStatisticsLogging( | |
461 user_pref_service_.get(), | |
462 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), | |
463 commit_delay); | |
464 } | |
465 | |
466 } // namespace android_webview | 374 } // namespace android_webview |
OLD | NEW |