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