15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_network_delegate.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdlib.h> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/debug/trace_event.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/metrics/user_metrics.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/time/time.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h" 256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/net/chrome_extensions_network_delegate.h" 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/net/client_hints.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/net/connect_interceptor.h" 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/net/safe_search_util.h" 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/data_reduction_proxy/browser/data_reduction_proxy_auth_request_handler.h" 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "components/data_reduction_proxy/browser/data_reduction_proxy_metrics.h" 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/data_reduction_proxy/browser/data_reduction_proxy_params.h" 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/data_reduction_proxy/browser/data_reduction_proxy_protocol.h" 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/data_reduction_proxy/browser/data_reduction_proxy_statistics_prefs.h" 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.h" 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/domain_reliability/monitor.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_info.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_options.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/proxy/proxy_config.h" 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/proxy/proxy_info.h" 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/proxy/proxy_retry_info.h" 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/proxy/proxy_server.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket_stream/socket_stream.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/url_request/url_request_context.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(OS_ANDROID) 606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/io_thread.h" 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/precache/content/precache_manager.h" 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/precache/content/precache_manager_factory.h" 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif 646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/url_blacklist_manager.h" 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/common/constants.h" 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceRequestInfo; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::ResourceType; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// By default we don't allow access to all file:// urls on ChromeOS and 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Android. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_ANDROID) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeNetworkDelegate::g_allow_file_access_ = false; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeNetworkDelegate::g_allow_file_access_ = true; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This remains false unless the --disable-extensions-http-throttling 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// flag is passed to the browser. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeNetworkDelegate::g_never_throttle_requests_ = false; 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDNTHeader[] = "DNT"; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets called when the extensions finish work on the URL. If the extensions 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// did not do a redirect (so |new_url| is empty) then we enforce the 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SafeSearch parameters. Otherwise we will get called again after the 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect and we enforce SafeSearch then. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ForceGoogleSafeSearchCallbackWrapper( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == net::OK && new_url->is_empty()) 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) safe_search_util::ForceGoogleSafeSearch(request, new_url); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(rv); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UpdateContentLengthPrefs( 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int received_content_length, 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int original_content_length, 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch data_reduction_proxy::DataReductionProxyRequestType request_type, 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile, 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy::DataReductionProxyStatisticsPrefs* statistics_prefs) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(received_content_length, 0); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(original_content_length, 0); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Can be NULL in a unit test. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!g_browser_process) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ignore off-the-record data. 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!g_browser_process->profile_manager()->IsValidProfile(profile) || 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile->IsOffTheRecord()) { 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy::UpdateContentLengthPrefs( 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci received_content_length, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci original_content_length, 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci profile->GetPrefs(), 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_type, statistics_prefs); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void StoreAccumulatedContentLength( 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int received_content_length, 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int original_content_length, 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch data_reduction_proxy::DataReductionProxyRequestType request_type, 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile, 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy::DataReductionProxyStatisticsPrefs* statistics_prefs) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&UpdateContentLengthPrefs, 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci received_content_length, 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci original_content_length, 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_type, 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci profile, 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statistics_prefs)); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RecordContentLengthHistograms( 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 received_content_length, 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 original_content_length, 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::TimeDelta& freshness_lifetime) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the current resource to these histograms only when a valid 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // X-Original-Content-Length header is present. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (original_content_length >= 0) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthWithValidOCL", 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_content_length); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpOriginalContentLengthWithValidOCL", 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_content_length); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthDifferenceWithValidOCL", 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_content_length - received_content_length); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Presume the original content length is the same as the received content 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // length if the X-Original-Content-Header is not present. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_content_length = received_content_length; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpContentLength", received_content_length); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpOriginalContentLength", 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_content_length); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthDifference", 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_content_length - received_content_length); 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UMA_HISTOGRAM_CUSTOM_COUNTS("Net.HttpContentFreshnessLifetime", 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch freshness_lifetime.InSeconds(), 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeDelta::FromHours(1).InSeconds(), 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeDelta::FromDays(30).InSeconds(), 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100); 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (freshness_lifetime.InSeconds() <= 0) 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthCacheable", 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) received_content_length); 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (freshness_lifetime.InHours() < 4) 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthCacheable4Hours", 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) received_content_length); 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (freshness_lifetime.InHours() < 24) 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Net.HttpContentLengthCacheable24Hours", 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) received_content_length); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RecordPrecacheStatsOnUIThread(const GURL& url, 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Time& fetch_time, int64 size, 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool was_cached, void* profile_id) { 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile = reinterpret_cast<Profile*>(profile_id); 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!g_browser_process->profile_manager()->IsValidProfile(profile)) { 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) precache::PrecacheManager* precache_manager = 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) precache::PrecacheManagerFactory::GetForBrowserContext(profile); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!precache_manager || !precache_manager->IsPrecachingAllowed()) { 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |precache_manager| could be NULL if the profile is off the record. 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) precache_manager->RecordStatsForFetch(url, fetch_time, size, was_cached); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 221e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid RecordIOThreadToRequestStartOnUIThread( 222e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const base::TimeTicks& request_start) { 223e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 224e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::TimeDelta request_lag = request_start - 225e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch g_browser_process->io_thread()->creation_time(); 226e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UMA_HISTOGRAM_TIMES("Net.IOThreadCreationToHTTPRequestStart", request_lag); 227e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_ANDROID) 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ReportInvalidReferrerSend(const GURL& target_url, 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& referrer_url) { 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RecordAction( 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::UserMetricsAction("Net.URLRequest_StartJob_InvalidReferrer")); 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeNetworkDelegate::ChromeNetworkDelegate( 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::EventRouterForwarder* event_router, 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BooleanPrefMember* enable_referrers) 2416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : profile_(NULL), 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_referrers_(enable_referrers), 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_do_not_track_(NULL), 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) force_google_safe_search_(NULL), 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) data_reduction_proxy_enabled_(NULL), 2466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_blacklist_manager_(NULL), 2486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif 24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) domain_reliability_monitor_(NULL), 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_content_length_(0), 251e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch original_content_length_(0), 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) first_request_(true), 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) prerender_tracker_(NULL), 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_reduction_proxy_params_(NULL), 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_reduction_proxy_usage_stats_(NULL), 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy_auth_request_handler_(NULL), 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy_statistics_prefs_(NULL) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(enable_referrers); 2596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_.reset( 2606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ChromeExtensionsNetworkDelegate::Create(event_router)); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeNetworkDelegate::~ChromeNetworkDelegate() {} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeNetworkDelegate::set_extension_info_map( 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::InfoMap* extension_info_map) { 2676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->set_extension_info_map(extension_info_map); 2686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeNetworkDelegate::set_profile(void* profile) { 2716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_ = profile; 2726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->set_profile(profile); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeNetworkDelegate::set_cookie_settings( 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CookieSettings* cookie_settings) { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cookie_settings_ = cookie_settings; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeNetworkDelegate::set_predictor( 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome_browser_net::Predictor* predictor) { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connect_interceptor_.reset( 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new chrome_browser_net::ConnectInterceptor(predictor)); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ChromeNetworkDelegate::SetEnableClientHints() { 2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_hints_.reset(new ClientHints()); 2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_hints_->Init(); 2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::NeverThrottleRequests() { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_never_throttle_requests_ = true; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::InitializePrefsOnUIThread( 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BooleanPrefMember* enable_referrers, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BooleanPrefMember* enable_do_not_track, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BooleanPrefMember* force_google_safe_search, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* pref_service) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_referrers->Init(prefs::kEnableReferrers, pref_service); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_referrers->MoveToThread( 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable_do_not_track) { 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_do_not_track->Init(prefs::kEnableDoNotTrack, pref_service); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_do_not_track->MoveToThread( 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (force_google_safe_search) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) force_google_safe_search->Init(prefs::kForceSafeSearch, pref_service); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_google_safe_search->MoveToThread( 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::AllowAccessToAllFiles() { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_allow_file_access_ = true; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(megjablon): Use data_reduction_proxy_delayed_pref_service to read prefs. 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Until updated the pref values may be up to an hour behind on desktop. 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::Value* ChromeNetworkDelegate::HistoricNetworkStatsInfoToValue() { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = g_browser_process->local_state(); 331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int64 total_received = prefs->GetInt64( 332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch data_reduction_proxy::prefs::kHttpReceivedContentLength); 333a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int64 total_original = prefs->GetInt64( 334a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch data_reduction_proxy::prefs::kHttpOriginalContentLength); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = new base::DictionaryValue(); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use strings to avoid overflow. base::Value only supports 32-bit integers. 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("historic_received_content_length", 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Int64ToString(total_received)); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("historic_original_content_length", 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Int64ToString(total_original)); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::Value* ChromeNetworkDelegate::SessionNetworkStatsInfoToValue() const { 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = new base::DictionaryValue(); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use strings to avoid overflow. base::Value only supports 32-bit integers. 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("session_received_content_length", 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Int64ToString(received_content_length_)); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("session_original_content_length", 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Int64ToString(original_content_length_)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeNetworkDelegate::OnBeforeURLRequest( 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url) { 359e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if defined(OS_ANDROID) 360e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // This UMA tracks the time to the first user-initiated request start, so 361e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // only non-null profiles are considered. 362e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (first_request_ && profile_) { 363e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool record_timing = true; 3646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (data_reduction_proxy_params_) { 3656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) record_timing = 3666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) (request->url() != data_reduction_proxy_params_->probe_url()) && 3676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) (request->url() != data_reduction_proxy_params_->warmup_url()); 3686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 369e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (record_timing) { 370e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch first_request_ = false; 371e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch net::LoadTimingInfo timing_info; 372e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch request->GetLoadTimingInfo(&timing_info); 373e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch BrowserThread::PostTask( 374e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch BrowserThread::UI, FROM_HERE, 375e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::Bind(&RecordIOThreadToRequestStartOnUIThread, 376e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch timing_info.request_start)); 377e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 378e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 379e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif // defined(OS_ANDROID) 380e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(joaodasilva): This prevents extensions from seeing URLs that are 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // blocked. However, an extension might redirect the request to another URL, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which is not blocked. 385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int error = net::ERR_BLOCKED_BY_ADMINISTRATOR; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url_blacklist_manager_ && 387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch url_blacklist_manager_->IsRequestBlocked(*request, &error)) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL access blocked by policy. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->net_log().AddEvent( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetLog::TYPE_CHROME_POLICY_ABORTED_REQUEST, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetLog::StringCallback("url", 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &request->url().possibly_invalid_spec())); 393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return error; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->ForwardStartRequestStatus(request); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!enable_referrers_->GetValue()) 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request->SetReferrer(std::string()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable_do_not_track_ && enable_do_not_track_->GetValue()) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->SetExtraRequestHeaderByName(kDNTHeader, "1", true /* override */); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (client_hints_) { 4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) request->SetExtraRequestHeaderByName( 4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ClientHints::kDevicePixelRatioHeader, 4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_hints_->GetDevicePixelRatioHeader(), true); 4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_safe_search = force_google_safe_search_ && 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_google_safe_search_->GetValue(); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback wrapped_callback = callback; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (force_safe_search) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrapped_callback = base::Bind(&ForceGoogleSafeSearchCallbackWrapper, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(request), 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(new_url)); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int rv = extensions_delegate_->OnBeforeURLRequest( 4226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) request, wrapped_callback, new_url); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (force_safe_search && rv == net::OK && new_url->is_empty()) 4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) safe_search_util::ForceGoogleSafeSearch(request, new_url); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (connect_interceptor_) 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connect_interceptor_->WitnessURLRequest(request); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 433116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeNetworkDelegate::OnResolveProxy( 4346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL& url, 4356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int load_flags, 4366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const net::ProxyService& proxy_service, 4376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) net::ProxyInfo* result) { 4386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!on_resolve_proxy_handler_.is_null() && 4396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) !proxy_config_getter_.is_null()) { 440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch on_resolve_proxy_handler_.Run(url, load_flags, 4416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) proxy_config_getter_.Run(), 4426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) proxy_service.proxy_retry_info(), 443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_reduction_proxy_params_, result); 444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ChromeNetworkDelegate::OnProxyFallback(const net::ProxyServer& bad_proxy, 44803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int net_error) { 4496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (data_reduction_proxy_usage_stats_) { 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy_usage_stats_->OnProxyFallback( 45103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bad_proxy, net_error); 4526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 4536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 4546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeNetworkDelegate::OnBeforeSendHeaders( 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpRequestHeaders* headers) { 4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool force_safe_search = force_google_safe_search_ && 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) force_google_safe_search_->GetValue(); 4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (force_safe_search) 4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) safe_search_util::ForceYouTubeSafetyMode(request, headers); 4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TRACE_EVENT_ASYNC_STEP_PAST0("net", "URLRequest", request, "SendRequest"); 4656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return extensions_delegate_->OnBeforeSendHeaders(request, callback, headers); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 468116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeNetworkDelegate::OnBeforeSendProxyHeaders( 469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::URLRequest* request, 470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const net::ProxyInfo& proxy_info, 471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::HttpRequestHeaders* headers) { 472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (data_reduction_proxy_auth_request_handler_) { 473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_reduction_proxy_auth_request_handler_->MaybeAddRequestHeader( 474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request, proxy_info.proxy_server(), headers); 475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::OnSendHeaders( 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpRequestHeaders& headers) { 4816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->OnSendHeaders(request, headers); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeNetworkDelegate::OnHeadersReceived( 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 488effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 489effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL* allowed_unsafe_redirect_url) { 4906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) data_reduction_proxy::DataReductionProxyBypassType bypass_type; 491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (data_reduction_proxy::MaybeBypassProxyAndPrepareToRetry( 492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_reduction_proxy_params_, 493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) request, 494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) original_response_headers, 4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) override_response_headers, 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &bypass_type)) { 4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (data_reduction_proxy_usage_stats_) 4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) data_reduction_proxy_usage_stats_->SetBypassType(bypass_type); 499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::OK; 500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return extensions_delegate_->OnHeadersReceived( 503effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch request, 504effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch callback, 505effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch original_response_headers, 506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch override_response_headers, 507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch allowed_unsafe_redirect_url); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::OnBeforeRedirect(net::URLRequest* request, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_location) { 51223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (domain_reliability_monitor_) 51323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) domain_reliability_monitor_->OnBeforeRedirect(request); 5146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->OnBeforeRedirect(request, new_location); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::OnResponseStarted(net::URLRequest* request) { 5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TRACE_EVENT_ASYNC_STEP_PAST0("net", "URLRequest", request, "ResponseStarted"); 5206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->OnResponseStarted(request); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::OnRawBytesRead(const net::URLRequest& request, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_read) { 5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TRACE_EVENT_ASYNC_STEP_PAST1("net", "URLRequest", &request, "DidRead", 5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "bytes_read", bytes_read); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_TASK_MANAGER) 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This is not completely accurate, but as a first approximation ignore 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // requests that are served from the cache. See bug 330931 for more info. 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!request.was_cached()) 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TaskManager::GetInstance()->model()->NotifyBytesRead(request, bytes_read); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(ENABLE_TASK_MANAGER) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool started) { 537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (data_reduction_proxy_usage_stats_) 538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_reduction_proxy_usage_stats_->OnUrlRequestCompleted(request, started); 539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TRACE_EVENT_ASYNC_END0("net", "URLRequest", request); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request->status().status() == net::URLRequestStatus::SUCCESS) { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For better accuracy, we use the actual bytes read instead of the length 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified with the Content-Length header, which may be inaccurate, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or missing, as is the case with chunked encoding. 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 received_content_length = request->received_response_content_length(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID) 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (precache::PrecacheManager::IsPrecachingEnabled()) { 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Record precache metrics when a fetch is completed successfully, if 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // precaching is enabled. 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&RecordPrecacheStatsOnUIThread, request->url(), 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time::Now(), received_content_length, 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request->was_cached(), profile_)); 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_ANDROID) 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only record for http or https urls. 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_http = request->url().SchemeIs("http"); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_https = request->url().SchemeIs("https"); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!request->was_cached() && // Don't record cached content 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_content_length && // Zero-byte responses aren't useful. 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (is_http || is_https)) { // Only record for HTTP or HTTPS urls. 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 original_content_length = 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->response_info().headers->GetInt64HeaderValue( 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "x-original-content-length"); 569a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch data_reduction_proxy::DataReductionProxyRequestType request_type = 570a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch data_reduction_proxy::GetDataReductionProxyRequestType(request); 571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeDelta freshness_lifetime = 5737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request->response_info().headers->GetFreshnessLifetime( 5747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request->response_info().response_time); 575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int64 adjusted_original_content_length = 576a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch data_reduction_proxy::GetAdjustedOriginalContentLength( 577a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch request_type, original_content_length, 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) received_content_length); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccumulateContentLength(received_content_length, 580bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch adjusted_original_content_length, 581a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch request_type); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordContentLengthHistograms(received_content_length, 5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) original_content_length, 5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) freshness_lifetime); 5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (data_reduction_proxy_enabled_ && 5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy_usage_stats_ && 5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !proxy_config_getter_.is_null()) { 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy_usage_stats_->RecordBytesHistograms( 5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request, 5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *data_reduction_proxy_enabled_, 5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci proxy_config_getter_.Run()); 5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << __FUNCTION__ 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " received content length: " << received_content_length 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " original content length: " << original_content_length 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " url: " << request->url(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->OnCompleted(request, started); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (request->status().status() == net::URLRequestStatus::FAILED || 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->status().status() == net::URLRequestStatus::CANCELED) { 6036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->OnCompleted(request, started); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (domain_reliability_monitor_) 60823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) domain_reliability_monitor_->OnCompleted(request, started); 6096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->ForwardProxyErrors(request); 6106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->ForwardDoneRequestStatus(request); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::OnURLRequestDestroyed(net::URLRequest* request) { 6146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->OnURLRequestDestroyed(request); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::OnPACScriptError(int line_number, 618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& error) { 6196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions_delegate_->OnPACScriptError(line_number, error); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::NetworkDelegate::AuthRequiredResponse 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeNetworkDelegate::OnAuthRequired( 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::AuthChallengeInfo& auth_info, 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback, 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::AuthCredentials* credentials) { 6286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return extensions_delegate_->OnAuthRequired( 6296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) request, auth_info, callback, credentials); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeNetworkDelegate::OnCanGetCookies( 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLRequest& request, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list) { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL during tests, or when we're running in the system context. 636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!cookie_settings_.get()) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings_->IsReadingCookieAllowed( 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.url(), request.first_party_for_cookies()); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id = -1; 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id = -1; 64423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 64523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // |is_for_blocking_resource| indicates whether the cookies read were for a 64623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // blocking resource (eg script, css). It is only temporarily added for 64723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // diagnostic purposes, per bug 353678. Will be removed again once data 64823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // collection is finished. 64923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool is_for_blocking_resource = false; 65023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request); 65123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (info && ((!info->IsAsync()) || 6525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info->GetResourceType() == content::RESOURCE_TYPE_STYLESHEET || 6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info->GetResourceType() == content::RESOURCE_TYPE_SCRIPT)) { 65423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_for_blocking_resource = true; 65523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 65623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (content::ResourceRequestInfo::GetRenderFrameForRequest( 6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &request, &render_process_id, &render_frame_id)) { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::CookiesRead, 6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_process_id, render_frame_id, 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.url(), request.first_party_for_cookies(), 66423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) cookie_list, !allow, is_for_blocking_resource)); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeNetworkDelegate::OnCanSetCookie(const net::URLRequest& request, 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions* options) { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL during tests, or when we're running in the system context. 674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!cookie_settings_.get()) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings_->IsSettingCookieAllowed( 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.url(), request.first_party_for_cookies()); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id = -1; 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id = -1; 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (content::ResourceRequestInfo::GetRenderFrameForRequest( 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &request, &render_process_id, &render_frame_id)) { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::CookieChanged, 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_process_id, render_frame_id, 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.url(), request.first_party_for_cookies(), 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_line, *options, !allow)); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (prerender_tracker_) { 693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender_tracker_->OnCookieChangedForURL( 694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_process_id, 695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request.context()->cookie_store()->GetCookieMonster(), 696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request.url()); 697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeNetworkDelegate::OnCanAccessFile(const net::URLRequest& request, 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) const { 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (g_allow_file_access_) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're running Chrome for ChromeOS on Linux, we want to allow file 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // access. 7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!base::SysInfo::IsRunningOnChromeOS() || 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a whitelist to only allow access to files residing in the list of 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // directories below. 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kLocalAccessWhiteList[] = { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/home/chronos/user/Downloads", 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/home/chronos/user/log", 723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "/home/chronos/user/WebRTC Logs", 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/media", 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/opt/oem", 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/usr/share/chromeos-assets", 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/tmp", 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/var/log", 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The actual location of "/home/chronos/user/Xyz" is the Xyz directory under 732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // the profile path ("/home/chronos/user' is a hard link to current primary 733f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // logged in profile.) For the support of multi-profile sessions, we are 734f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // switching to use explicit "$PROFILE_PATH/Xyz" path and here whitelist such 735f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // access. 7360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!profile_path_.empty()) { 7370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const base::FilePath downloads = profile_path_.AppendASCII("Downloads"); 7380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (downloads == path.StripTrailingSeparators() || downloads.IsParent(path)) 7390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return true; 740f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath webrtc_logs = profile_path_.AppendASCII("WebRTC Logs"); 741f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (webrtc_logs == path.StripTrailingSeparators() || 742f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) webrtc_logs.IsParent(path)) { 743f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 744f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 7450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Access to files in external storage is allowed. 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath external_storage_path; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_ANDROID_EXTERNAL_STORAGE, &external_storage_path); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (external_storage_path.IsParent(path)) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whitelist of other allowed directories. 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kLocalAccessWhiteList[] = { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/sdcard", 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/mnt/sdcard", 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kLocalAccessWhiteList); ++i) { 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath white_listed_path(kLocalAccessWhiteList[i]); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // base::FilePath::operator== should probably handle trailing separators. 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (white_listed_path == path.StripTrailingSeparators() || 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) white_listed_path.IsParent(path)) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "File access denied - " << path.value().c_str(); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeNetworkDelegate::OnCanThrottleRequest( 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLRequest& request) const { 7765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 7776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (g_never_throttle_requests_) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return request.first_party_for_cookies().scheme() == 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::kExtensionScheme; 7815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else 7825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 7835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool ChromeNetworkDelegate::OnCanEnablePrivacyMode( 78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const GURL& url, 78890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const GURL& first_party_for_cookies) const { 78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // NULL during tests, or when we're running in the system context. 790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!cookie_settings_.get()) 79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 79290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool reading_cookie_allowed = cookie_settings_->IsReadingCookieAllowed( 79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url, first_party_for_cookies); 79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool setting_cookie_allowed = cookie_settings_->IsSettingCookieAllowed( 79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url, first_party_for_cookies); 79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool privacy_mode = !(reading_cookie_allowed && setting_cookie_allowed); 79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return privacy_mode; 79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeNetworkDelegate::OnBeforeSocketStreamConnect( 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SocketStream* socket, 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback) { 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url_blacklist_manager_ && 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_blacklist_manager_->IsURLBlocked(socket->url())) { 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL access blocked by policy. 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket->net_log()->AddEvent( 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetLog::TYPE_CHROME_POLICY_ABORTED_REQUEST, 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetLog::StringCallback("url", 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &socket->url().possibly_invalid_spec())); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return net::ERR_BLOCKED_BY_ADMINISTRATOR; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::OK; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ChromeNetworkDelegate::OnCancelURLRequestWithPolicyViolatingReferrerHeader( 8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const net::URLRequest& request, 8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& target_url, 8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& referrer_url) const { 8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&ReportInvalidReferrerSend, target_url, referrer_url)); 8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeNetworkDelegate::AccumulateContentLength( 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 received_content_length, 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 original_content_length, 830a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch data_reduction_proxy::DataReductionProxyRequestType request_type) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(received_content_length, 0); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(original_content_length, 0); 8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (data_reduction_proxy_statistics_prefs_) { 8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci StoreAccumulatedContentLength(received_content_length, 8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci original_content_length, 8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_type, 8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<Profile*>(profile_), 8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_reduction_proxy_statistics_prefs_); 8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_content_length_ += received_content_length; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_content_length_ += original_content_length; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 843