| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h" | 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h" |
| 6 | 6 |
| 7 #include <iostream> | 7 #include <iostream> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
| 14 #include "base/test/histogram_tester.h" | 14 #include "base/test/histogram_tester.h" |
| 15 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 16 #include "chrome/browser/history/history_service_factory.h" | 16 #include "chrome/browser/history/history_service_factory.h" |
| 17 #include "chrome/browser/predictors/loading_predictor.h" |
| 17 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" | 18 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" |
| 18 #include "chrome/browser/predictors/resource_prefetch_predictor_test_util.h" | 19 #include "chrome/browser/predictors/resource_prefetch_predictor_test_util.h" |
| 20 #include "chrome/browser/predictors/resource_prefetcher_manager.h" |
| 19 #include "chrome/test/base/testing_profile.h" | 21 #include "chrome/test/base/testing_profile.h" |
| 20 #include "components/history/core/browser/history_service.h" | 22 #include "components/history/core/browser/history_service.h" |
| 21 #include "components/history/core/browser/history_types.h" | 23 #include "components/history/core/browser/history_types.h" |
| 22 #include "components/sessions/core/session_id.h" | 24 #include "components/sessions/core/session_id.h" |
| 23 #include "content/public/browser/resource_request_info.h" | 25 #include "content/public/browser/resource_request_info.h" |
| 24 #include "content/public/test/test_browser_thread_bundle.h" | 26 #include "content/public/test/test_browser_thread_bundle.h" |
| 25 #include "net/http/http_response_headers.h" | 27 #include "net/http/http_response_headers.h" |
| 26 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" | 28 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |
| 27 #include "net/url_request/url_request_context.h" | 29 #include "net/url_request/url_request_context.h" |
| 28 #include "net/url_request/url_request_job.h" | 30 #include "net/url_request/url_request_job.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 TRAFFIC_ANNOTATION_FOR_TESTS); | 220 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 219 request->set_first_party_for_cookies(url); | 221 request->set_first_party_for_cookies(url); |
| 220 content::ResourceRequestInfo::AllocateForTesting( | 222 content::ResourceRequestInfo::AllocateForTesting( |
| 221 request.get(), resource_type, nullptr, -1, -1, -1, is_main_frame, false, | 223 request.get(), resource_type, nullptr, -1, -1, -1, is_main_frame, false, |
| 222 false, true, content::PREVIEWS_OFF); | 224 false, true, content::PREVIEWS_OFF); |
| 223 request->Start(); | 225 request->Start(); |
| 224 return request; | 226 return request; |
| 225 } | 227 } |
| 226 | 228 |
| 227 void InitializePredictor() { | 229 void InitializePredictor() { |
| 228 predictor_->StartInitialization(); | 230 loading_predictor_->StartInitialization(); |
| 229 base::RunLoop loop; | 231 base::RunLoop loop; |
| 230 loop.RunUntilIdle(); // Runs the DB lookup. | 232 loop.RunUntilIdle(); // Runs the DB lookup. |
| 231 profile_->BlockUntilHistoryProcessesPendingRequests(); | 233 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 232 } | 234 } |
| 233 | 235 |
| 234 void ResetPredictor() { | 236 void ResetPredictor() { |
| 235 LoadingPredictorConfig config; | 237 LoadingPredictorConfig config; |
| 236 config.max_urls_to_track = 3; | 238 PopulateTestConfig(&config); |
| 237 config.max_hosts_to_track = 2; | |
| 238 config.min_url_visit_count = 2; | |
| 239 config.max_resources_per_entry = 4; | |
| 240 config.max_consecutive_misses = 2; | |
| 241 config.max_redirect_consecutive_misses = 2; | |
| 242 config.min_resource_confidence_to_trigger_prefetch = 0.5; | |
| 243 config.is_url_learning_enabled = true; | |
| 244 config.is_manifests_enabled = true; | |
| 245 config.is_origin_learning_enabled = true; | |
| 246 | 239 |
| 247 config.mode |= LoadingPredictorConfig::LEARNING; | 240 loading_predictor_ = |
| 248 predictor_.reset(new ResourcePrefetchPredictor(config, profile_.get())); | 241 base::MakeUnique<LoadingPredictor>(config, profile_.get()); |
| 242 predictor_ = loading_predictor_->resource_prefetch_predictor(); |
| 249 predictor_->set_mock_tables(mock_tables_); | 243 predictor_->set_mock_tables(mock_tables_); |
| 250 } | 244 } |
| 251 | 245 |
| 252 void InitializeSampleData(); | 246 void InitializeSampleData(); |
| 253 void TestRedirectStatusHistogram( | 247 void TestRedirectStatusHistogram( |
| 254 const std::string& predictor_initial_key, | 248 const std::string& predictor_initial_key, |
| 255 const std::string& predictor_key, | 249 const std::string& predictor_key, |
| 256 const std::string& navigation_initial_url, | 250 const std::string& navigation_initial_url, |
| 257 const std::string& navigation_url, | 251 const std::string& navigation_url, |
| 258 ResourcePrefetchPredictor::RedirectStatus expected_status); | 252 ResourcePrefetchPredictor::RedirectStatus expected_status); |
| 259 | 253 |
| 260 content::TestBrowserThreadBundle thread_bundle_; | 254 content::TestBrowserThreadBundle thread_bundle_; |
| 261 std::unique_ptr<TestingProfile> profile_; | 255 std::unique_ptr<TestingProfile> profile_; |
| 262 net::TestURLRequestContext url_request_context_; | 256 net::TestURLRequestContext url_request_context_; |
| 263 | 257 |
| 264 std::unique_ptr<ResourcePrefetchPredictor> predictor_; | 258 std::unique_ptr<LoadingPredictor> loading_predictor_; |
| 259 ResourcePrefetchPredictor* predictor_; |
| 265 scoped_refptr<StrictMock<MockResourcePrefetchPredictorTables>> mock_tables_; | 260 scoped_refptr<StrictMock<MockResourcePrefetchPredictorTables>> mock_tables_; |
| 266 | 261 |
| 267 PrefetchDataMap test_url_data_; | 262 PrefetchDataMap test_url_data_; |
| 268 PrefetchDataMap test_host_data_; | 263 PrefetchDataMap test_host_data_; |
| 269 RedirectDataMap test_url_redirect_data_; | 264 RedirectDataMap test_url_redirect_data_; |
| 270 RedirectDataMap test_host_redirect_data_; | 265 RedirectDataMap test_host_redirect_data_; |
| 271 ManifestDataMap test_manifest_data_; | 266 ManifestDataMap test_manifest_data_; |
| 272 OriginDataMap test_origin_data_; | 267 OriginDataMap test_origin_data_; |
| 273 | 268 |
| 274 MockURLRequestJobFactory url_request_job_factory_; | 269 MockURLRequestJobFactory url_request_job_factory_; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 EXPECT_TRUE(predictor_->inflight_navigations_.empty()); | 304 EXPECT_TRUE(predictor_->inflight_navigations_.empty()); |
| 310 EXPECT_EQ(predictor_->initialization_state_, | 305 EXPECT_EQ(predictor_->initialization_state_, |
| 311 ResourcePrefetchPredictor::INITIALIZED); | 306 ResourcePrefetchPredictor::INITIALIZED); |
| 312 | 307 |
| 313 url_request_context_.set_job_factory(&url_request_job_factory_); | 308 url_request_context_.set_job_factory(&url_request_job_factory_); |
| 314 | 309 |
| 315 histogram_tester_.reset(new base::HistogramTester()); | 310 histogram_tester_.reset(new base::HistogramTester()); |
| 316 } | 311 } |
| 317 | 312 |
| 318 void ResourcePrefetchPredictorTest::TearDown() { | 313 void ResourcePrefetchPredictorTest::TearDown() { |
| 319 predictor_.reset(NULL); | 314 loading_predictor_ = nullptr; |
| 320 profile_->DestroyHistoryService(); | 315 profile_->DestroyHistoryService(); |
| 321 } | 316 } |
| 322 | 317 |
| 323 void ResourcePrefetchPredictorTest::InitializeSampleData() { | 318 void ResourcePrefetchPredictorTest::InitializeSampleData() { |
| 324 { // Url data. | 319 { // Url data. |
| 325 PrefetchData google = CreatePrefetchData("http://www.google.com/", 1); | 320 PrefetchData google = CreatePrefetchData("http://www.google.com/", 1); |
| 326 InitializeResourceData(google.add_resources(), | 321 InitializeResourceData(google.add_resources(), |
| 327 "http://google.com/style1.css", | 322 "http://google.com/style1.css", |
| 328 content::RESOURCE_TYPE_STYLESHEET, 3, 2, 1, 1.0, | 323 content::RESOURCE_TYPE_STYLESHEET, 3, 2, 1, 1.0, |
| 329 net::MEDIUM, false, false); | 324 net::MEDIUM, false, false); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 const std::string& navigation_initial_url, | 468 const std::string& navigation_initial_url, |
| 474 const std::string& navigation_url, | 469 const std::string& navigation_url, |
| 475 ResourcePrefetchPredictor::RedirectStatus expected_status) { | 470 ResourcePrefetchPredictor::RedirectStatus expected_status) { |
| 476 // Database initialization. | 471 // Database initialization. |
| 477 const std::string& script_url = "https://cdn.google.com/script.js"; | 472 const std::string& script_url = "https://cdn.google.com/script.js"; |
| 478 PrefetchData google = CreatePrefetchData(predictor_key, 1); | 473 PrefetchData google = CreatePrefetchData(predictor_key, 1); |
| 479 // We need at least one resource for prediction. | 474 // We need at least one resource for prediction. |
| 480 InitializeResourceData(google.add_resources(), script_url, | 475 InitializeResourceData(google.add_resources(), script_url, |
| 481 content::RESOURCE_TYPE_SCRIPT, 10, 0, 1, 2.1, | 476 content::RESOURCE_TYPE_SCRIPT, 10, 0, 1, 2.1, |
| 482 net::MEDIUM, false, false); | 477 net::MEDIUM, false, false); |
| 483 predictor_->host_table_cache_->insert( | 478 predictor_->host_table_cache_->emplace(google.primary_key(), google); |
| 484 std::make_pair(google.primary_key(), google)); | |
| 485 | 479 |
| 486 if (predictor_initial_key != predictor_key) { | 480 if (predictor_initial_key != predictor_key) { |
| 487 RedirectData redirect = CreateRedirectData(predictor_initial_key, 1); | 481 RedirectData redirect = CreateRedirectData(predictor_initial_key, 1); |
| 488 InitializeRedirectStat(redirect.add_redirect_endpoints(), predictor_key, 10, | 482 InitializeRedirectStat(redirect.add_redirect_endpoints(), predictor_key, 10, |
| 489 0, 0); | 483 0, 0); |
| 490 predictor_->host_redirect_table_cache_->insert( | 484 predictor_->host_redirect_table_cache_->emplace(redirect.primary_key(), |
| 491 std::make_pair(redirect.primary_key(), redirect)); | 485 redirect); |
| 492 } | 486 } |
| 493 | 487 |
| 494 // Navigation simulation. | 488 // Navigation simulation. |
| 495 using testing::_; | 489 using testing::_; |
| 496 EXPECT_CALL(*mock_tables_.get(), UpdateResourceData(_, _)); | 490 EXPECT_CALL(*mock_tables_.get(), UpdateResourceData(_, _)); |
| 497 EXPECT_CALL(*mock_tables_.get(), UpdateRedirectData(_, _)); | 491 EXPECT_CALL(*mock_tables_.get(), UpdateRedirectData(_, _)); |
| 498 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_)); | 492 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_)); |
| 499 URLRequestSummary initial = | 493 URLRequestSummary initial = |
| 500 CreateURLRequestSummary(1, navigation_initial_url); | 494 CreateURLRequestSummary(1, navigation_initial_url); |
| 501 predictor_->RecordURLRequest(initial); | 495 predictor_->RecordURLRequest(initial); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 predictor_->RecordURLResponse(resource1); | 592 predictor_->RecordURLResponse(resource1); |
| 599 URLRequestSummary resource2 = CreateURLRequestSummary( | 593 URLRequestSummary resource2 = CreateURLRequestSummary( |
| 600 1, "https://www.google.com", "https://google.com/script1.js", | 594 1, "https://www.google.com", "https://google.com/script1.js", |
| 601 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); | 595 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); |
| 602 predictor_->RecordURLResponse(resource2); | 596 predictor_->RecordURLResponse(resource2); |
| 603 URLRequestSummary resource3 = CreateURLRequestSummary( | 597 URLRequestSummary resource3 = CreateURLRequestSummary( |
| 604 1, "https://www.google.com", "https://google.com/script2.js", | 598 1, "https://www.google.com", "https://google.com/script2.js", |
| 605 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); | 599 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); |
| 606 predictor_->RecordURLResponse(resource3); | 600 predictor_->RecordURLResponse(resource3); |
| 607 | 601 |
| 608 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer( | 602 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); |
| 609 predictor_.get()); | |
| 610 EXPECT_CALL( | 603 EXPECT_CALL( |
| 611 mock_observer, | 604 mock_observer, |
| 612 OnNavigationLearned(kVisitCount, | 605 OnNavigationLearned(kVisitCount, |
| 613 CreatePageRequestSummary( | 606 CreatePageRequestSummary( |
| 614 "https://www.google.com", "http://www.google.com", | 607 "https://www.google.com", "http://www.google.com", |
| 615 {resource1, resource2, resource3}))); | 608 {resource1, resource2, resource3}))); |
| 616 | 609 |
| 617 PrefetchData host_data = CreatePrefetchData("www.google.com"); | 610 PrefetchData host_data = CreatePrefetchData("www.google.com"); |
| 618 InitializeResourceData(host_data.add_resources(), | 611 InitializeResourceData(host_data.add_resources(), |
| 619 "https://google.com/style1.css", | 612 "https://google.com/style1.css", |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); | 689 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); |
| 697 redirected.redirect_url = GURL("http://dev.null.google.com/style.css"); | 690 redirected.redirect_url = GURL("http://dev.null.google.com/style.css"); |
| 698 | 691 |
| 699 predictor_->RecordURLRedirect(redirected); | 692 predictor_->RecordURLRedirect(redirected); |
| 700 redirected.is_no_store = true; | 693 redirected.is_no_store = true; |
| 701 redirected.request_url = redirected.redirect_url; | 694 redirected.request_url = redirected.redirect_url; |
| 702 redirected.redirect_url = GURL(); | 695 redirected.redirect_url = GURL(); |
| 703 | 696 |
| 704 predictor_->RecordURLResponse(redirected); | 697 predictor_->RecordURLResponse(redirected); |
| 705 | 698 |
| 706 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer( | 699 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); |
| 707 predictor_.get()); | |
| 708 EXPECT_CALL(mock_observer, | 700 EXPECT_CALL(mock_observer, |
| 709 OnNavigationLearned( | 701 OnNavigationLearned( |
| 710 kVisitCount, CreatePageRequestSummary("http://www.google.com", | 702 kVisitCount, CreatePageRequestSummary("http://www.google.com", |
| 711 "http://www.google.com", | 703 "http://www.google.com", |
| 712 resources))); | 704 resources))); |
| 713 | 705 |
| 714 PrefetchData url_data = CreatePrefetchData("http://www.google.com/"); | 706 PrefetchData url_data = CreatePrefetchData("http://www.google.com/"); |
| 715 InitializeResourceData(url_data.add_resources(), | 707 InitializeResourceData(url_data.add_resources(), |
| 716 "http://google.com/style1.css", | 708 "http://google.com/style1.css", |
| 717 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, | 709 content::RESOURCE_TYPE_STYLESHEET, 1, 0, 0, 1.0, |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 1, "http://www.google.com", "http://google.com/style2.css", | 808 1, "http://www.google.com", "http://google.com/style2.css", |
| 817 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true)); | 809 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true)); |
| 818 predictor_->RecordURLResponse(resources.back()); | 810 predictor_->RecordURLResponse(resources.back()); |
| 819 auto no_store = CreateURLRequestSummary( | 811 auto no_store = CreateURLRequestSummary( |
| 820 1, "http://www.google.com", | 812 1, "http://www.google.com", |
| 821 "http://static.google.com/style2-no-store.css", | 813 "http://static.google.com/style2-no-store.css", |
| 822 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); | 814 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); |
| 823 no_store.is_no_store = true; | 815 no_store.is_no_store = true; |
| 824 predictor_->RecordURLResponse(no_store); | 816 predictor_->RecordURLResponse(no_store); |
| 825 | 817 |
| 826 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer( | 818 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); |
| 827 predictor_.get()); | |
| 828 EXPECT_CALL(mock_observer, | 819 EXPECT_CALL(mock_observer, |
| 829 OnNavigationLearned( | 820 OnNavigationLearned( |
| 830 kVisitCount, CreatePageRequestSummary("http://www.google.com", | 821 kVisitCount, CreatePageRequestSummary("http://www.google.com", |
| 831 "http://www.google.com", | 822 "http://www.google.com", |
| 832 resources))); | 823 resources))); |
| 833 | 824 |
| 834 PrefetchData url_data = CreatePrefetchData("http://www.google.com/"); | 825 PrefetchData url_data = CreatePrefetchData("http://www.google.com/"); |
| 835 InitializeResourceData(url_data.add_resources(), | 826 InitializeResourceData(url_data.add_resources(), |
| 836 "http://google.com/style1.css", | 827 "http://google.com/style1.css", |
| 837 content::RESOURCE_TYPE_STYLESHEET, 4, 2, 0, 1.0, | 828 content::RESOURCE_TYPE_STYLESHEET, 4, 2, 0, 1.0, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 922 | 913 |
| 923 URLRequestSummary resource1 = CreateURLRequestSummary( | 914 URLRequestSummary resource1 = CreateURLRequestSummary( |
| 924 1, "http://www.nike.com", "http://nike.com/style1.css", | 915 1, "http://www.nike.com", "http://nike.com/style1.css", |
| 925 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", false); | 916 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", false); |
| 926 predictor_->RecordURLResponse(resource1); | 917 predictor_->RecordURLResponse(resource1); |
| 927 URLRequestSummary resource2 = CreateURLRequestSummary( | 918 URLRequestSummary resource2 = CreateURLRequestSummary( |
| 928 1, "http://www.nike.com", "http://nike.com/image2.png", | 919 1, "http://www.nike.com", "http://nike.com/image2.png", |
| 929 content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false); | 920 content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false); |
| 930 predictor_->RecordURLResponse(resource2); | 921 predictor_->RecordURLResponse(resource2); |
| 931 | 922 |
| 932 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer( | 923 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); |
| 933 predictor_.get()); | |
| 934 EXPECT_CALL(mock_observer, | 924 EXPECT_CALL(mock_observer, |
| 935 OnNavigationLearned( | 925 OnNavigationLearned( |
| 936 kVisitCount, CreatePageRequestSummary( | 926 kVisitCount, CreatePageRequestSummary( |
| 937 "http://www.nike.com", "http://www.nike.com", | 927 "http://www.nike.com", "http://www.nike.com", |
| 938 {resource1, resource2}))); | 928 {resource1, resource2}))); |
| 939 | 929 |
| 940 EXPECT_CALL(*mock_tables_.get(), | 930 EXPECT_CALL(*mock_tables_.get(), |
| 941 DeleteSingleResourceDataPoint("http://www.google.com/", | 931 DeleteSingleResourceDataPoint("http://www.google.com/", |
| 942 PREFETCH_KEY_TYPE_URL)); | 932 PREFETCH_KEY_TYPE_URL)); |
| 943 EXPECT_CALL(*mock_tables_.get(), | 933 EXPECT_CALL(*mock_tables_.get(), |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 EXPECT_EQ(1U, predictor_->inflight_navigations_.size()); | 978 EXPECT_EQ(1U, predictor_->inflight_navigations_.size()); |
| 989 | 979 |
| 990 URLRequestSummary fb2 = CreateRedirectRequestSummary( | 980 URLRequestSummary fb2 = CreateRedirectRequestSummary( |
| 991 1, "http://fb.com/google", "http://facebook.com/google"); | 981 1, "http://fb.com/google", "http://facebook.com/google"); |
| 992 predictor_->RecordURLRedirect(fb2); | 982 predictor_->RecordURLRedirect(fb2); |
| 993 URLRequestSummary fb3 = CreateRedirectRequestSummary( | 983 URLRequestSummary fb3 = CreateRedirectRequestSummary( |
| 994 1, "http://facebook.com/google", "https://facebook.com/google"); | 984 1, "http://facebook.com/google", "https://facebook.com/google"); |
| 995 predictor_->RecordURLRedirect(fb3); | 985 predictor_->RecordURLRedirect(fb3); |
| 996 NavigationID fb_end = CreateNavigationID(1, "https://facebook.com/google"); | 986 NavigationID fb_end = CreateNavigationID(1, "https://facebook.com/google"); |
| 997 | 987 |
| 998 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer( | 988 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); |
| 999 predictor_.get()); | |
| 1000 EXPECT_CALL( | 989 EXPECT_CALL( |
| 1001 mock_observer, | 990 mock_observer, |
| 1002 OnNavigationLearned(kVisitCount, CreatePageRequestSummary( | 991 OnNavigationLearned(kVisitCount, CreatePageRequestSummary( |
| 1003 "https://facebook.com/google", | 992 "https://facebook.com/google", |
| 1004 "http://fb.com/google", | 993 "http://fb.com/google", |
| 1005 std::vector<URLRequestSummary>()))); | 994 std::vector<URLRequestSummary>()))); |
| 1006 | 995 |
| 1007 // Since the navigation hasn't resources, corresponding entry | 996 // Since the navigation hasn't resources, corresponding entry |
| 1008 // in resource table will be deleted. | 997 // in resource table will be deleted. |
| 1009 EXPECT_CALL(*mock_tables_.get(), | 998 EXPECT_CALL(*mock_tables_.get(), |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1053 EXPECT_EQ(1U, predictor_->inflight_navigations_.size()); | 1042 EXPECT_EQ(1U, predictor_->inflight_navigations_.size()); |
| 1054 | 1043 |
| 1055 URLRequestSummary fb2 = CreateRedirectRequestSummary( | 1044 URLRequestSummary fb2 = CreateRedirectRequestSummary( |
| 1056 1, "http://fb.com/google", "http://facebook.com/google"); | 1045 1, "http://fb.com/google", "http://facebook.com/google"); |
| 1057 predictor_->RecordURLRedirect(fb2); | 1046 predictor_->RecordURLRedirect(fb2); |
| 1058 URLRequestSummary fb3 = CreateRedirectRequestSummary( | 1047 URLRequestSummary fb3 = CreateRedirectRequestSummary( |
| 1059 1, "http://facebook.com/google", "https://facebook.com/google"); | 1048 1, "http://facebook.com/google", "https://facebook.com/google"); |
| 1060 predictor_->RecordURLRedirect(fb3); | 1049 predictor_->RecordURLRedirect(fb3); |
| 1061 NavigationID fb_end = CreateNavigationID(1, "https://facebook.com/google"); | 1050 NavigationID fb_end = CreateNavigationID(1, "https://facebook.com/google"); |
| 1062 | 1051 |
| 1063 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer( | 1052 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); |
| 1064 predictor_.get()); | |
| 1065 EXPECT_CALL( | 1053 EXPECT_CALL( |
| 1066 mock_observer, | 1054 mock_observer, |
| 1067 OnNavigationLearned(kVisitCount, CreatePageRequestSummary( | 1055 OnNavigationLearned(kVisitCount, CreatePageRequestSummary( |
| 1068 "https://facebook.com/google", | 1056 "https://facebook.com/google", |
| 1069 "http://fb.com/google", | 1057 "http://fb.com/google", |
| 1070 std::vector<URLRequestSummary>()))); | 1058 std::vector<URLRequestSummary>()))); |
| 1071 | 1059 |
| 1072 // Oldest entries in tables will be superseded and deleted. | 1060 // Oldest entries in tables will be superseded and deleted. |
| 1073 EXPECT_CALL(*mock_tables_.get(), | 1061 EXPECT_CALL(*mock_tables_.get(), |
| 1074 DeleteSingleRedirectDataPoint("bbc.com", PREFETCH_KEY_TYPE_HOST)); | 1062 DeleteSingleRedirectDataPoint("bbc.com", PREFETCH_KEY_TYPE_HOST)); |
| (...skipping 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2089 } | 2077 } |
| 2090 | 2078 |
| 2091 TEST_F(ResourcePrefetchPredictorTest, | 2079 TEST_F(ResourcePrefetchPredictorTest, |
| 2092 TestRedirectStatusRedirectCorrectlyPredicted) { | 2080 TestRedirectStatusRedirectCorrectlyPredicted) { |
| 2093 TestRedirectStatusHistogram( | 2081 TestRedirectStatusHistogram( |
| 2094 "google.com", "www.google.com", "http://google.com?query=cats", | 2082 "google.com", "www.google.com", "http://google.com?query=cats", |
| 2095 "http://www.google.com?query=cats", | 2083 "http://www.google.com?query=cats", |
| 2096 ResourcePrefetchPredictor::RedirectStatus::REDIRECT_CORRECTLY_PREDICTED); | 2084 ResourcePrefetchPredictor::RedirectStatus::REDIRECT_CORRECTLY_PREDICTED); |
| 2097 } | 2085 } |
| 2098 | 2086 |
| 2099 TEST_F(ResourcePrefetchPredictorTest, TestPrefetchingDurationHistogram) { | |
| 2100 // Prefetching duration for an url without resources in the database | |
| 2101 // shouldn't be recorded. | |
| 2102 const std::string main_frame_url = "http://google.com/?query=cats"; | |
| 2103 predictor_->StartPrefetching(GURL(main_frame_url), HintOrigin::EXTERNAL); | |
| 2104 predictor_->StopPrefetching(GURL(main_frame_url)); | |
| 2105 histogram_tester_->ExpectTotalCount( | |
| 2106 internal::kResourcePrefetchPredictorPrefetchingDurationHistogram, 0); | |
| 2107 | |
| 2108 // Fill the database to record a duration. | |
| 2109 PrefetchData google = CreatePrefetchData("google.com", 1); | |
| 2110 InitializeResourceData( | |
| 2111 google.add_resources(), "https://cdn.google.com/script.js", | |
| 2112 content::RESOURCE_TYPE_SCRIPT, 10, 0, 1, 2.1, net::MEDIUM, false, false); | |
| 2113 predictor_->host_table_cache_->insert( | |
| 2114 std::make_pair(google.primary_key(), google)); | |
| 2115 | |
| 2116 predictor_->StartPrefetching(GURL(main_frame_url), HintOrigin::EXTERNAL); | |
| 2117 predictor_->StopPrefetching(GURL(main_frame_url)); | |
| 2118 histogram_tester_->ExpectTotalCount( | |
| 2119 internal::kResourcePrefetchPredictorPrefetchingDurationHistogram, 1); | |
| 2120 } | |
| 2121 | |
| 2122 TEST_F(ResourcePrefetchPredictorTest, TestRecordFirstContentfulPaint) { | 2087 TEST_F(ResourcePrefetchPredictorTest, TestRecordFirstContentfulPaint) { |
| 2123 using testing::_; | 2088 using testing::_; |
| 2124 EXPECT_CALL(*mock_tables_.get(), UpdateRedirectData(_, _)); | 2089 EXPECT_CALL(*mock_tables_.get(), UpdateRedirectData(_, _)); |
| 2125 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_)); | 2090 EXPECT_CALL(*mock_tables_.get(), UpdateOriginData(_)); |
| 2126 | 2091 |
| 2127 auto res1_time = base::TimeTicks::FromInternalValue(1); | 2092 auto res1_time = base::TimeTicks::FromInternalValue(1); |
| 2128 auto res2_time = base::TimeTicks::FromInternalValue(2); | 2093 auto res2_time = base::TimeTicks::FromInternalValue(2); |
| 2129 auto fcp_time = base::TimeTicks::FromInternalValue(3); | 2094 auto fcp_time = base::TimeTicks::FromInternalValue(3); |
| 2130 auto res3_time = base::TimeTicks::FromInternalValue(4); | 2095 auto res3_time = base::TimeTicks::FromInternalValue(4); |
| 2131 | 2096 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2166 net::MEDIUM, false, false); | 2131 net::MEDIUM, false, false); |
| 2167 resource3_rd->set_before_first_contentful_paint(false); | 2132 resource3_rd->set_before_first_contentful_paint(false); |
| 2168 EXPECT_CALL(*mock_tables_.get(), | 2133 EXPECT_CALL(*mock_tables_.get(), |
| 2169 UpdateResourceData(host_data, PREFETCH_KEY_TYPE_HOST)); | 2134 UpdateResourceData(host_data, PREFETCH_KEY_TYPE_HOST)); |
| 2170 | 2135 |
| 2171 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 2136 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 2172 profile_->BlockUntilHistoryProcessesPendingRequests(); | 2137 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 2173 } | 2138 } |
| 2174 | 2139 |
| 2175 } // namespace predictors | 2140 } // namespace predictors |
| OLD | NEW |