Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3423)

Unified Diff: chrome/browser/predictors/loading_data_collector.cc

Issue 2896713003: Create LoadingDataCollector class and have observers rely on it instead of ResourcePrefetchPredictor (Closed)
Patch Set: Reset MockURLRequestJobFactory Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/predictors/loading_data_collector.cc
diff --git a/chrome/browser/predictors/loading_data_collector.cc b/chrome/browser/predictors/loading_data_collector.cc
new file mode 100644
index 0000000000000000000000000000000000000000..92705ae7773ae5784ed029e6412408dd01969fcc
--- /dev/null
+++ b/chrome/browser/predictors/loading_data_collector.cc
@@ -0,0 +1,144 @@
+// Copyright 2017 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 <string>
+
+#include "chrome/browser/predictors/loading_data_collector.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/mime_util/mime_util.h"
+#include "content/public/browser/resource_request_info.h"
+#include "content/public/common/resource_type.h"
+#include "net/url_request/url_request.h"
+
+namespace predictors {
+
+namespace {
+
+bool g_allow_port_in_urls = false;
+
+} // namespace
+
+// static
+bool LoadingDataCollector::ShouldRecordRequest(
+ net::URLRequest* request,
+ content::ResourceType resource_type) {
+ const content::ResourceRequestInfo* request_info =
+ content::ResourceRequestInfo::ForRequest(request);
+ if (!request_info)
+ return false;
+
+ if (!request_info->IsMainFrame())
+ return false;
+
+ return resource_type == content::RESOURCE_TYPE_MAIN_FRAME &&
+ IsHandledMainPage(request);
+}
+
+// static
+bool LoadingDataCollector::ShouldRecordResponse(net::URLRequest* response) {
+ const content::ResourceRequestInfo* request_info =
+ content::ResourceRequestInfo::ForRequest(response);
+ if (!request_info)
+ return false;
+
+ if (!request_info->IsMainFrame())
+ return false;
+
+ content::ResourceType resource_type = request_info->GetResourceType();
+ return resource_type == content::RESOURCE_TYPE_MAIN_FRAME
+ ? IsHandledMainPage(response)
+ : IsHandledSubresource(response, resource_type);
+}
+
+// static
+bool LoadingDataCollector::ShouldRecordRedirect(net::URLRequest* response) {
+ return ShouldRecordResponse(response);
+}
+
+// static
+bool LoadingDataCollector::IsHandledMainPage(net::URLRequest* request) {
+ const GURL& url = request->url();
+ bool bad_port = !g_allow_port_in_urls && url.has_port();
+ return url.SchemeIsHTTPOrHTTPS() && !bad_port;
+}
+
+// static
+bool LoadingDataCollector::IsHandledSubresource(
+ net::URLRequest* response,
+ content::ResourceType resource_type) {
+ const GURL& url = response->url();
+ bool bad_port = !g_allow_port_in_urls && url.has_port();
+ if (!response->first_party_for_cookies().SchemeIsHTTPOrHTTPS() ||
+ !url.SchemeIsHTTPOrHTTPS() || bad_port) {
+ return false;
+ }
+
+ std::string mime_type;
+ response->GetMimeType(&mime_type);
+ if (!IsHandledResourceType(resource_type, mime_type))
+ return false;
+
+ if (response->method() != "GET")
+ return false;
+
+ if (response->original_url().spec().length() >
+ ResourcePrefetchPredictorTables::kMaxStringLength) {
+ return false;
+ }
+
+ if (!response->response_info().headers.get())
+ return false;
+
+ return true;
+}
+
+// static
+bool LoadingDataCollector::IsHandledResourceType(
+ content::ResourceType resource_type,
+ const std::string& mime_type) {
+ content::ResourceType actual_resource_type =
+ ResourcePrefetchPredictor::GetResourceType(resource_type, mime_type);
+ return actual_resource_type == content::RESOURCE_TYPE_STYLESHEET ||
+ actual_resource_type == content::RESOURCE_TYPE_SCRIPT ||
+ actual_resource_type == content::RESOURCE_TYPE_IMAGE ||
+ actual_resource_type == content::RESOURCE_TYPE_FONT_RESOURCE;
+}
+
+// static
+void LoadingDataCollector::SetAllowPortInUrlsForTesting(bool state) {
+ g_allow_port_in_urls = state;
+}
+
+LoadingDataCollector::LoadingDataCollector(ResourcePrefetchPredictor* predictor)
+ : predictor_(predictor) {}
+
+LoadingDataCollector::~LoadingDataCollector() {}
+
+void LoadingDataCollector::RecordURLRequest(
+ const ResourcePrefetchPredictor::URLRequestSummary& request) {
+ predictor_->RecordURLRequest(request);
+}
+
+void LoadingDataCollector::RecordURLResponse(
+ const ResourcePrefetchPredictor::URLRequestSummary& response) {
+ predictor_->RecordURLResponse(response);
+}
+
+void LoadingDataCollector::RecordURLRedirect(
+ const ResourcePrefetchPredictor::URLRequestSummary& response) {
+ predictor_->RecordURLRedirect(response);
+}
+
+void LoadingDataCollector::RecordMainFrameLoadComplete(
+ const NavigationID& navigation_id) {
+ predictor_->RecordMainFrameLoadComplete(navigation_id);
+}
+
+void LoadingDataCollector::RecordFirstContentfulPaint(
+ const NavigationID& navigation_id,
+ const base::TimeTicks& first_contentful_paint) {
+ predictor_->RecordFirstContentfulPaint(navigation_id, first_contentful_paint);
+}
+
+} // namespace predictors

Powered by Google App Engine
This is Rietveld 408576698