Chromium Code Reviews| 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 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 40 | 40 |
| 41 namespace predictors { | 41 namespace predictors { |
| 42 | 42 |
| 43 using URLRequestSummary = ResourcePrefetchPredictor::URLRequestSummary; | 43 using URLRequestSummary = ResourcePrefetchPredictor::URLRequestSummary; |
| 44 using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary; | 44 using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary; |
| 45 using PrefetchDataMap = std::map<std::string, PrefetchData>; | 45 using PrefetchDataMap = std::map<std::string, PrefetchData>; |
| 46 using RedirectDataMap = std::map<std::string, RedirectData>; | 46 using RedirectDataMap = std::map<std::string, RedirectData>; |
| 47 using OriginDataMap = std::map<std::string, OriginData>; | 47 using OriginDataMap = std::map<std::string, OriginData>; |
| 48 using ManifestDataMap = std::map<std::string, precache::PrecacheManifest>; | 48 using ManifestDataMap = std::map<std::string, precache::PrecacheManifest>; |
| 49 | 49 |
| 50 scoped_refptr<net::HttpResponseHeaders> MakeResponseHeaders( | |
| 51 const char* headers) { | |
| 52 return make_scoped_refptr(new net::HttpResponseHeaders( | |
| 53 net::HttpUtil::AssembleRawHeaders(headers, strlen(headers)))); | |
| 54 } | |
| 55 | |
| 56 class EmptyURLRequestDelegate : public net::URLRequest::Delegate { | 50 class EmptyURLRequestDelegate : public net::URLRequest::Delegate { |
|
Benoit L
2017/06/02 12:44:00
This class is now duplicated, can you move it to a
trevordixon
2017/06/06 13:08:04
Done.
| |
| 57 void OnResponseStarted(net::URLRequest* request, int net_error) override {} | 51 void OnResponseStarted(net::URLRequest* request, int net_error) override {} |
| 58 void OnReadCompleted(net::URLRequest* request, int bytes_read) override {} | 52 void OnReadCompleted(net::URLRequest* request, int bytes_read) override {} |
| 59 }; | 53 }; |
| 60 | 54 |
| 61 class MockURLRequestJob : public net::URLRequestJob { | |
| 62 public: | |
| 63 MockURLRequestJob(net::URLRequest* request, | |
| 64 const net::HttpResponseInfo& response_info, | |
| 65 const std::string& mime_type) | |
| 66 : net::URLRequestJob(request, nullptr), | |
| 67 response_info_(response_info), | |
| 68 mime_type_(mime_type) {} | |
| 69 | |
| 70 bool GetMimeType(std::string* mime_type) const override { | |
| 71 *mime_type = mime_type_; | |
| 72 return true; | |
| 73 } | |
| 74 | |
| 75 protected: | |
| 76 void Start() override { NotifyHeadersComplete(); } | |
| 77 void GetResponseInfo(net::HttpResponseInfo* info) override { | |
| 78 *info = response_info_; | |
| 79 } | |
| 80 | |
| 81 private: | |
| 82 net::HttpResponseInfo response_info_; | |
| 83 std::string mime_type_; | |
| 84 }; | |
| 85 | |
| 86 class MockURLRequestJobFactory : public net::URLRequestJobFactory { | |
| 87 public: | |
| 88 MockURLRequestJobFactory() {} | |
| 89 ~MockURLRequestJobFactory() override {} | |
| 90 | |
| 91 net::URLRequestJob* MaybeCreateJobWithProtocolHandler( | |
| 92 const std::string& scheme, | |
| 93 net::URLRequest* request, | |
| 94 net::NetworkDelegate* network_delegate) const override { | |
| 95 return new MockURLRequestJob(request, response_info_, mime_type_); | |
| 96 } | |
| 97 | |
| 98 net::URLRequestJob* MaybeInterceptRedirect( | |
| 99 net::URLRequest* request, | |
| 100 net::NetworkDelegate* network_delegate, | |
| 101 const GURL& location) const override { | |
| 102 return nullptr; | |
| 103 } | |
| 104 | |
| 105 net::URLRequestJob* MaybeInterceptResponse( | |
| 106 net::URLRequest* request, | |
| 107 net::NetworkDelegate* network_delegate) const override { | |
| 108 return nullptr; | |
| 109 } | |
| 110 | |
| 111 bool IsHandledProtocol(const std::string& scheme) const override { | |
| 112 return true; | |
| 113 } | |
| 114 | |
| 115 bool IsSafeRedirectTarget(const GURL& location) const override { | |
| 116 return true; | |
| 117 } | |
| 118 | |
| 119 void set_response_info(const net::HttpResponseInfo& response_info) { | |
| 120 response_info_ = response_info; | |
| 121 } | |
| 122 | |
| 123 void set_mime_type(const std::string& mime_type) { mime_type_ = mime_type; } | |
| 124 | |
| 125 private: | |
| 126 net::HttpResponseInfo response_info_; | |
| 127 std::string mime_type_; | |
| 128 }; | |
| 129 | |
| 130 template <typename T> | 55 template <typename T> |
| 131 class FakeGlowplugKeyValueTable : public GlowplugKeyValueTable<T> { | 56 class FakeGlowplugKeyValueTable : public GlowplugKeyValueTable<T> { |
| 132 public: | 57 public: |
| 133 FakeGlowplugKeyValueTable() : GlowplugKeyValueTable<T>("") {} | 58 FakeGlowplugKeyValueTable() : GlowplugKeyValueTable<T>("") {} |
| 134 void GetAllData(std::map<std::string, T>* data_map, | 59 void GetAllData(std::map<std::string, T>* data_map, |
| 135 sql::Connection* db) const override { | 60 sql::Connection* db) const override { |
| 136 *data_map = data_; | 61 *data_map = data_; |
| 137 } | 62 } |
| 138 void UpdateData(const std::string& key, | 63 void UpdateData(const std::string& key, |
| 139 const T& data, | 64 const T& data, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 FakeGlowplugKeyValueTable<RedirectData> url_redirect_table_; | 117 FakeGlowplugKeyValueTable<RedirectData> url_redirect_table_; |
| 193 FakeGlowplugKeyValueTable<PrefetchData> host_resource_table_; | 118 FakeGlowplugKeyValueTable<PrefetchData> host_resource_table_; |
| 194 FakeGlowplugKeyValueTable<RedirectData> host_redirect_table_; | 119 FakeGlowplugKeyValueTable<RedirectData> host_redirect_table_; |
| 195 FakeGlowplugKeyValueTable<precache::PrecacheManifest> manifest_table_; | 120 FakeGlowplugKeyValueTable<precache::PrecacheManifest> manifest_table_; |
| 196 FakeGlowplugKeyValueTable<OriginData> origin_table_; | 121 FakeGlowplugKeyValueTable<OriginData> origin_table_; |
| 197 | 122 |
| 198 protected: | 123 protected: |
| 199 ~MockResourcePrefetchPredictorTables() override = default; | 124 ~MockResourcePrefetchPredictorTables() override = default; |
| 200 }; | 125 }; |
| 201 | 126 |
| 202 class MockResourcePrefetchPredictorObserver : public TestObserver { | 127 class MockLoadingPredictorObserver : public TestObserver { |
| 203 public: | 128 public: |
| 204 explicit MockResourcePrefetchPredictorObserver( | 129 explicit MockLoadingPredictorObserver(ResourcePrefetchPredictor* predictor) |
| 205 ResourcePrefetchPredictor* predictor) | |
| 206 : TestObserver(predictor) {} | 130 : TestObserver(predictor) {} |
| 207 | 131 |
| 208 MOCK_METHOD2( | 132 MOCK_METHOD2( |
| 209 OnNavigationLearned, | 133 OnNavigationLearned, |
| 210 void(size_t url_visit_count, | 134 void(size_t url_visit_count, |
| 211 const ResourcePrefetchPredictor::PageRequestSummary& summary)); | 135 const ResourcePrefetchPredictor::PageRequestSummary& summary)); |
| 212 }; | 136 }; |
| 213 | 137 |
| 214 class ResourcePrefetchPredictorTest : public testing::Test { | 138 class ResourcePrefetchPredictorTest : public testing::Test { |
| 215 public: | 139 public: |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 236 URLRequestSummary CreateRedirectRequestSummary( | 160 URLRequestSummary CreateRedirectRequestSummary( |
| 237 SessionID::id_type session_id, | 161 SessionID::id_type session_id, |
| 238 const std::string& main_frame_url, | 162 const std::string& main_frame_url, |
| 239 const std::string& redirect_url) { | 163 const std::string& redirect_url) { |
| 240 URLRequestSummary summary = | 164 URLRequestSummary summary = |
| 241 CreateURLRequestSummary(session_id, main_frame_url); | 165 CreateURLRequestSummary(session_id, main_frame_url); |
| 242 summary.redirect_url = GURL(redirect_url); | 166 summary.redirect_url = GURL(redirect_url); |
| 243 return summary; | 167 return summary; |
| 244 } | 168 } |
| 245 | 169 |
| 246 std::unique_ptr<net::URLRequest> CreateURLRequest( | 170 std::unique_ptr<net::URLRequest> CreateURLRequest( |
|
Benoit L
2017/06/02 12:44:00
This is also duplicated in the tests, is it avoida
| |
| 247 const GURL& url, | 171 const GURL& url, |
| 248 net::RequestPriority priority, | 172 net::RequestPriority priority, |
| 249 content::ResourceType resource_type, | 173 content::ResourceType resource_type, |
| 250 bool is_main_frame) { | 174 bool is_main_frame) { |
| 251 std::unique_ptr<net::URLRequest> request = | 175 std::unique_ptr<net::URLRequest> request = |
| 252 url_request_context_.CreateRequest(url, priority, | 176 url_request_context_.CreateRequest(url, priority, |
| 253 &url_request_delegate_, | 177 &url_request_delegate_, |
| 254 TRAFFIC_ANNOTATION_FOR_TESTS); | 178 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 255 request->set_first_party_for_cookies(url); | 179 request->set_first_party_for_cookies(url); |
| 256 content::ResourceRequestInfo::AllocateForTesting( | 180 content::ResourceRequestInfo::AllocateForTesting( |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 611 predictor_->RecordURLResponse(resource1); | 535 predictor_->RecordURLResponse(resource1); |
| 612 URLRequestSummary resource2 = CreateURLRequestSummary( | 536 URLRequestSummary resource2 = CreateURLRequestSummary( |
| 613 1, "https://www.google.com", "https://google.com/script1.js", | 537 1, "https://www.google.com", "https://google.com/script1.js", |
| 614 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); | 538 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); |
| 615 predictor_->RecordURLResponse(resource2); | 539 predictor_->RecordURLResponse(resource2); |
| 616 URLRequestSummary resource3 = CreateURLRequestSummary( | 540 URLRequestSummary resource3 = CreateURLRequestSummary( |
| 617 1, "https://www.google.com", "https://google.com/script2.js", | 541 1, "https://www.google.com", "https://google.com/script2.js", |
| 618 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); | 542 content::RESOURCE_TYPE_SCRIPT, net::MEDIUM, "text/javascript", false); |
| 619 predictor_->RecordURLResponse(resource3); | 543 predictor_->RecordURLResponse(resource3); |
| 620 | 544 |
| 621 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); | 545 StrictMock<MockLoadingPredictorObserver> mock_observer(predictor_); |
| 622 EXPECT_CALL( | 546 EXPECT_CALL( |
| 623 mock_observer, | 547 mock_observer, |
| 624 OnNavigationLearned(kVisitCount, | 548 OnNavigationLearned(kVisitCount, |
| 625 CreatePageRequestSummary( | 549 CreatePageRequestSummary( |
| 626 "https://www.google.com", "http://www.google.com", | 550 "https://www.google.com", "http://www.google.com", |
| 627 {resource1, resource2, resource3}))); | 551 {resource1, resource2, resource3}))); |
| 628 | 552 |
| 629 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 553 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 630 profile_->BlockUntilHistoryProcessesPendingRequests(); | 554 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 631 | 555 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 710 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); | 634 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); |
| 711 redirected.redirect_url = GURL("http://dev.null.google.com/style.css"); | 635 redirected.redirect_url = GURL("http://dev.null.google.com/style.css"); |
| 712 | 636 |
| 713 predictor_->RecordURLRedirect(redirected); | 637 predictor_->RecordURLRedirect(redirected); |
| 714 redirected.is_no_store = true; | 638 redirected.is_no_store = true; |
| 715 redirected.request_url = redirected.redirect_url; | 639 redirected.request_url = redirected.redirect_url; |
| 716 redirected.redirect_url = GURL(); | 640 redirected.redirect_url = GURL(); |
| 717 | 641 |
| 718 predictor_->RecordURLResponse(redirected); | 642 predictor_->RecordURLResponse(redirected); |
| 719 | 643 |
| 720 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); | 644 StrictMock<MockLoadingPredictorObserver> mock_observer(predictor_); |
| 721 EXPECT_CALL(mock_observer, | 645 EXPECT_CALL(mock_observer, |
| 722 OnNavigationLearned( | 646 OnNavigationLearned( |
| 723 kVisitCount, CreatePageRequestSummary("http://www.google.com", | 647 kVisitCount, CreatePageRequestSummary("http://www.google.com", |
| 724 "http://www.google.com", | 648 "http://www.google.com", |
| 725 resources))); | 649 resources))); |
| 726 | 650 |
| 727 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 651 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 728 profile_->BlockUntilHistoryProcessesPendingRequests(); | 652 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 729 | 653 |
| 730 PrefetchData url_data = CreatePrefetchData("http://www.google.com/"); | 654 PrefetchData url_data = CreatePrefetchData("http://www.google.com/"); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 824 1, "http://www.google.com", "http://google.com/style2.css", | 748 1, "http://www.google.com", "http://google.com/style2.css", |
| 825 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true)); | 749 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true)); |
| 826 predictor_->RecordURLResponse(resources.back()); | 750 predictor_->RecordURLResponse(resources.back()); |
| 827 auto no_store = CreateURLRequestSummary( | 751 auto no_store = CreateURLRequestSummary( |
| 828 1, "http://www.google.com", | 752 1, "http://www.google.com", |
| 829 "http://static.google.com/style2-no-store.css", | 753 "http://static.google.com/style2-no-store.css", |
| 830 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); | 754 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", true); |
| 831 no_store.is_no_store = true; | 755 no_store.is_no_store = true; |
| 832 predictor_->RecordURLResponse(no_store); | 756 predictor_->RecordURLResponse(no_store); |
| 833 | 757 |
| 834 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); | 758 StrictMock<MockLoadingPredictorObserver> mock_observer(predictor_); |
| 835 EXPECT_CALL(mock_observer, | 759 EXPECT_CALL(mock_observer, |
| 836 OnNavigationLearned( | 760 OnNavigationLearned( |
| 837 kVisitCount, CreatePageRequestSummary("http://www.google.com", | 761 kVisitCount, CreatePageRequestSummary("http://www.google.com", |
| 838 "http://www.google.com", | 762 "http://www.google.com", |
| 839 resources))); | 763 resources))); |
| 840 | 764 |
| 841 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 765 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 842 profile_->BlockUntilHistoryProcessesPendingRequests(); | 766 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 843 | 767 |
| 844 PrefetchData url_data = CreatePrefetchData("http://www.google.com/"); | 768 PrefetchData url_data = CreatePrefetchData("http://www.google.com/"); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 926 | 850 |
| 927 URLRequestSummary resource1 = CreateURLRequestSummary( | 851 URLRequestSummary resource1 = CreateURLRequestSummary( |
| 928 1, "http://www.nike.com", "http://nike.com/style1.css", | 852 1, "http://www.nike.com", "http://nike.com/style1.css", |
| 929 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", false); | 853 content::RESOURCE_TYPE_STYLESHEET, net::MEDIUM, "text/css", false); |
| 930 predictor_->RecordURLResponse(resource1); | 854 predictor_->RecordURLResponse(resource1); |
| 931 URLRequestSummary resource2 = CreateURLRequestSummary( | 855 URLRequestSummary resource2 = CreateURLRequestSummary( |
| 932 1, "http://www.nike.com", "http://nike.com/image2.png", | 856 1, "http://www.nike.com", "http://nike.com/image2.png", |
| 933 content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false); | 857 content::RESOURCE_TYPE_IMAGE, net::MEDIUM, "image/png", false); |
| 934 predictor_->RecordURLResponse(resource2); | 858 predictor_->RecordURLResponse(resource2); |
| 935 | 859 |
| 936 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); | 860 StrictMock<MockLoadingPredictorObserver> mock_observer(predictor_); |
| 937 EXPECT_CALL(mock_observer, | 861 EXPECT_CALL(mock_observer, |
| 938 OnNavigationLearned( | 862 OnNavigationLearned( |
| 939 kVisitCount, CreatePageRequestSummary( | 863 kVisitCount, CreatePageRequestSummary( |
| 940 "http://www.nike.com", "http://www.nike.com", | 864 "http://www.nike.com", "http://www.nike.com", |
| 941 {resource1, resource2}))); | 865 {resource1, resource2}))); |
| 942 | 866 |
| 943 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); | 867 predictor_->RecordMainFrameLoadComplete(main_frame.navigation_id); |
| 944 profile_->BlockUntilHistoryProcessesPendingRequests(); | 868 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 945 | 869 |
| 946 PrefetchData url_data = CreatePrefetchData("http://www.nike.com/"); | 870 PrefetchData url_data = CreatePrefetchData("http://www.nike.com/"); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 996 EXPECT_EQ(1U, predictor_->inflight_navigations_.size()); | 920 EXPECT_EQ(1U, predictor_->inflight_navigations_.size()); |
| 997 | 921 |
| 998 URLRequestSummary fb2 = CreateRedirectRequestSummary( | 922 URLRequestSummary fb2 = CreateRedirectRequestSummary( |
| 999 1, "http://fb.com/google", "http://facebook.com/google"); | 923 1, "http://fb.com/google", "http://facebook.com/google"); |
| 1000 predictor_->RecordURLRedirect(fb2); | 924 predictor_->RecordURLRedirect(fb2); |
| 1001 URLRequestSummary fb3 = CreateRedirectRequestSummary( | 925 URLRequestSummary fb3 = CreateRedirectRequestSummary( |
| 1002 1, "http://facebook.com/google", "https://facebook.com/google"); | 926 1, "http://facebook.com/google", "https://facebook.com/google"); |
| 1003 predictor_->RecordURLRedirect(fb3); | 927 predictor_->RecordURLRedirect(fb3); |
| 1004 NavigationID fb_end = CreateNavigationID(1, "https://facebook.com/google"); | 928 NavigationID fb_end = CreateNavigationID(1, "https://facebook.com/google"); |
| 1005 | 929 |
| 1006 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); | 930 StrictMock<MockLoadingPredictorObserver> mock_observer(predictor_); |
| 1007 EXPECT_CALL( | 931 EXPECT_CALL( |
| 1008 mock_observer, | 932 mock_observer, |
| 1009 OnNavigationLearned(kVisitCount, CreatePageRequestSummary( | 933 OnNavigationLearned(kVisitCount, CreatePageRequestSummary( |
| 1010 "https://facebook.com/google", | 934 "https://facebook.com/google", |
| 1011 "http://fb.com/google", | 935 "http://fb.com/google", |
| 1012 std::vector<URLRequestSummary>()))); | 936 std::vector<URLRequestSummary>()))); |
| 1013 | 937 |
| 1014 predictor_->RecordMainFrameLoadComplete(fb_end); | 938 predictor_->RecordMainFrameLoadComplete(fb_end); |
| 1015 profile_->BlockUntilHistoryProcessesPendingRequests(); | 939 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 1016 | 940 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1046 EXPECT_EQ(1U, predictor_->inflight_navigations_.size()); | 970 EXPECT_EQ(1U, predictor_->inflight_navigations_.size()); |
| 1047 | 971 |
| 1048 URLRequestSummary fb2 = CreateRedirectRequestSummary( | 972 URLRequestSummary fb2 = CreateRedirectRequestSummary( |
| 1049 1, "http://fb.com/google", "http://facebook.com/google"); | 973 1, "http://fb.com/google", "http://facebook.com/google"); |
| 1050 predictor_->RecordURLRedirect(fb2); | 974 predictor_->RecordURLRedirect(fb2); |
| 1051 URLRequestSummary fb3 = CreateRedirectRequestSummary( | 975 URLRequestSummary fb3 = CreateRedirectRequestSummary( |
| 1052 1, "http://facebook.com/google", "https://facebook.com/google"); | 976 1, "http://facebook.com/google", "https://facebook.com/google"); |
| 1053 predictor_->RecordURLRedirect(fb3); | 977 predictor_->RecordURLRedirect(fb3); |
| 1054 NavigationID fb_end = CreateNavigationID(1, "https://facebook.com/google"); | 978 NavigationID fb_end = CreateNavigationID(1, "https://facebook.com/google"); |
| 1055 | 979 |
| 1056 StrictMock<MockResourcePrefetchPredictorObserver> mock_observer(predictor_); | 980 StrictMock<MockLoadingPredictorObserver> mock_observer(predictor_); |
| 1057 EXPECT_CALL( | 981 EXPECT_CALL( |
| 1058 mock_observer, | 982 mock_observer, |
| 1059 OnNavigationLearned(kVisitCount, CreatePageRequestSummary( | 983 OnNavigationLearned(kVisitCount, CreatePageRequestSummary( |
| 1060 "https://facebook.com/google", | 984 "https://facebook.com/google", |
| 1061 "http://fb.com/google", | 985 "http://fb.com/google", |
| 1062 std::vector<URLRequestSummary>()))); | 986 std::vector<URLRequestSummary>()))); |
| 1063 | 987 |
| 1064 predictor_->RecordMainFrameLoadComplete(fb_end); | 988 predictor_->RecordMainFrameLoadComplete(fb_end); |
| 1065 profile_->BlockUntilHistoryProcessesPendingRequests(); | 989 profile_->BlockUntilHistoryProcessesPendingRequests(); |
| 1066 | 990 |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1463 predictor_->inflight_navigations_[main_frame1.navigation_id] | 1387 predictor_->inflight_navigations_[main_frame1.navigation_id] |
| 1464 ->subresource_requests[0]); | 1388 ->subresource_requests[0]); |
| 1465 EXPECT_EQ(resource2, | 1389 EXPECT_EQ(resource2, |
| 1466 predictor_->inflight_navigations_[main_frame1.navigation_id] | 1390 predictor_->inflight_navigations_[main_frame1.navigation_id] |
| 1467 ->subresource_requests[1]); | 1391 ->subresource_requests[1]); |
| 1468 EXPECT_EQ(resource3, | 1392 EXPECT_EQ(resource3, |
| 1469 predictor_->inflight_navigations_[main_frame1.navigation_id] | 1393 predictor_->inflight_navigations_[main_frame1.navigation_id] |
| 1470 ->subresource_requests[2]); | 1394 ->subresource_requests[2]); |
| 1471 } | 1395 } |
| 1472 | 1396 |
| 1473 TEST_F(ResourcePrefetchPredictorTest, HandledResourceTypes) { | |
| 1474 EXPECT_TRUE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1475 content::RESOURCE_TYPE_STYLESHEET, "bogus/mime-type")); | |
| 1476 EXPECT_TRUE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1477 content::RESOURCE_TYPE_STYLESHEET, "")); | |
| 1478 EXPECT_FALSE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1479 content::RESOURCE_TYPE_WORKER, "text/css")); | |
| 1480 EXPECT_FALSE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1481 content::RESOURCE_TYPE_WORKER, "")); | |
| 1482 EXPECT_TRUE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1483 content::RESOURCE_TYPE_PREFETCH, "text/css")); | |
| 1484 EXPECT_FALSE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1485 content::RESOURCE_TYPE_PREFETCH, "bogus/mime-type")); | |
| 1486 EXPECT_FALSE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1487 content::RESOURCE_TYPE_PREFETCH, "")); | |
| 1488 EXPECT_TRUE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1489 content::RESOURCE_TYPE_PREFETCH, "application/font-woff")); | |
| 1490 EXPECT_TRUE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1491 content::RESOURCE_TYPE_PREFETCH, "font/woff2")); | |
| 1492 EXPECT_FALSE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1493 content::RESOURCE_TYPE_XHR, "")); | |
| 1494 EXPECT_FALSE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1495 content::RESOURCE_TYPE_XHR, "bogus/mime-type")); | |
| 1496 EXPECT_TRUE(ResourcePrefetchPredictor::IsHandledResourceType( | |
| 1497 content::RESOURCE_TYPE_XHR, "application/javascript")); | |
| 1498 } | |
| 1499 | |
| 1500 TEST_F(ResourcePrefetchPredictorTest, ShouldRecordRequestMainFrame) { | |
| 1501 std::unique_ptr<net::URLRequest> http_request = | |
| 1502 CreateURLRequest(GURL("http://www.google.com"), net::MEDIUM, | |
| 1503 content::RESOURCE_TYPE_IMAGE, true); | |
| 1504 EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordRequest( | |
| 1505 http_request.get(), content::RESOURCE_TYPE_MAIN_FRAME)); | |
| 1506 | |
| 1507 std::unique_ptr<net::URLRequest> https_request = | |
| 1508 CreateURLRequest(GURL("https://www.google.com"), net::MEDIUM, | |
| 1509 content::RESOURCE_TYPE_IMAGE, true); | |
| 1510 EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordRequest( | |
| 1511 https_request.get(), content::RESOURCE_TYPE_MAIN_FRAME)); | |
| 1512 | |
| 1513 std::unique_ptr<net::URLRequest> file_request = | |
| 1514 CreateURLRequest(GURL("file://www.google.com"), net::MEDIUM, | |
| 1515 content::RESOURCE_TYPE_IMAGE, true); | |
| 1516 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest( | |
| 1517 file_request.get(), content::RESOURCE_TYPE_MAIN_FRAME)); | |
| 1518 | |
| 1519 std::unique_ptr<net::URLRequest> https_request_with_port = | |
| 1520 CreateURLRequest(GURL("https://www.google.com:666"), net::MEDIUM, | |
| 1521 content::RESOURCE_TYPE_IMAGE, true); | |
| 1522 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest( | |
| 1523 https_request_with_port.get(), content::RESOURCE_TYPE_MAIN_FRAME)); | |
| 1524 } | |
| 1525 | |
| 1526 TEST_F(ResourcePrefetchPredictorTest, ShouldRecordRequestSubResource) { | |
| 1527 std::unique_ptr<net::URLRequest> http_request = | |
| 1528 CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM, | |
| 1529 content::RESOURCE_TYPE_IMAGE, false); | |
| 1530 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest( | |
| 1531 http_request.get(), content::RESOURCE_TYPE_IMAGE)); | |
| 1532 | |
| 1533 std::unique_ptr<net::URLRequest> https_request = | |
| 1534 CreateURLRequest(GURL("https://www.google.com/cat.png"), net::MEDIUM, | |
| 1535 content::RESOURCE_TYPE_IMAGE, false); | |
| 1536 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest( | |
| 1537 https_request.get(), content::RESOURCE_TYPE_IMAGE)); | |
| 1538 | |
| 1539 std::unique_ptr<net::URLRequest> file_request = | |
| 1540 CreateURLRequest(GURL("file://www.google.com/cat.png"), net::MEDIUM, | |
| 1541 content::RESOURCE_TYPE_IMAGE, false); | |
| 1542 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest( | |
| 1543 file_request.get(), content::RESOURCE_TYPE_IMAGE)); | |
| 1544 | |
| 1545 std::unique_ptr<net::URLRequest> https_request_with_port = | |
| 1546 CreateURLRequest(GURL("https://www.google.com:666/cat.png"), net::MEDIUM, | |
| 1547 content::RESOURCE_TYPE_IMAGE, false); | |
| 1548 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordRequest( | |
| 1549 https_request_with_port.get(), content::RESOURCE_TYPE_IMAGE)); | |
| 1550 } | |
| 1551 | |
| 1552 TEST_F(ResourcePrefetchPredictorTest, ShouldRecordResponseMainFrame) { | |
| 1553 net::HttpResponseInfo response_info; | |
| 1554 response_info.headers = MakeResponseHeaders(""); | |
| 1555 url_request_job_factory_.set_response_info(response_info); | |
| 1556 | |
| 1557 std::unique_ptr<net::URLRequest> http_request = | |
| 1558 CreateURLRequest(GURL("http://www.google.com"), net::MEDIUM, | |
| 1559 content::RESOURCE_TYPE_MAIN_FRAME, true); | |
| 1560 EXPECT_TRUE( | |
| 1561 ResourcePrefetchPredictor::ShouldRecordResponse(http_request.get())); | |
| 1562 | |
| 1563 std::unique_ptr<net::URLRequest> https_request = | |
| 1564 CreateURLRequest(GURL("https://www.google.com"), net::MEDIUM, | |
| 1565 content::RESOURCE_TYPE_MAIN_FRAME, true); | |
| 1566 EXPECT_TRUE( | |
| 1567 ResourcePrefetchPredictor::ShouldRecordResponse(https_request.get())); | |
| 1568 | |
| 1569 std::unique_ptr<net::URLRequest> file_request = | |
| 1570 CreateURLRequest(GURL("file://www.google.com"), net::MEDIUM, | |
| 1571 content::RESOURCE_TYPE_MAIN_FRAME, true); | |
| 1572 EXPECT_FALSE( | |
| 1573 ResourcePrefetchPredictor::ShouldRecordResponse(file_request.get())); | |
| 1574 | |
| 1575 std::unique_ptr<net::URLRequest> https_request_with_port = | |
| 1576 CreateURLRequest(GURL("https://www.google.com:666"), net::MEDIUM, | |
| 1577 content::RESOURCE_TYPE_MAIN_FRAME, true); | |
| 1578 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1579 https_request_with_port.get())); | |
| 1580 } | |
| 1581 | |
| 1582 TEST_F(ResourcePrefetchPredictorTest, ShouldRecordResponseSubresource) { | |
| 1583 net::HttpResponseInfo response_info; | |
| 1584 response_info.headers = | |
| 1585 MakeResponseHeaders("HTTP/1.1 200 OK\n\nSome: Headers\n"); | |
| 1586 response_info.was_cached = true; | |
| 1587 url_request_job_factory_.set_response_info(response_info); | |
| 1588 | |
| 1589 // Protocol. | |
| 1590 std::unique_ptr<net::URLRequest> http_image_request = | |
| 1591 CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM, | |
| 1592 content::RESOURCE_TYPE_IMAGE, true); | |
| 1593 EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1594 http_image_request.get())); | |
| 1595 | |
| 1596 std::unique_ptr<net::URLRequest> https_image_request = | |
| 1597 CreateURLRequest(GURL("https://www.google.com/cat.png"), net::MEDIUM, | |
| 1598 content::RESOURCE_TYPE_IMAGE, true); | |
| 1599 EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1600 https_image_request.get())); | |
| 1601 | |
| 1602 std::unique_ptr<net::URLRequest> https_image_request_with_port = | |
| 1603 CreateURLRequest(GURL("https://www.google.com:666/cat.png"), net::MEDIUM, | |
| 1604 content::RESOURCE_TYPE_IMAGE, true); | |
| 1605 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1606 https_image_request_with_port.get())); | |
| 1607 | |
| 1608 std::unique_ptr<net::URLRequest> file_image_request = | |
| 1609 CreateURLRequest(GURL("file://www.google.com/cat.png"), net::MEDIUM, | |
| 1610 content::RESOURCE_TYPE_IMAGE, true); | |
| 1611 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1612 file_image_request.get())); | |
| 1613 | |
| 1614 // ResourceType. | |
| 1615 std::unique_ptr<net::URLRequest> sub_frame_request = | |
| 1616 CreateURLRequest(GURL("http://www.google.com/frame.html"), net::MEDIUM, | |
| 1617 content::RESOURCE_TYPE_SUB_FRAME, true); | |
| 1618 EXPECT_FALSE( | |
| 1619 ResourcePrefetchPredictor::ShouldRecordResponse(sub_frame_request.get())); | |
| 1620 | |
| 1621 std::unique_ptr<net::URLRequest> font_request = | |
| 1622 CreateURLRequest(GURL("http://www.google.com/comic-sans-ms.woff"), | |
| 1623 net::MEDIUM, content::RESOURCE_TYPE_FONT_RESOURCE, true); | |
| 1624 EXPECT_TRUE( | |
| 1625 ResourcePrefetchPredictor::ShouldRecordResponse(font_request.get())); | |
| 1626 | |
| 1627 // From MIME Type. | |
| 1628 url_request_job_factory_.set_mime_type("image/png"); | |
| 1629 std::unique_ptr<net::URLRequest> prefetch_image_request = | |
| 1630 CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM, | |
| 1631 content::RESOURCE_TYPE_PREFETCH, true); | |
| 1632 EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1633 prefetch_image_request.get())); | |
| 1634 | |
| 1635 url_request_job_factory_.set_mime_type("image/my-wonderful-format"); | |
| 1636 std::unique_ptr<net::URLRequest> prefetch_unknown_image_request = | |
| 1637 CreateURLRequest(GURL("http://www.google.com/cat.png"), net::MEDIUM, | |
| 1638 content::RESOURCE_TYPE_PREFETCH, true); | |
| 1639 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1640 prefetch_unknown_image_request.get())); | |
| 1641 | |
| 1642 url_request_job_factory_.set_mime_type("font/woff"); | |
| 1643 std::unique_ptr<net::URLRequest> prefetch_font_request = | |
| 1644 CreateURLRequest(GURL("http://www.google.com/comic-sans-ms.woff"), | |
| 1645 net::MEDIUM, content::RESOURCE_TYPE_PREFETCH, true); | |
| 1646 EXPECT_TRUE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1647 prefetch_font_request.get())); | |
| 1648 | |
| 1649 url_request_job_factory_.set_mime_type("font/woff-woff"); | |
| 1650 std::unique_ptr<net::URLRequest> prefetch_unknown_font_request = | |
| 1651 CreateURLRequest(GURL("http://www.google.com/comic-sans-ms.woff"), | |
| 1652 net::MEDIUM, content::RESOURCE_TYPE_PREFETCH, true); | |
| 1653 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1654 prefetch_unknown_font_request.get())); | |
| 1655 | |
| 1656 // Not main frame. | |
| 1657 std::unique_ptr<net::URLRequest> font_request_sub_frame = CreateURLRequest( | |
| 1658 GURL("http://www.google.com/comic-sans-ms.woff"), net::MEDIUM, | |
| 1659 content::RESOURCE_TYPE_FONT_RESOURCE, false); | |
| 1660 EXPECT_FALSE(ResourcePrefetchPredictor::ShouldRecordResponse( | |
| 1661 font_request_sub_frame.get())); | |
| 1662 } | |
| 1663 | |
| 1664 TEST_F(ResourcePrefetchPredictorTest, SummarizeResponse) { | 1397 TEST_F(ResourcePrefetchPredictorTest, SummarizeResponse) { |
| 1665 net::HttpResponseInfo response_info; | 1398 net::HttpResponseInfo response_info; |
| 1666 response_info.headers = | 1399 response_info.headers = |
| 1667 MakeResponseHeaders("HTTP/1.1 200 OK\n\nSome: Headers\n"); | 1400 MakeResponseHeaders("HTTP/1.1 200 OK\n\nSome: Headers\n"); |
| 1668 response_info.was_cached = true; | 1401 response_info.was_cached = true; |
| 1669 url_request_job_factory_.set_response_info(response_info); | 1402 url_request_job_factory_.set_response_info(response_info); |
| 1670 | 1403 |
| 1671 GURL url("http://www.google.com/cat.png"); | 1404 GURL url("http://www.google.com/cat.png"); |
| 1672 std::unique_ptr<net::URLRequest> request = | 1405 std::unique_ptr<net::URLRequest> request = |
| 1673 CreateURLRequest(url, net::MEDIUM, content::RESOURCE_TYPE_IMAGE, true); | 1406 CreateURLRequest(url, net::MEDIUM, content::RESOURCE_TYPE_IMAGE, true); |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2100 ResourceData* resource3_rd = host_data.add_resources(); | 1833 ResourceData* resource3_rd = host_data.add_resources(); |
| 2101 InitializeResourceData(resource3_rd, "http://google.com/script2.js", | 1834 InitializeResourceData(resource3_rd, "http://google.com/script2.js", |
| 2102 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, | 1835 content::RESOURCE_TYPE_SCRIPT, 1, 0, 0, 3.0, |
| 2103 net::MEDIUM, false, false); | 1836 net::MEDIUM, false, false); |
| 2104 resource3_rd->set_before_first_contentful_paint(false); | 1837 resource3_rd->set_before_first_contentful_paint(false); |
| 2105 EXPECT_EQ(mock_tables_->host_resource_table_.data_, | 1838 EXPECT_EQ(mock_tables_->host_resource_table_.data_, |
| 2106 PrefetchDataMap({{host_data.primary_key(), host_data}})); | 1839 PrefetchDataMap({{host_data.primary_key(), host_data}})); |
| 2107 } | 1840 } |
| 2108 | 1841 |
| 2109 } // namespace predictors | 1842 } // namespace predictors |
| OLD | NEW |