Chromium Code Reviews| Index: chrome/browser/net/chrome_network_delegate.cc |
| diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc |
| index 8547e4911c167441278fdf0d85cf53f286932f25..61efd890e67dce94d82652d775bfb0bd6eb6441e 100644 |
| --- a/chrome/browser/net/chrome_network_delegate.cc |
| +++ b/chrome/browser/net/chrome_network_delegate.cc |
| @@ -14,6 +14,7 @@ |
| #include "base/debug/dump_without_crashing.h" |
| #include "base/debug/stack_trace.h" |
| #include "base/logging.h" |
| +#include "base/memory/weak_ptr.h" |
| #include "base/metrics/histogram.h" |
| #include "base/metrics/sparse_histogram.h" |
| #include "base/metrics/user_metrics.h" |
| @@ -33,6 +34,7 @@ |
| #include "chrome/browser/net/request_source_bandwidth_histograms.h" |
| #include "chrome/browser/net/safe_search_util.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| +#include "chrome/browser/sessions/session_tab_helper.h" |
| #include "chrome/browser/task_management/task_manager_interface.h" |
| #include "chrome/common/pref_names.h" |
| #include "components/content_settings/core/browser/cookie_settings.h" |
| @@ -42,6 +44,7 @@ |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/resource_request_info.h" |
| +#include "content/public/browser/web_contents.h" |
| #include "content/public/common/content_switches.h" |
| #include "content/public/common/process_type.h" |
| #include "net/base/host_port_pair.h" |
| @@ -54,6 +57,7 @@ |
| #include "net/http/http_status_code.h" |
| #include "net/log/net_log.h" |
| #include "net/url_request/url_request.h" |
| +#include "url/gurl.h" |
| #if defined(OS_ANDROID) |
| #include "chrome/browser/io_thread.h" |
| @@ -279,6 +283,33 @@ void RecordCacheStateStats(const net::URLRequest* request) { |
| } |
| } |
| +// Attempt to get the associated tab ID for a given render frame. Returns -1 if |
| +// no associated tab was found. |
| +int32_t GetTabIdForRenderFrame(int render_process_id, int render_frame_id) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + // TODO(sclittle): For prerendering tabs, investigate if it's possible to find |
| + // 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
|
| + return SessionTabHelper::IdForTab(content::WebContents::FromRenderFrameHost( |
| + content::RenderFrameHost::FromID(render_process_id, render_frame_id))); |
| +} |
| + |
| +void RunTabIdCallbackOnIOThread( |
| + const base::Callback<void(int32_t)>& io_thread_callback, |
| + int32_t tab_id) { |
| + io_thread_callback.Run(tab_id); |
| +} |
| + |
| +void ProvideTabIdFromUIThread( |
| + int render_process_id, |
| + int render_frame_id, |
| + const base::Callback<void(int32_t)>& io_thread_callback) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&RunTabIdCallbackOnIOThread, io_thread_callback, |
| + GetTabIdForRenderFrame(render_process_id, render_frame_id))); |
| +} |
| + |
| } // namespace |
| ChromeNetworkDelegate::ChromeNetworkDelegate( |
| @@ -502,28 +533,12 @@ void ChromeNetworkDelegate::OnNetworkBytesReceived( |
| bytes_received); |
| #endif // defined(ENABLE_TASK_MANAGER) |
| - if (data_use_aggregator_) { |
| - if (is_data_usage_off_the_record_) { |
| - data_use_aggregator_->ReportOffTheRecordDataUse(0 /* tx_bytes */, |
| - bytes_received); |
| - } else { |
| - data_use_aggregator_->ReportDataUse(request, -1 /* tab_id */, |
| - 0 /* tx_bytes */, bytes_received); |
| - } |
| - } |
| + ReportDataUsageStats(request, 0 /* tx_bytes */, bytes_received); |
| } |
| void ChromeNetworkDelegate::OnNetworkBytesSent(const net::URLRequest& request, |
| int64_t bytes_sent) { |
| - if (data_use_aggregator_) { |
| - if (is_data_usage_off_the_record_) { |
| - data_use_aggregator_->ReportOffTheRecordDataUse(bytes_sent, |
| - 0 /* rx_bytes */); |
| - } else { |
| - data_use_aggregator_->ReportDataUse(request, -1 /* tab_id */, bytes_sent, |
| - 0 /* rx_bytes */); |
| - } |
| - } |
| + ReportDataUsageStats(request, bytes_sent, 0 /* rx_bytes */); |
| } |
| void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request, |
| @@ -742,3 +757,34 @@ bool ChromeNetworkDelegate::OnCancelURLRequestWithPolicyViolatingReferrerHeader( |
| ReportInvalidReferrerSend(target_url, referrer_url); |
| return true; |
| } |
| + |
| +void ChromeNetworkDelegate::ReportDataUsageStats(const net::URLRequest& request, |
| + int64_t tx_bytes, |
| + int64_t rx_bytes) { |
| + if (!data_use_aggregator_) |
| + return; |
| + |
| + if (is_data_usage_off_the_record_) { |
| + data_use_aggregator_->ReportOffTheRecordDataUse(tx_bytes, rx_bytes); |
| + return; |
| + } |
| + |
| + base::Callback<void(int32_t)> report_data_use_with_tab_id_callback = |
| + base::Bind(&data_usage::DataUseAggregator::ReportDataUse, |
| + data_use_aggregator_->GetWeakPtr(), tx_bytes, rx_bytes, |
| + request.url(), request.request_time(), |
| + request.first_party_for_cookies()); |
| + |
| + int render_process_id = -1, render_frame_id = -1; |
| + if (!content::ResourceRequestInfo::GetRenderFrameForRequest( |
| + &request, &render_process_id, &render_frame_id)) { |
| + report_data_use_with_tab_id_callback.Run(-1 /* tab_id */); |
| + return; |
| + } |
| + |
| + // 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
|
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&ProvideTabIdFromUIThread, render_process_id, render_frame_id, |
| + report_data_use_with_tab_id_callback)); |
| +} |