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

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

Powered by Google App Engine
This is Rietveld 408576698