| 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..d1517f14920d6c532bcba1dbd7e9263fd1854ec2 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>
|
|
|
| +#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/resource_request_info.h"
|
| #include "net/url_request/url_request.h"
|
| #include "url/gurl.h"
|
|
|
| +namespace content {
|
| +class WebContents;
|
| +}
|
| +
|
| using content::BrowserThread;
|
| using predictors::ResourcePrefetchPredictor;
|
| +using URLRequestSummary =
|
| + predictors::ResourcePrefetchPredictor::URLRequestSummary;
|
|
|
| namespace {
|
|
|
| @@ -51,6 +59,20 @@ void ReportMainFrameRequestStats(MainFrameRequestStats stat) {
|
| MAIN_FRAME_REQUEST_STATS_MAX);
|
| }
|
|
|
| +bool TryToFillNavigationID(
|
| + predictors::NavigationID* navigation_id,
|
| + const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
|
| + const GURL& main_frame_url,
|
| + const base::TimeTicks& creation_time) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + content::WebContents* web_contents = web_contents_getter.Run();
|
| + if (!web_contents)
|
| + return false;
|
| + *navigation_id =
|
| + predictors::NavigationID(web_contents, main_frame_url, creation_time);
|
| + return true;
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace chrome_browser_net {
|
| @@ -69,8 +91,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 +101,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(),
|
| + 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 +133,20 @@ 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;
|
| + 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 +155,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 +171,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 +192,43 @@ 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, 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);
|
| +}
|
| +
|
| } // namespace chrome_browser_net
|
|
|