Chromium Code Reviews| Index: chrome/browser/net/resource_prefetch_predictor_observer.cc |
| diff --git a/chrome/browser/net/resource_prefetch_predictor_observer.cc b/chrome/browser/net/resource_prefetch_predictor_observer.cc |
| index 9a7db58f1f42590bfdd7cf78436b3e54969188f8..57ce4871136337ed3eb89d6a4795b9e36cd65565 100644 |
| --- a/chrome/browser/net/resource_prefetch_predictor_observer.cc |
| +++ b/chrome/browser/net/resource_prefetch_predictor_observer.cc |
| @@ -4,17 +4,25 @@ |
| #include "chrome/browser/net/resource_prefetch_predictor_observer.h" |
| +#include <memory> |
| #include <string> |
| +#include <utility> |
|
ahemery
2016/12/06 14:31:11
For std::move
|
| +#include "base/memory/ptr_util.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/render_frame_host.h" |
| +#include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/resource_request_info.h" |
| +#include "content/public/browser/web_contents.h" |
| #include "net/url_request/url_request.h" |
| #include "url/gurl.h" |
| using content::BrowserThread; |
| using predictors::ResourcePrefetchPredictor; |
| +using URLRequestSummary = |
|
ahemery
2016/12/06 14:31:11
Added in .cc file because removed from .h
|
| + predictors::ResourcePrefetchPredictor::URLRequestSummary; |
| + |
| namespace { |
| @@ -69,8 +77,8 @@ ResourcePrefetchPredictorObserver::~ResourcePrefetchPredictorObserver() { |
| void ResourcePrefetchPredictorObserver::OnRequestStarted( |
| net::URLRequest* request, |
| content::ResourceType resource_type, |
| - int child_id, |
| - int frame_id) { |
| + const content::ResourceRequestInfo::WebContentsGetter& |
| + web_contents_getter) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) |
| @@ -79,28 +87,26 @@ void ResourcePrefetchPredictorObserver::OnRequestStarted( |
| if (!ResourcePrefetchPredictor::ShouldRecordRequest(request, resource_type)) |
| return; |
| - ResourcePrefetchPredictor::URLRequestSummary summary; |
| - summary.navigation_id.render_process_id = child_id; |
| - summary.navigation_id.render_frame_id = frame_id; |
| - summary.navigation_id.main_frame_url = request->first_party_for_cookies(); |
| - summary.navigation_id.creation_time = request->creation_time(); |
| - summary.resource_url = request->original_url(); |
| - summary.resource_type = resource_type; |
| + auto summary = base::MakeUnique<URLRequestSummary>(); |
| + summary->resource_url = request->original_url(); |
| + summary->resource_type = resource_type; |
| BrowserThread::PostTask( |
| - BrowserThread::UI, |
| - FROM_HERE, |
| - base::Bind(&ResourcePrefetchPredictor::RecordURLRequest, |
| - predictor_, |
| - summary)); |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&ResourcePrefetchPredictorObserver::OnRequestStartedOnUIThread, |
| + base::Unretained(this), base::Passed(std::move(summary)), |
| + web_contents_getter, request->first_party_for_cookies(), |
|
ahemery
2016/12/06 14:31:11
The new parameters that get passed all the way to
|
| + request->creation_time())); |
| if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) |
| ReportMainFrameRequestStats(MAIN_FRAME_REQUEST_STATS_PROCESSED_REQUESTS); |
| } |
| void ResourcePrefetchPredictorObserver::OnRequestRedirected( |
| + net::URLRequest* request, |
| const GURL& redirect_url, |
| - net::URLRequest* request) { |
| + const content::ResourceRequestInfo::WebContentsGetter& |
| + web_contents_getter) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| const content::ResourceRequestInfo* request_info = |
| @@ -113,20 +119,21 @@ void ResourcePrefetchPredictorObserver::OnRequestRedirected( |
| if (!ResourcePrefetchPredictor::ShouldRecordRedirect(request)) |
| return; |
| - ResourcePrefetchPredictor::URLRequestSummary summary; |
| + auto summary = base::MakeUnique<URLRequestSummary>(); |
| if (!ResourcePrefetchPredictor::URLRequestSummary::SummarizeResponse( |
| - *request, &summary)) { |
| + *request, summary.get())) { |
| return; |
| } |
| + summary->redirect_url = redirect_url; |
|
ahemery
2016/12/06 14:31:11
Moved from above, no modification
|
| - summary.redirect_url = redirect_url; |
| BrowserThread::PostTask( |
| - BrowserThread::UI, |
| - FROM_HERE, |
| - base::Bind(&ResourcePrefetchPredictor::RecordURLRedirect, |
| - predictor_, |
| - summary)); |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind( |
| + &ResourcePrefetchPredictorObserver::OnRequestRedirectedOnUIThread, |
| + base::Unretained(this), base::Passed(std::move(summary)), |
| + web_contents_getter, request->first_party_for_cookies(), |
| + request->creation_time())); |
| if (request_info && |
| request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME) { |
| @@ -135,7 +142,9 @@ void ResourcePrefetchPredictorObserver::OnRequestRedirected( |
| } |
| void ResourcePrefetchPredictorObserver::OnResponseStarted( |
| - net::URLRequest* request) { |
| + net::URLRequest* request, |
| + const content::ResourceRequestInfo::WebContentsGetter& |
| + web_contents_getter) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| ReportRequestStats(REQUEST_STATS_TOTAL_RESPONSES); |
| @@ -149,18 +158,19 @@ void ResourcePrefetchPredictorObserver::OnResponseStarted( |
| if (!ResourcePrefetchPredictor::ShouldRecordResponse(request)) |
| return; |
| - ResourcePrefetchPredictor::URLRequestSummary summary; |
| + auto summary = base::MakeUnique<URLRequestSummary>(); |
| if (!ResourcePrefetchPredictor::URLRequestSummary::SummarizeResponse( |
| - *request, &summary)) { |
| + *request, summary.get())) { |
| return; |
| } |
| BrowserThread::PostTask( |
| - BrowserThread::UI, |
| - FROM_HERE, |
| - base::Bind(&ResourcePrefetchPredictor::RecordURLResponse, |
| - predictor_, |
| - summary)); |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind( |
| + &ResourcePrefetchPredictorObserver::OnResponseStartedOnUIThread, |
| + base::Unretained(this), base::Passed(std::move(summary)), |
| + web_contents_getter, request->first_party_for_cookies(), |
| + request->creation_time())); |
| ReportRequestStats(REQUEST_STATS_TOTAL_PROCESSED_RESPONSES); |
| if (request_info && |
| @@ -169,4 +179,62 @@ void ResourcePrefetchPredictorObserver::OnResponseStarted( |
| } |
| } |
| +void ResourcePrefetchPredictorObserver::OnRequestStartedOnUIThread( |
| + std::unique_ptr<URLRequestSummary> summary, |
| + const content::ResourceRequestInfo::WebContentsGetter& |
| + web_contents_getter, |
| + const GURL& main_frame_url, |
| + const base::TimeTicks& creation_time) const { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + if (!TryToFillNavigationID(&summary->navigation_id, |
|
ahemery
2016/12/06 14:31:11
Now checking for failure. Returning without any fu
|
| + web_contents_getter, main_frame_url, |
| + creation_time)) |
| + return; |
| + predictor_->RecordURLRequest(*summary); |
| +} |
| + |
| +void ResourcePrefetchPredictorObserver::OnRequestRedirectedOnUIThread( |
| + std::unique_ptr<URLRequestSummary> summary, |
| + const content::ResourceRequestInfo::WebContentsGetter& |
| + web_contents_getter, |
| + const GURL& main_frame_url, |
| + const base::TimeTicks& creation_time) const { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + if (!TryToFillNavigationID(&summary->navigation_id, |
| + web_contents_getter, main_frame_url, |
| + creation_time)) |
| + return; |
| + predictor_->RecordURLRedirect(*summary); |
| +} |
| + |
| +void ResourcePrefetchPredictorObserver::OnResponseStartedOnUIThread( |
| + std::unique_ptr<URLRequestSummary> summary, |
| + const content::ResourceRequestInfo::WebContentsGetter& |
| + web_contents_getter, |
| + const GURL& main_frame_url, |
| + const base::TimeTicks& creation_time) const { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + if (!TryToFillNavigationID(&summary->navigation_id, |
| + web_contents_getter, main_frame_url, |
| + creation_time)) |
| + return; |
| + predictor_->RecordURLResponse(*summary); |
| +} |
| + |
| +bool ResourcePrefetchPredictorObserver::TryToFillNavigationID( |
|
ahemery
2016/12/06 14:31:11
Modified name to make it clearer that it can fail
|
| + predictors::NavigationID* navigation_id, |
| + const content::ResourceRequestInfo::WebContentsGetter& |
| + web_contents_getter, |
| + const GURL& main_frame_url, |
| + const base::TimeTicks& creation_time) const { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + content::WebContents* web_contents = web_contents_getter.Run(); |
| + if (!web_contents) |
| + return false; |
| + *navigation_id = predictors::NavigationID(web_contents, |
|
ahemery
2016/12/06 14:31:11
Using a direct constructor here
|
| + main_frame_url, |
| + creation_time); |
| + return true; |
| +} |
| + |
| } // namespace chrome_browser_net |