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

Side by Side Diff: third_party/WebKit/Source/core/html/parser/HTMLPreloadScannerTest.cpp

Issue 2808663003: Explicitly tell the preload request where to take the referrer from (Closed)
Patch Set: comment Created 3 years, 8 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 unified diff | Download patch
OLDNEW
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 "core/MediaTypeNames.h" 8 #include "core/MediaTypeNames.h"
8 #include "core/css/MediaValuesCached.h" 9 #include "core/css/MediaValuesCached.h"
9 #include "core/frame/Settings.h" 10 #include "core/frame/Settings.h"
10 #include "core/html/CrossOriginAttribute.h" 11 #include "core/html/CrossOriginAttribute.h"
11 #include "core/html/parser/HTMLParserOptions.h" 12 #include "core/html/parser/HTMLParserOptions.h"
12 #include "core/html/parser/HTMLResourcePreloader.h" 13 #include "core/html/parser/HTMLResourcePreloader.h"
13 #include "core/html/parser/PreloadRequest.h" 14 #include "core/html/parser/PreloadRequest.h"
14 #include "core/testing/DummyPageHolder.h" 15 #include "core/testing/DummyPageHolder.h"
16 #include "platform/exported/WrappedResourceResponse.h"
15 #include "platform/loader/fetch/ClientHintsPreferences.h" 17 #include "platform/loader/fetch/ClientHintsPreferences.h"
18 #include "platform/weborigin/SecurityOrigin.h"
19 #include "public/platform/Platform.h"
20 #include "public/platform/WebURLLoaderMockFactory.h"
16 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
17 #include <memory>
18 22
19 namespace blink { 23 namespace blink {
20 24
21 struct TestCase { 25 struct TestCase {
22 const char* base_url; 26 const char* base_url;
23 const char* input_html; 27 const char* input_html;
24 const char* preloaded_url; // Or nullptr if no preload is expected. 28 const char* preloaded_url; // Or nullptr if no preload is expected.
25 const char* output_base_url; 29 const char* output_base_url;
26 Resource::Type type; 30 Resource::Type type;
27 int resource_width; 31 int resource_width;
28 ClientHintsPreferences preferences; 32 ClientHintsPreferences preferences;
29 }; 33 };
30 34
31 struct PreconnectTestCase { 35 struct PreconnectTestCase {
32 const char* base_url; 36 const char* base_url;
33 const char* input_html; 37 const char* input_html;
34 const char* preconnected_host; 38 const char* preconnected_host;
35 CrossOriginAttributeValue cross_origin; 39 CrossOriginAttributeValue cross_origin;
36 }; 40 };
37 41
38 struct ReferrerPolicyTestCase { 42 struct ReferrerPolicyTestCase {
39 const char* base_url; 43 const char* base_url;
40 const char* input_html; 44 const char* input_html;
41 const char* preloaded_url; // Or nullptr if no preload is expected. 45 const char* preloaded_url; // Or nullptr if no preload is expected.
42 const char* output_base_url; 46 const char* output_base_url;
43 Resource::Type type; 47 Resource::Type type;
44 int resource_width; 48 int resource_width;
45 ReferrerPolicy referrer_policy; 49 ReferrerPolicy referrer_policy;
50 // Expected referrer header of the preload request, or nullptr if the header
51 // shouldn't be checked (and no network request should be created).
52 const char* expected_referrer;
46 }; 53 };
47 54
48 struct NonceTestCase { 55 struct NonceTestCase {
49 const char* base_url; 56 const char* base_url;
50 const char* input_html; 57 const char* input_html;
51 const char* nonce; 58 const char* nonce;
52 }; 59 };
53 60
54 class MockHTMLResourcePreloader : public ResourcePreloader { 61 class MockHTMLResourcePreloader : public ResourcePreloader {
55 public: 62 public:
(...skipping 26 matching lines...) Expand all
82 void PreloadRequestVerification(Resource::Type type, 89 void PreloadRequestVerification(Resource::Type type,
83 const char* url, 90 const char* url,
84 const char* base_url, 91 const char* base_url,
85 int width, 92 int width,
86 ReferrerPolicy referrer_policy) { 93 ReferrerPolicy referrer_policy) {
87 PreloadRequestVerification(type, url, base_url, width, 94 PreloadRequestVerification(type, url, base_url, width,
88 ClientHintsPreferences()); 95 ClientHintsPreferences());
89 EXPECT_EQ(referrer_policy, preload_request_->GetReferrerPolicy()); 96 EXPECT_EQ(referrer_policy, preload_request_->GetReferrerPolicy());
90 } 97 }
91 98
99 void PreloadRequestVerification(Resource::Type type,
100 const char* url,
101 const char* base_url,
102 int width,
103 ReferrerPolicy referrer_policy,
104 Document* document,
105 const char* expected_referrer) {
106 PreloadRequestVerification(type, url, base_url, width, referrer_policy);
107 Resource* resource = preload_request_->Start(document);
108 ASSERT_TRUE(resource);
109 EXPECT_EQ(expected_referrer, resource->GetResourceRequest().HttpReferrer());
110 }
111
92 void PreconnectRequestVerification(const String& host, 112 void PreconnectRequestVerification(const String& host,
93 CrossOriginAttributeValue cross_origin) { 113 CrossOriginAttributeValue cross_origin) {
94 if (!host.IsNull()) { 114 if (!host.IsNull()) {
95 EXPECT_TRUE(preload_request_->IsPreconnect()); 115 EXPECT_TRUE(preload_request_->IsPreconnect());
96 EXPECT_STREQ(preload_request_->ResourceURL().Ascii().Data(), 116 EXPECT_STREQ(preload_request_->ResourceURL().Ascii().Data(),
97 host.Ascii().Data()); 117 host.Ascii().Data());
98 EXPECT_EQ(preload_request_->CrossOrigin(), cross_origin); 118 EXPECT_EQ(preload_request_->CrossOrigin(), cross_origin);
99 } 119 }
100 } 120 }
101 121
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 data.display_mode = kWebDisplayModeBrowser; 168 data.display_mode = kWebDisplayModeBrowser;
149 return data; 169 return data;
150 } 170 }
151 171
152 void RunSetUp( 172 void RunSetUp(
153 ViewportState viewport_state, 173 ViewportState viewport_state,
154 PreloadState preload_state = kPreloadEnabled, 174 PreloadState preload_state = kPreloadEnabled,
155 ReferrerPolicy document_referrer_policy = kReferrerPolicyDefault) { 175 ReferrerPolicy document_referrer_policy = kReferrerPolicyDefault) {
156 HTMLParserOptions options(&dummy_page_holder_->GetDocument()); 176 HTMLParserOptions options(&dummy_page_holder_->GetDocument());
157 KURL document_url(kParsedURLString, "http://whatever.test/"); 177 KURL document_url(kParsedURLString, "http://whatever.test/");
178 dummy_page_holder_->GetDocument().SetURL(document_url);
179 dummy_page_holder_->GetDocument().SetSecurityOrigin(
180 SecurityOrigin::Create(document_url));
158 dummy_page_holder_->GetDocument().GetSettings()->SetViewportEnabled( 181 dummy_page_holder_->GetDocument().GetSettings()->SetViewportEnabled(
159 viewport_state == kViewportEnabled); 182 viewport_state == kViewportEnabled);
160 dummy_page_holder_->GetDocument().GetSettings()->SetViewportMetaEnabled( 183 dummy_page_holder_->GetDocument().GetSettings()->SetViewportMetaEnabled(
161 viewport_state == kViewportEnabled); 184 viewport_state == kViewportEnabled);
162 dummy_page_holder_->GetDocument().GetSettings()->SetDoHtmlPreloadScanning( 185 dummy_page_holder_->GetDocument().GetSettings()->SetDoHtmlPreloadScanning(
163 preload_state == kPreloadEnabled); 186 preload_state == kPreloadEnabled);
164 dummy_page_holder_->GetDocument().SetReferrerPolicy( 187 dummy_page_holder_->GetDocument().SetReferrerPolicy(
165 document_referrer_policy); 188 document_referrer_policy);
166 scanner_ = HTMLPreloadScanner::Create( 189 scanner_ = HTMLPreloadScanner::Create(
167 options, document_url, 190 options, document_url,
(...skipping 25 matching lines...) Expand all
193 test_case.cross_origin); 216 test_case.cross_origin);
194 } 217 }
195 218
196 void Test(ReferrerPolicyTestCase test_case) { 219 void Test(ReferrerPolicyTestCase test_case) {
197 MockHTMLResourcePreloader preloader; 220 MockHTMLResourcePreloader preloader;
198 KURL base_url(kParsedURLString, test_case.base_url); 221 KURL base_url(kParsedURLString, test_case.base_url);
199 scanner_->AppendToEnd(String(test_case.input_html)); 222 scanner_->AppendToEnd(String(test_case.input_html));
200 PreloadRequestStream requests = scanner_->Scan(base_url, nullptr); 223 PreloadRequestStream requests = scanner_->Scan(base_url, nullptr);
201 preloader.TakeAndPreload(requests); 224 preloader.TakeAndPreload(requests);
202 225
203 preloader.PreloadRequestVerification( 226 if (test_case.expected_referrer) {
204 test_case.type, test_case.preloaded_url, test_case.output_base_url, 227 preloader.PreloadRequestVerification(
205 test_case.resource_width, test_case.referrer_policy); 228 test_case.type, test_case.preloaded_url, test_case.output_base_url,
229 test_case.resource_width, test_case.referrer_policy,
230 &dummy_page_holder_->GetDocument(), test_case.expected_referrer);
231 } else {
232 preloader.PreloadRequestVerification(
233 test_case.type, test_case.preloaded_url, test_case.output_base_url,
234 test_case.resource_width, test_case.referrer_policy);
235 }
206 } 236 }
207 237
208 void Test(NonceTestCase test_case) { 238 void Test(NonceTestCase test_case) {
209 MockHTMLResourcePreloader preloader; 239 MockHTMLResourcePreloader preloader;
210 KURL base_url(kParsedURLString, test_case.base_url); 240 KURL base_url(kParsedURLString, test_case.base_url);
211 scanner_->AppendToEnd(String(test_case.input_html)); 241 scanner_->AppendToEnd(String(test_case.input_html));
212 PreloadRequestStream requests = scanner_->Scan(base_url, nullptr); 242 PreloadRequestStream requests = scanner_->Scan(base_url, nullptr);
213 preloader.TakeAndPreload(requests); 243 preloader.TakeAndPreload(requests);
214 244
215 preloader.NonceRequestVerification(test_case.nonce); 245 preloader.NonceRequestVerification(test_case.nonce);
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 for (const auto& test_case : test_cases) 640 for (const auto& test_case : test_cases)
611 Test(test_case); 641 Test(test_case);
612 } 642 }
613 643
614 TEST_F(HTMLPreloadScannerTest, testReferrerPolicy) { 644 TEST_F(HTMLPreloadScannerTest, testReferrerPolicy) {
615 ReferrerPolicyTestCase test_cases[] = { 645 ReferrerPolicyTestCase test_cases[] = {
616 {"http://example.test", "<img src='bla.gif'/>", "bla.gif", 646 {"http://example.test", "<img src='bla.gif'/>", "bla.gif",
617 "http://example.test/", Resource::kImage, 0, kReferrerPolicyDefault}, 647 "http://example.test/", Resource::kImage, 0, kReferrerPolicyDefault},
618 {"http://example.test", "<img referrerpolicy='origin' src='bla.gif'/>", 648 {"http://example.test", "<img referrerpolicy='origin' src='bla.gif'/>",
619 "bla.gif", "http://example.test/", Resource::kImage, 0, 649 "bla.gif", "http://example.test/", Resource::kImage, 0,
620 kReferrerPolicyOrigin}, 650 kReferrerPolicyOrigin, nullptr},
621 {"http://example.test", 651 {"http://example.test",
622 "<meta name='referrer' content='not-a-valid-policy'><img " 652 "<meta name='referrer' content='not-a-valid-policy'><img "
623 "src='bla.gif'/>", 653 "src='bla.gif'/>",
624 "bla.gif", "http://example.test/", Resource::kImage, 0, 654 "bla.gif", "http://example.test/", Resource::kImage, 0,
625 kReferrerPolicyDefault}, 655 kReferrerPolicyDefault, nullptr},
626 {"http://example.test", 656 {"http://example.test",
627 "<img referrerpolicy='origin' referrerpolicy='origin-when-cross-origin' " 657 "<img referrerpolicy='origin' referrerpolicy='origin-when-cross-origin' "
628 "src='bla.gif'/>", 658 "src='bla.gif'/>",
629 "bla.gif", "http://example.test/", Resource::kImage, 0, 659 "bla.gif", "http://example.test/", Resource::kImage, 0,
630 kReferrerPolicyOrigin}, 660 kReferrerPolicyOrigin, nullptr},
631 {"http://example.test", 661 {"http://example.test",
632 "<img referrerpolicy='not-a-valid-policy' src='bla.gif'/>", "bla.gif", 662 "<img referrerpolicy='not-a-valid-policy' src='bla.gif'/>", "bla.gif",
633 "http://example.test/", Resource::kImage, 0, kReferrerPolicyDefault}, 663 "http://example.test/", Resource::kImage, 0, kReferrerPolicyDefault,
664 nullptr},
665 {"http://example.test",
666 "<link rel=preload as=image referrerpolicy='origin-when-cross-origin' "
667 "href='bla.gif'/>",
668 "bla.gif", "http://example.test/", Resource::kImage, 0,
669 kReferrerPolicyOriginWhenCrossOrigin, nullptr},
670 {"http://example.test",
671 "<link rel='stylesheet' href='sheet.css' type='text/css'>", "sheet.css",
672 "http://example.test/", Resource::kCSSStyleSheet, 0,
673 kReferrerPolicyDefault, nullptr},
674 {"http://example.test",
675 "<link rel=preload as=image referrerpolicy='origin' "
676 "referrerpolicy='origin-when-cross-origin' href='bla.gif'/>",
677 "bla.gif", "http://example.test/", Resource::kImage, 0,
678 kReferrerPolicyOrigin, nullptr},
634 {"http://example.test", 679 {"http://example.test",
635 "<meta name='referrer' content='no-referrer'><img " 680 "<meta name='referrer' content='no-referrer'><img "
636 "referrerpolicy='origin' src='bla.gif'/>", 681 "referrerpolicy='origin' src='bla.gif'/>",
637 "bla.gif", "http://example.test/", Resource::kImage, 0, 682 "bla.gif", "http://example.test/", Resource::kImage, 0,
638 kReferrerPolicyOrigin}, 683 kReferrerPolicyOrigin, nullptr},
639 {"http://example.test",
640 "<link rel=preload as=image referrerpolicy='origin-when-cross-origin' "
641 "href='bla.gif'/>",
642 "bla.gif", "http://example.test/", Resource::kImage, 0,
643 kReferrerPolicyOriginWhenCrossOrigin},
644 {"http://example.test",
645 "<link rel=preload as=image referrerpolicy='origin' "
646 "referrerpolicy='origin-when-cross-origin' href='bla.gif'/>",
647 "bla.gif", "http://example.test/", Resource::kImage, 0,
648 kReferrerPolicyOrigin},
649 // The scanner's state is not reset between test cases, so all subsequent 684 // The scanner's state is not reset between test cases, so all subsequent
650 // test cases have a document referrer policy of no-referrer. 685 // test cases have a document referrer policy of no-referrer.
651 {"http://example.test", 686 {"http://example.test",
652 "<link rel=preload as=image referrerpolicy='not-a-valid-policy' " 687 "<link rel=preload as=image referrerpolicy='not-a-valid-policy' "
653 "href='bla.gif'/>", 688 "href='bla.gif'/>",
654 "bla.gif", "http://example.test/", Resource::kImage, 0, 689 "bla.gif", "http://example.test/", Resource::kImage, 0,
655 kReferrerPolicyNever}, 690 kReferrerPolicyNever, nullptr},
656 {"http://example.test", 691 {"http://example.test",
657 "<img referrerpolicy='not-a-valid-policy' src='bla.gif'/>", "bla.gif", 692 "<img referrerpolicy='not-a-valid-policy' src='bla.gif'/>", "bla.gif",
658 "http://example.test/", Resource::kImage, 0, kReferrerPolicyNever}, 693 "http://example.test/", Resource::kImage, 0, kReferrerPolicyNever,
694 nullptr},
659 {"http://example.test", "<img src='bla.gif'/>", "bla.gif", 695 {"http://example.test", "<img src='bla.gif'/>", "bla.gif",
660 "http://example.test/", Resource::kImage, 0, kReferrerPolicyNever}}; 696 "http://example.test/", Resource::kImage, 0, kReferrerPolicyNever,
697 nullptr}};
661 698
662 for (const auto& test_case : test_cases) 699 for (const auto& test_case : test_cases)
663 Test(test_case); 700 Test(test_case);
664 } 701 }
665 702
666 TEST_F(HTMLPreloadScannerTest, testNonce) { 703 TEST_F(HTMLPreloadScannerTest, testNonce) {
667 NonceTestCase test_cases[] = { 704 NonceTestCase test_cases[] = {
668 {"http://example.test", "<script src='/script'></script>", ""}, 705 {"http://example.test", "<script src='/script'></script>", ""},
669 {"http://example.test", "<script src='/script' nonce=''></script>", ""}, 706 {"http://example.test", "<script src='/script' nonce=''></script>", ""},
670 {"http://example.test", "<script src='/script' nonce='abc'></script>", 707 {"http://example.test", "<script src='/script' nonce='abc'></script>",
(...skipping 20 matching lines...) Expand all
691 Test(test_case); 728 Test(test_case);
692 } 729 }
693 } 730 }
694 731
695 // Tests that a document-level referrer policy (e.g. one set by HTTP header) is 732 // Tests that a document-level referrer policy (e.g. one set by HTTP header) is
696 // applied for preload requests. 733 // applied for preload requests.
697 TEST_F(HTMLPreloadScannerTest, testReferrerPolicyOnDocument) { 734 TEST_F(HTMLPreloadScannerTest, testReferrerPolicyOnDocument) {
698 RunSetUp(kViewportEnabled, kPreloadEnabled, kReferrerPolicyOrigin); 735 RunSetUp(kViewportEnabled, kPreloadEnabled, kReferrerPolicyOrigin);
699 ReferrerPolicyTestCase test_cases[] = { 736 ReferrerPolicyTestCase test_cases[] = {
700 {"http://example.test", "<img src='blah.gif'/>", "blah.gif", 737 {"http://example.test", "<img src='blah.gif'/>", "blah.gif",
701 "http://example.test/", Resource::kImage, 0, kReferrerPolicyOrigin}, 738 "http://example.test/", Resource::kImage, 0, kReferrerPolicyOrigin,
739 nullptr},
702 {"http://example.test", "<style>@import url('blah.css');</style>", 740 {"http://example.test", "<style>@import url('blah.css');</style>",
703 "blah.css", "http://example.test/", Resource::kCSSStyleSheet, 0, 741 "blah.css", "http://example.test/", Resource::kCSSStyleSheet, 0,
704 kReferrerPolicyOrigin}, 742 kReferrerPolicyOrigin, nullptr},
705 // Tests that a meta-delivered referrer policy with an unrecognized policy 743 // Tests that a meta-delivered referrer policy with an unrecognized policy
706 // value does not override the document's referrer policy. 744 // value does not override the document's referrer policy.
707 {"http://example.test", 745 {"http://example.test",
708 "<meta name='referrer' content='not-a-valid-policy'><img " 746 "<meta name='referrer' content='not-a-valid-policy'><img "
709 "src='bla.gif'/>", 747 "src='bla.gif'/>",
710 "bla.gif", "http://example.test/", Resource::kImage, 0, 748 "bla.gif", "http://example.test/", Resource::kImage, 0,
711 kReferrerPolicyOrigin}, 749 kReferrerPolicyOrigin, nullptr},
712 // Tests that a meta-delivered referrer policy with a valid policy value 750 // Tests that a meta-delivered referrer policy with a valid policy value
713 // does override the document's referrer policy. 751 // does override the document's referrer policy.
714 {"http://example.test", 752 {"http://example.test",
715 "<meta name='referrer' content='unsafe-url'><img src='bla.gif'/>", 753 "<meta name='referrer' content='unsafe-url'><img src='bla.gif'/>",
716 "bla.gif", "http://example.test/", Resource::kImage, 0, 754 "bla.gif", "http://example.test/", Resource::kImage, 0,
717 kReferrerPolicyAlways}, 755 kReferrerPolicyAlways, nullptr},
718 }; 756 };
719 757
720 for (const auto& test_case : test_cases) 758 for (const auto& test_case : test_cases)
721 Test(test_case); 759 Test(test_case);
722 } 760 }
723 761
724 TEST_F(HTMLPreloadScannerTest, testLinkRelPreload) { 762 TEST_F(HTMLPreloadScannerTest, testLinkRelPreload) {
725 TestCase test_cases[] = { 763 TestCase test_cases[] = {
726 {"http://example.test", "<link rel=preload href=bla>", "bla", 764 {"http://example.test", "<link rel=preload href=bla>", "bla",
727 "http://example.test/", Resource::kRaw, 0}, 765 "http://example.test/", Resource::kRaw, 0},
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 {"http://example.test", "<link rel=preload href=bla as=SCRIPT>", "bla", 877 {"http://example.test", "<link rel=preload href=bla as=SCRIPT>", "bla",
840 "http://example.test/", Resource::kScript, 0}, 878 "http://example.test/", Resource::kScript, 0},
841 {"http://example.test", "<link rel=preload href=bla as=fOnT>", "bla", 879 {"http://example.test", "<link rel=preload href=bla as=fOnT>", "bla",
842 "http://example.test/", Resource::kFont, 0}, 880 "http://example.test/", Resource::kFont, 0},
843 }; 881 };
844 882
845 for (const auto& test_case : test_cases) 883 for (const auto& test_case : test_cases)
846 Test(test_case); 884 Test(test_case);
847 } 885 }
848 886
887 TEST_F(HTMLPreloadScannerTest, ReferrerHeader) {
888 RunSetUp(kViewportEnabled, kPreloadEnabled, kReferrerPolicyAlways);
889
890 KURL preload_url(kParsedURLString, "http://example.test/sheet.css");
891 Platform::Current()->GetURLLoaderMockFactory()->RegisterURL(
892 preload_url, WrappedResourceResponse(ResourceResponse()), "");
893
894 ReferrerPolicyTestCase test_case = {
895 "http://example.test",
896 "<link rel='stylesheet' href='sheet.css' type='text/css'>",
897 "sheet.css",
898 "http://example.test/",
899 Resource::kCSSStyleSheet,
900 0,
901 kReferrerPolicyAlways,
902 "http://whatever.test/"};
903 Test(test_case);
904 }
905
849 } // namespace blink 906 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698