OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/net/chrome_network_delegate.h" | 5 #include "chrome/browser/net/chrome_network_delegate.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/base_paths.h" | 11 #include "base/base_paths.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/debug/alias.h" | 13 #include "base/debug/alias.h" |
14 #include "base/debug/dump_without_crashing.h" | 14 #include "base/debug/dump_without_crashing.h" |
15 #include "base/debug/stack_trace.h" | 15 #include "base/debug/stack_trace.h" |
16 #include "base/logging.h" | 16 #include "base/logging.h" |
17 #include "base/memory/weak_ptr.h" | |
17 #include "base/metrics/histogram.h" | 18 #include "base/metrics/histogram.h" |
18 #include "base/metrics/sparse_histogram.h" | 19 #include "base/metrics/sparse_histogram.h" |
19 #include "base/metrics/user_metrics.h" | 20 #include "base/metrics/user_metrics.h" |
20 #include "base/path_service.h" | 21 #include "base/path_service.h" |
21 #include "base/prefs/pref_member.h" | 22 #include "base/prefs/pref_member.h" |
22 #include "base/prefs/pref_service.h" | 23 #include "base/prefs/pref_service.h" |
23 #include "base/profiler/scoped_tracker.h" | 24 #include "base/profiler/scoped_tracker.h" |
24 #include "base/strings/string_number_conversions.h" | 25 #include "base/strings/string_number_conversions.h" |
25 #include "base/strings/string_util.h" | 26 #include "base/strings/string_util.h" |
26 #include "base/time/time.h" | 27 #include "base/time/time.h" |
27 #include "chrome/browser/browser_process.h" | 28 #include "chrome/browser/browser_process.h" |
28 #include "chrome/browser/content_settings/cookie_settings_factory.h" | 29 #include "chrome/browser/content_settings/cookie_settings_factory.h" |
29 #include "chrome/browser/content_settings/tab_specific_content_settings.h" | 30 #include "chrome/browser/content_settings/tab_specific_content_settings.h" |
30 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" | 31 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" |
31 #include "chrome/browser/net/chrome_extensions_network_delegate.h" | 32 #include "chrome/browser/net/chrome_extensions_network_delegate.h" |
32 #include "chrome/browser/net/connect_interceptor.h" | 33 #include "chrome/browser/net/connect_interceptor.h" |
33 #include "chrome/browser/net/request_source_bandwidth_histograms.h" | 34 #include "chrome/browser/net/request_source_bandwidth_histograms.h" |
34 #include "chrome/browser/net/safe_search_util.h" | 35 #include "chrome/browser/net/safe_search_util.h" |
35 #include "chrome/browser/profiles/profile_manager.h" | 36 #include "chrome/browser/profiles/profile_manager.h" |
37 #include "chrome/browser/sessions/session_tab_helper.h" | |
36 #include "chrome/browser/task_management/task_manager_interface.h" | 38 #include "chrome/browser/task_management/task_manager_interface.h" |
37 #include "chrome/common/pref_names.h" | 39 #include "chrome/common/pref_names.h" |
38 #include "components/content_settings/core/browser/cookie_settings.h" | 40 #include "components/content_settings/core/browser/cookie_settings.h" |
39 #include "components/data_usage/core/data_use_aggregator.h" | 41 #include "components/data_usage/core/data_use_aggregator.h" |
40 #include "components/domain_reliability/monitor.h" | 42 #include "components/domain_reliability/monitor.h" |
41 #include "content/public/browser/browser_thread.h" | 43 #include "content/public/browser/browser_thread.h" |
42 #include "content/public/browser/render_frame_host.h" | 44 #include "content/public/browser/render_frame_host.h" |
43 #include "content/public/browser/render_view_host.h" | 45 #include "content/public/browser/render_view_host.h" |
44 #include "content/public/browser/resource_request_info.h" | 46 #include "content/public/browser/resource_request_info.h" |
47 #include "content/public/browser/web_contents.h" | |
45 #include "content/public/common/content_switches.h" | 48 #include "content/public/common/content_switches.h" |
46 #include "content/public/common/process_type.h" | 49 #include "content/public/common/process_type.h" |
47 #include "net/base/host_port_pair.h" | 50 #include "net/base/host_port_pair.h" |
48 #include "net/base/load_flags.h" | 51 #include "net/base/load_flags.h" |
49 #include "net/base/net_errors.h" | 52 #include "net/base/net_errors.h" |
50 #include "net/cookies/canonical_cookie.h" | 53 #include "net/cookies/canonical_cookie.h" |
51 #include "net/cookies/cookie_options.h" | 54 #include "net/cookies/cookie_options.h" |
52 #include "net/http/http_request_headers.h" | 55 #include "net/http/http_request_headers.h" |
53 #include "net/http/http_response_headers.h" | 56 #include "net/http/http_response_headers.h" |
54 #include "net/http/http_status_code.h" | 57 #include "net/http/http_status_code.h" |
55 #include "net/log/net_log.h" | 58 #include "net/log/net_log.h" |
56 #include "net/url_request/url_request.h" | 59 #include "net/url_request/url_request.h" |
60 #include "url/gurl.h" | |
57 | 61 |
58 #if defined(OS_ANDROID) | 62 #if defined(OS_ANDROID) |
59 #include "chrome/browser/io_thread.h" | 63 #include "chrome/browser/io_thread.h" |
60 #include "chrome/browser/precache/precache_manager_factory.h" | 64 #include "chrome/browser/precache/precache_manager_factory.h" |
61 #include "components/precache/content/precache_manager.h" | 65 #include "components/precache/content/precache_manager.h" |
62 #endif | 66 #endif |
63 | 67 |
64 #if defined(OS_CHROMEOS) | 68 #if defined(OS_CHROMEOS) |
65 #include "base/sys_info.h" | 69 #include "base/sys_info.h" |
66 #include "chrome/common/chrome_switches.h" | 70 #include "chrome/common/chrome_switches.h" |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
272 | 276 |
273 int64 size = request->received_response_content_length(); | 277 int64 size = request->received_response_content_length(); |
274 if (size >= 0 && state == CACHE_STATE_NO_LONGER_VALID) { | 278 if (size >= 0 && state == CACHE_STATE_NO_LONGER_VALID) { |
275 UMA_HISTOGRAM_COUNTS("Net.CacheState.AllBytes", size); | 279 UMA_HISTOGRAM_COUNTS("Net.CacheState.AllBytes", size); |
276 if (CanRequestBeDeltaEncoded(request)) { | 280 if (CanRequestBeDeltaEncoded(request)) { |
277 UMA_HISTOGRAM_COUNTS("Net.CacheState.EncodeableBytes", size); | 281 UMA_HISTOGRAM_COUNTS("Net.CacheState.EncodeableBytes", size); |
278 } | 282 } |
279 } | 283 } |
280 } | 284 } |
281 | 285 |
286 // Attempt to get the associated tab ID for a given render frame. Returns -1 if | |
287 // no associated tab was found. | |
288 int32_t GetTabIdForRenderFrame(int render_process_id, int render_frame_id) { | |
289 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
290 // TODO(sclittle): For prerendering tabs, investigate if it's possible to find | |
291 // the original tab that initiated the prerender. | |
bengr
2015/10/27 00:01:47
Great! Please do.
sclittle
2015/10/28 22:30:45
Maybe later. I think this might be impossible with
| |
292 return SessionTabHelper::IdForTab(content::WebContents::FromRenderFrameHost( | |
293 content::RenderFrameHost::FromID(render_process_id, render_frame_id))); | |
294 } | |
295 | |
296 void RunTabIdCallbackOnIOThread( | |
297 const base::Callback<void(int32_t)>& io_thread_callback, | |
298 int32_t tab_id) { | |
299 io_thread_callback.Run(tab_id); | |
300 } | |
301 | |
302 void ProvideTabIdFromUIThread( | |
303 int render_process_id, | |
304 int render_frame_id, | |
305 const base::Callback<void(int32_t)>& io_thread_callback) { | |
306 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
307 BrowserThread::PostTask( | |
308 BrowserThread::IO, FROM_HERE, | |
309 base::Bind(&RunTabIdCallbackOnIOThread, io_thread_callback, | |
310 GetTabIdForRenderFrame(render_process_id, render_frame_id))); | |
311 } | |
312 | |
282 } // namespace | 313 } // namespace |
283 | 314 |
284 ChromeNetworkDelegate::ChromeNetworkDelegate( | 315 ChromeNetworkDelegate::ChromeNetworkDelegate( |
285 extensions::EventRouterForwarder* event_router, | 316 extensions::EventRouterForwarder* event_router, |
286 BooleanPrefMember* enable_referrers) | 317 BooleanPrefMember* enable_referrers) |
287 : profile_(NULL), | 318 : profile_(NULL), |
288 enable_referrers_(enable_referrers), | 319 enable_referrers_(enable_referrers), |
289 enable_do_not_track_(NULL), | 320 enable_do_not_track_(NULL), |
290 force_google_safe_search_(NULL), | 321 force_google_safe_search_(NULL), |
291 force_youtube_safety_mode_(NULL), | 322 force_youtube_safety_mode_(NULL), |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
495 void ChromeNetworkDelegate::OnNetworkBytesReceived( | 526 void ChromeNetworkDelegate::OnNetworkBytesReceived( |
496 const net::URLRequest& request, | 527 const net::URLRequest& request, |
497 int64_t bytes_received) { | 528 int64_t bytes_received) { |
498 #if defined(ENABLE_TASK_MANAGER) | 529 #if defined(ENABLE_TASK_MANAGER) |
499 // Note: Currently, OnNetworkBytesReceived is only implemented for HTTP jobs, | 530 // Note: Currently, OnNetworkBytesReceived is only implemented for HTTP jobs, |
500 // not FTP or other types, so those kinds of bytes will not be reported here. | 531 // not FTP or other types, so those kinds of bytes will not be reported here. |
501 task_management::TaskManagerInterface::OnRawBytesRead(request, | 532 task_management::TaskManagerInterface::OnRawBytesRead(request, |
502 bytes_received); | 533 bytes_received); |
503 #endif // defined(ENABLE_TASK_MANAGER) | 534 #endif // defined(ENABLE_TASK_MANAGER) |
504 | 535 |
505 if (data_use_aggregator_) { | 536 ReportDataUsageStats(request, 0 /* tx_bytes */, bytes_received); |
506 if (is_data_usage_off_the_record_) { | |
507 data_use_aggregator_->ReportOffTheRecordDataUse(0 /* tx_bytes */, | |
508 bytes_received); | |
509 } else { | |
510 data_use_aggregator_->ReportDataUse(request, -1 /* tab_id */, | |
511 0 /* tx_bytes */, bytes_received); | |
512 } | |
513 } | |
514 } | 537 } |
515 | 538 |
516 void ChromeNetworkDelegate::OnNetworkBytesSent(const net::URLRequest& request, | 539 void ChromeNetworkDelegate::OnNetworkBytesSent(const net::URLRequest& request, |
517 int64_t bytes_sent) { | 540 int64_t bytes_sent) { |
518 if (data_use_aggregator_) { | 541 ReportDataUsageStats(request, bytes_sent, 0 /* rx_bytes */); |
519 if (is_data_usage_off_the_record_) { | |
520 data_use_aggregator_->ReportOffTheRecordDataUse(bytes_sent, | |
521 0 /* rx_bytes */); | |
522 } else { | |
523 data_use_aggregator_->ReportDataUse(request, -1 /* tab_id */, bytes_sent, | |
524 0 /* rx_bytes */); | |
525 } | |
526 } | |
527 } | 542 } |
528 | 543 |
529 void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request, | 544 void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request, |
530 bool started) { | 545 bool started) { |
531 #if !defined(OS_IOS) | 546 #if !defined(OS_IOS) |
532 // TODO(amohammadkhan): Verify that there is no double recording in data use | 547 // TODO(amohammadkhan): Verify that there is no double recording in data use |
533 // of redirected requests. | 548 // of redirected requests. |
534 data_use_measurement_.ReportDataUseUMA(request); | 549 data_use_measurement_.ReportDataUseUMA(request); |
535 #endif | 550 #endif |
536 RecordNetworkErrorHistograms(request); | 551 RecordNetworkErrorHistograms(request); |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
735 return experimental_web_platform_features_enabled_; | 750 return experimental_web_platform_features_enabled_; |
736 } | 751 } |
737 | 752 |
738 bool ChromeNetworkDelegate::OnCancelURLRequestWithPolicyViolatingReferrerHeader( | 753 bool ChromeNetworkDelegate::OnCancelURLRequestWithPolicyViolatingReferrerHeader( |
739 const net::URLRequest& request, | 754 const net::URLRequest& request, |
740 const GURL& target_url, | 755 const GURL& target_url, |
741 const GURL& referrer_url) const { | 756 const GURL& referrer_url) const { |
742 ReportInvalidReferrerSend(target_url, referrer_url); | 757 ReportInvalidReferrerSend(target_url, referrer_url); |
743 return true; | 758 return true; |
744 } | 759 } |
760 | |
761 void ChromeNetworkDelegate::ReportDataUsageStats(const net::URLRequest& request, | |
762 int64_t tx_bytes, | |
763 int64_t rx_bytes) { | |
764 if (!data_use_aggregator_) | |
765 return; | |
766 | |
767 if (is_data_usage_off_the_record_) { | |
768 data_use_aggregator_->ReportOffTheRecordDataUse(tx_bytes, rx_bytes); | |
769 return; | |
770 } | |
771 | |
772 base::Callback<void(int32_t)> report_data_use_with_tab_id_callback = | |
773 base::Bind(&data_usage::DataUseAggregator::ReportDataUse, | |
774 data_use_aggregator_->GetWeakPtr(), tx_bytes, rx_bytes, | |
775 request.url(), request.request_time(), | |
776 request.first_party_for_cookies()); | |
777 | |
778 int render_process_id = -1, render_frame_id = -1; | |
779 if (!content::ResourceRequestInfo::GetRenderFrameForRequest( | |
780 &request, &render_process_id, &render_frame_id)) { | |
781 report_data_use_with_tab_id_callback.Run(-1 /* tab_id */); | |
782 return; | |
783 } | |
784 | |
785 // Hop to the UI thread and back to get the tab ID for the render frame. | |
bengr
2015/10/27 00:01:47
Can you use PostTaskAndReply?
sclittle
2015/10/28 22:30:45
Not cleanly. We need to pass back the tab ID, and
| |
786 BrowserThread::PostTask( | |
787 BrowserThread::UI, FROM_HERE, | |
788 base::Bind(&ProvideTabIdFromUIThread, render_process_id, render_frame_id, | |
789 report_data_use_with_tab_id_callback)); | |
790 } | |
OLD | NEW |