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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..34701b0f18a6c83094b81e1793992f51b78961e1 |
--- /dev/null |
+++ b/chrome/browser/net/resource_prefetch_predictor_observer.cc |
@@ -0,0 +1,126 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/net/resource_prefetch_predictor_observer.h" |
+ |
+#include <string> |
+ |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/resource_request_info.h" |
+#include "net/url_request/url_request.h" |
+ |
+using content::BrowserThread; |
+using predictors::ResourcePrefetchPredictor; |
+ |
+namespace { |
+ |
+bool SummarizeResponse(net::URLRequest* request, |
+ ResourcePrefetchPredictor::URLRequestSummary* summary) { |
+ const content::ResourceRequestInfo* info = |
+ content::ResourceRequestInfo::ForRequest(request); |
+ if (!info) { |
+ LOG(ERROR) << "No ResourceRequestInfo in request"; |
+ return false; |
+ } |
+ |
+ int render_process_id, render_view_id; |
+ if (!info->GetAssociatedRenderView(&render_process_id, &render_view_id)) { |
+ LOG(ERROR) << "Could not get RenderViewId from request info."; |
+ return false; |
+ } |
+ |
+ summary->navigation_id.render_process_id = render_process_id; |
+ summary->navigation_id.render_view_id = render_view_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 = info->GetResourceType(); |
+ request->GetMimeType(&summary->mime_type); |
+ summary->was_cached = request->was_cached(); |
+ |
+ // We want to rely on the mime_type to determine the resource type since we |
+ // dont want types such as PREFETCH, SUB_RESOURCE, etc. |
+ summary->resource_type = |
+ ResourcePrefetchPredictor::GetResourceTypeFromMimeType( |
+ summary->mime_type, |
+ summary->resource_type); |
+ return true; |
+} |
+ |
+} // namespace |
+ |
+namespace chrome_browser_net { |
+ |
+ResourcePrefetchPredictorObserver::ResourcePrefetchPredictorObserver( |
+ ResourcePrefetchPredictor* predictor) |
+ : predictor_(predictor->AsWeakPtr()) { |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+} |
+ |
+ResourcePrefetchPredictorObserver::~ResourcePrefetchPredictorObserver() { |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+} |
+ |
+void ResourcePrefetchPredictorObserver::OnRequestStarted( |
+ net::URLRequest* request, |
+ ResourceType::Type resource_type, |
+ int child_id, |
+ int route_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ if (!ResourcePrefetchPredictor::ShouldRecordRequest(request, resource_type)) |
+ return; |
+ |
+ ResourcePrefetchPredictor::URLRequestSummary summary; |
+ summary.navigation_id.render_process_id = child_id; |
+ summary.navigation_id.render_view_id = route_id; |
+ summary.navigation_id.main_frame_url = request->first_party_for_cookies(); |
+ summary.resource_url = request->original_url(); |
+ summary.resource_type = resource_type; |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&ResourcePrefetchPredictor::RecordURLRequest, |
+ predictor_, |
+ summary)); |
+} |
+ |
+void ResourcePrefetchPredictorObserver::OnRequestRedirected( |
+ net::URLRequest* request) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ if (!ResourcePrefetchPredictor::ShouldRecordRedirect(request)) |
+ return; |
+ ResourcePrefetchPredictor::URLRequestSummary summary; |
+ if (!SummarizeResponse(request, &summary)) |
+ return; |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&ResourcePrefetchPredictor::RecordUrlRedirect, |
+ predictor_, |
+ summary)); |
+} |
+ |
+void ResourcePrefetchPredictorObserver::OnResponseStarted( |
+ net::URLRequest* request) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ if (!ResourcePrefetchPredictor::ShouldRecordResponse(request)) |
+ return; |
+ ResourcePrefetchPredictor::URLRequestSummary summary; |
+ if (!SummarizeResponse(request, &summary)) |
+ return; |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&ResourcePrefetchPredictor::RecordUrlResponse, |
+ predictor_, |
+ summary)); |
+} |
+ |
+} // namespace chrome_browser_net |