| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "core/html/parser/HTMLPreloadScanner.h" | 5 #include "core/html/parser/HTMLPreloadScanner.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include "core/MediaTypeNames.h" | 8 #include "core/MediaTypeNames.h" |
| 9 #include "core/css/MediaValuesCached.h" | 9 #include "core/css/MediaValuesCached.h" |
| 10 #include "core/frame/Settings.h" | 10 #include "core/frame/Settings.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 // shouldn't be checked (and no network request should be created). | 51 // shouldn't be checked (and no network request should be created). |
| 52 const char* expected_referrer; | 52 const char* expected_referrer; |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 struct NonceTestCase { | 55 struct NonceTestCase { |
| 56 const char* base_url; | 56 const char* base_url; |
| 57 const char* input_html; | 57 const char* input_html; |
| 58 const char* nonce; | 58 const char* nonce; |
| 59 }; | 59 }; |
| 60 | 60 |
| 61 struct ContextTestCase { |
| 62 const char* base_url; |
| 63 const char* input_html; |
| 64 const char* preloaded_url; // Or nullptr if no preload is expected. |
| 65 bool is_image_set; |
| 66 }; |
| 67 |
| 61 class MockHTMLResourcePreloader : public ResourcePreloader { | 68 class MockHTMLResourcePreloader : public ResourcePreloader { |
| 62 public: | 69 public: |
| 63 void PreloadRequestVerification(Resource::Type type, | 70 void PreloadRequestVerification(Resource::Type type, |
| 64 const char* url, | 71 const char* url, |
| 65 const char* base_url, | 72 const char* base_url, |
| 66 int width, | 73 int width, |
| 67 const ClientHintsPreferences& preferences) { | 74 const ClientHintsPreferences& preferences) { |
| 68 if (!url) { | 75 if (!url) { |
| 69 EXPECT_FALSE(preload_request_); | 76 EXPECT_FALSE(preload_request_); |
| 70 return; | 77 return; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 } | 127 } |
| 121 | 128 |
| 122 void NonceRequestVerification(const char* nonce) { | 129 void NonceRequestVerification(const char* nonce) { |
| 123 ASSERT_TRUE(preload_request_.get()); | 130 ASSERT_TRUE(preload_request_.get()); |
| 124 if (strlen(nonce)) | 131 if (strlen(nonce)) |
| 125 EXPECT_EQ(nonce, preload_request_->Nonce()); | 132 EXPECT_EQ(nonce, preload_request_->Nonce()); |
| 126 else | 133 else |
| 127 EXPECT_TRUE(preload_request_->Nonce().IsEmpty()); | 134 EXPECT_TRUE(preload_request_->Nonce().IsEmpty()); |
| 128 } | 135 } |
| 129 | 136 |
| 137 void ContextVerification(bool is_image_set) { |
| 138 ASSERT_TRUE(preload_request_.get()); |
| 139 EXPECT_EQ(preload_request_->IsImageSetForTestingOnly(), is_image_set); |
| 140 } |
| 141 |
| 130 protected: | 142 protected: |
| 131 void Preload(std::unique_ptr<PreloadRequest> preload_request, | 143 void Preload(std::unique_ptr<PreloadRequest> preload_request, |
| 132 const NetworkHintsInterface&) override { | 144 const NetworkHintsInterface&) override { |
| 133 preload_request_ = std::move(preload_request); | 145 preload_request_ = std::move(preload_request); |
| 134 } | 146 } |
| 135 | 147 |
| 136 private: | 148 private: |
| 137 std::unique_ptr<PreloadRequest> preload_request_; | 149 std::unique_ptr<PreloadRequest> preload_request_; |
| 138 }; | 150 }; |
| 139 | 151 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 void Test(NonceTestCase test_case) { | 251 void Test(NonceTestCase test_case) { |
| 240 MockHTMLResourcePreloader preloader; | 252 MockHTMLResourcePreloader preloader; |
| 241 KURL base_url(kParsedURLString, test_case.base_url); | 253 KURL base_url(kParsedURLString, test_case.base_url); |
| 242 scanner_->AppendToEnd(String(test_case.input_html)); | 254 scanner_->AppendToEnd(String(test_case.input_html)); |
| 243 PreloadRequestStream requests = scanner_->Scan(base_url, nullptr); | 255 PreloadRequestStream requests = scanner_->Scan(base_url, nullptr); |
| 244 preloader.TakeAndPreload(requests); | 256 preloader.TakeAndPreload(requests); |
| 245 | 257 |
| 246 preloader.NonceRequestVerification(test_case.nonce); | 258 preloader.NonceRequestVerification(test_case.nonce); |
| 247 } | 259 } |
| 248 | 260 |
| 261 void Test(ContextTestCase test_case) { |
| 262 MockHTMLResourcePreloader preloader; |
| 263 KURL base_url(kParsedURLString, test_case.base_url); |
| 264 scanner_->AppendToEnd(String(test_case.input_html)); |
| 265 PreloadRequestStream requests = scanner_->Scan(base_url, nullptr); |
| 266 preloader.TakeAndPreload(requests); |
| 267 |
| 268 preloader.ContextVerification(test_case.is_image_set); |
| 269 } |
| 270 |
| 249 private: | 271 private: |
| 250 std::unique_ptr<DummyPageHolder> dummy_page_holder_; | 272 std::unique_ptr<DummyPageHolder> dummy_page_holder_; |
| 251 std::unique_ptr<HTMLPreloadScanner> scanner_; | 273 std::unique_ptr<HTMLPreloadScanner> scanner_; |
| 252 }; | 274 }; |
| 253 | 275 |
| 254 TEST_F(HTMLPreloadScannerTest, testImages) { | 276 TEST_F(HTMLPreloadScannerTest, testImages) { |
| 255 TestCase test_cases[] = { | 277 TestCase test_cases[] = { |
| 256 {"http://example.test", "<img src='bla.gif'>", "bla.gif", | 278 {"http://example.test", "<img src='bla.gif'>", "bla.gif", |
| 257 "http://example.test/", Resource::kImage, 0}, | 279 "http://example.test/", Resource::kImage, 0}, |
| 258 {"http://example.test", "<img srcset='bla.gif 320w, blabla.gif 640w'>", | 280 {"http://example.test", "<img srcset='bla.gif 320w, blabla.gif 640w'>", |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 "<picture><source media='(max-width: 400px)' type='image/webp' " | 657 "<picture><source media='(max-width: 400px)' type='image/webp' " |
| 636 "srcset='srcset_bla.gif'><img sizes='50vw' srcset='bla.gif " | 658 "srcset='srcset_bla.gif'><img sizes='50vw' srcset='bla.gif " |
| 637 "500w'></picture>", | 659 "500w'></picture>", |
| 638 "bla.gif", "http://example.test/", Resource::kImage, 250}, | 660 "bla.gif", "http://example.test/", Resource::kImage, 250}, |
| 639 }; | 661 }; |
| 640 | 662 |
| 641 for (const auto& test_case : test_cases) | 663 for (const auto& test_case : test_cases) |
| 642 Test(test_case); | 664 Test(test_case); |
| 643 } | 665 } |
| 644 | 666 |
| 667 TEST_F(HTMLPreloadScannerTest, testContext) { |
| 668 ContextTestCase test_cases[] = { |
| 669 {"http://example.test", |
| 670 "<picture><source srcset='srcset_bla.gif'><img src='bla.gif'></picture>", |
| 671 "srcset_bla.gif", true}, |
| 672 {"http://example.test", "<img src='bla.gif'>", "bla.gif", false}, |
| 673 {"http://example.test", "<img srcset='bla.gif'>", "bla.gif", true}, |
| 674 }; |
| 675 |
| 676 for (const auto& test_case : test_cases) |
| 677 Test(test_case); |
| 678 } |
| 679 |
| 645 TEST_F(HTMLPreloadScannerTest, testReferrerPolicy) { | 680 TEST_F(HTMLPreloadScannerTest, testReferrerPolicy) { |
| 646 ReferrerPolicyTestCase test_cases[] = { | 681 ReferrerPolicyTestCase test_cases[] = { |
| 647 {"http://example.test", "<img src='bla.gif'/>", "bla.gif", | 682 {"http://example.test", "<img src='bla.gif'/>", "bla.gif", |
| 648 "http://example.test/", Resource::kImage, 0, kReferrerPolicyDefault}, | 683 "http://example.test/", Resource::kImage, 0, kReferrerPolicyDefault}, |
| 649 {"http://example.test", "<img referrerpolicy='origin' src='bla.gif'/>", | 684 {"http://example.test", "<img referrerpolicy='origin' src='bla.gif'/>", |
| 650 "bla.gif", "http://example.test/", Resource::kImage, 0, | 685 "bla.gif", "http://example.test/", Resource::kImage, 0, |
| 651 kReferrerPolicyOrigin, nullptr}, | 686 kReferrerPolicyOrigin, nullptr}, |
| 652 {"http://example.test", | 687 {"http://example.test", |
| 653 "<meta name='referrer' content='not-a-valid-policy'><img " | 688 "<meta name='referrer' content='not-a-valid-policy'><img " |
| 654 "src='bla.gif'/>", | 689 "src='bla.gif'/>", |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 "sheet.css", | 933 "sheet.css", |
| 899 "http://example.test/", | 934 "http://example.test/", |
| 900 Resource::kCSSStyleSheet, | 935 Resource::kCSSStyleSheet, |
| 901 0, | 936 0, |
| 902 kReferrerPolicyAlways, | 937 kReferrerPolicyAlways, |
| 903 "http://whatever.test/"}; | 938 "http://whatever.test/"}; |
| 904 Test(test_case); | 939 Test(test_case); |
| 905 } | 940 } |
| 906 | 941 |
| 907 } // namespace blink | 942 } // namespace blink |
| OLD | NEW |