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

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

Issue 1196193005: Allow preload scanners to be disabled by Settings. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@minimaster
Patch Set: add unit test Created 5 years, 6 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
« no previous file with comments | « Source/core/html/parser/HTMLPreloadScanner.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "config.h" 5 #include "config.h"
6 #include "core/html/parser/HTMLPreloadScanner.h" 6 #include "core/html/parser/HTMLPreloadScanner.h"
7 7
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/fetch/ClientHintsPreferences.h" 10 #include "core/fetch/ClientHintsPreferences.h"
11 #include "core/frame/Settings.h" 11 #include "core/frame/Settings.h"
12 #include "core/html/CrossOriginAttribute.h" 12 #include "core/html/CrossOriginAttribute.h"
13 #include "core/html/parser/HTMLParserOptions.h" 13 #include "core/html/parser/HTMLParserOptions.h"
14 #include "core/html/parser/HTMLResourcePreloader.h" 14 #include "core/html/parser/HTMLResourcePreloader.h"
15 #include "core/testing/DummyPageHolder.h" 15 #include "core/testing/DummyPageHolder.h"
16 #include <gtest/gtest.h> 16 #include <gtest/gtest.h>
17 17
18 namespace blink { 18 namespace blink {
19 19
20 typedef struct { 20 struct TestCase {
21 const char* baseURL; 21 const char* baseURL;
22 const char* inputHTML; 22 const char* inputHTML;
23 const char* preloadedURL; 23 const char* preloadedURL; // Or nullptr if no preload is expected.
24 const char* outputBaseURL; 24 const char* outputBaseURL;
25 Resource::Type type; 25 Resource::Type type;
26 int resourceWidth; 26 int resourceWidth;
27 ClientHintsPreferences preferences; 27 ClientHintsPreferences preferences;
28 } TestCase; 28 };
29 29
30 typedef struct { 30 struct PreconnectTestCase {
31 const char* baseURL; 31 const char* baseURL;
32 const char* inputHTML; 32 const char* inputHTML;
33 const char* preconnectedHost; 33 const char* preconnectedHost;
34 CrossOriginAttributeValue crossOrigin; 34 CrossOriginAttributeValue crossOrigin;
35 } PreconnectTestCase; 35 };
36 36
37 class MockHTMLResourcePreloader : public ResourcePreloader { 37 class MockHTMLResourcePreloader : public ResourcePreloader {
38 public: 38 public:
39 void preloadRequestVerification(Resource::Type type, const String& url, cons t String& baseURL, int width, const ClientHintsPreferences& preferences) 39 void preloadRequestVerification(Resource::Type type, const char* url, const char* baseURL, int width, const ClientHintsPreferences& preferences)
40 { 40 {
41 if (!url) {
42 EXPECT_FALSE(m_preloadRequest);
43 return;
44 }
41 EXPECT_FALSE(m_preloadRequest->isPreconnect()); 45 EXPECT_FALSE(m_preloadRequest->isPreconnect());
42 EXPECT_EQ(type, m_preloadRequest->resourceType()); 46 EXPECT_EQ(type, m_preloadRequest->resourceType());
43 EXPECT_STREQ(url.ascii().data(), m_preloadRequest->resourceURL().ascii() .data()); 47 EXPECT_STREQ(url, m_preloadRequest->resourceURL().ascii().data());
44 EXPECT_STREQ(baseURL.ascii().data(), m_preloadRequest->baseURL().string( ).ascii().data()); 48 EXPECT_STREQ(baseURL, m_preloadRequest->baseURL().string().ascii().data( ));
45 EXPECT_EQ(width, m_preloadRequest->resourceWidth()); 49 EXPECT_EQ(width, m_preloadRequest->resourceWidth());
46 EXPECT_EQ(preferences.shouldSendDPR(), m_preloadRequest->preferences().s houldSendDPR()); 50 EXPECT_EQ(preferences.shouldSendDPR(), m_preloadRequest->preferences().s houldSendDPR());
47 EXPECT_EQ(preferences.shouldSendResourceWidth(), m_preloadRequest->prefe rences().shouldSendResourceWidth()); 51 EXPECT_EQ(preferences.shouldSendResourceWidth(), m_preloadRequest->prefe rences().shouldSendResourceWidth());
48 EXPECT_EQ(preferences.shouldSendViewportWidth(), m_preloadRequest->prefe rences().shouldSendViewportWidth()); 52 EXPECT_EQ(preferences.shouldSendViewportWidth(), m_preloadRequest->prefe rences().shouldSendViewportWidth());
49 } 53 }
50 54
51 void preconnectRequestVerification(const String& host, CrossOriginAttributeV alue crossOrigin) 55 void preconnectRequestVerification(const String& host, CrossOriginAttributeV alue crossOrigin)
52 { 56 {
53 if (!host.isNull()) { 57 if (!host.isNull()) {
54 EXPECT_TRUE(m_preloadRequest->isPreconnect()); 58 EXPECT_TRUE(m_preloadRequest->isPreconnect());
55 EXPECT_STREQ(m_preloadRequest->resourceURL().ascii().data(), host.as cii().data()); 59 EXPECT_STREQ(m_preloadRequest->resourceURL().ascii().data(), host.as cii().data());
56 EXPECT_EQ(m_preloadRequest->isCORS(), crossOrigin != CrossOriginAttr ibuteNotSet); 60 EXPECT_EQ(m_preloadRequest->isCORS(), crossOrigin != CrossOriginAttr ibuteNotSet);
57 EXPECT_EQ(m_preloadRequest->isAllowCredentials(), crossOrigin == Cro ssOriginAttributeUseCredentials); 61 EXPECT_EQ(m_preloadRequest->isAllowCredentials(), crossOrigin == Cro ssOriginAttributeUseCredentials);
58 } 62 }
59 } 63 }
60 64
61 protected: 65 protected:
62 void preload(PassOwnPtr<PreloadRequest> preloadRequest) override 66 void preload(PassOwnPtr<PreloadRequest> preloadRequest) override
63 { 67 {
64 m_preloadRequest = preloadRequest; 68 m_preloadRequest = preloadRequest;
65 } 69 }
66 70
67 private: 71 private:
68 OwnPtr<PreloadRequest> m_preloadRequest; 72 OwnPtr<PreloadRequest> m_preloadRequest;
69 }; 73 };
70 74
71 class HTMLPreloadScannerTest : public testing::Test { 75 class HTMLPreloadScannerTest : public testing::Test {
72 protected: 76 protected:
77 enum ViewportState {
78 ViewportEnabled,
79 ViewportDisabled,
80 };
81
82 enum PreloadState {
83 PreloadEnabled,
84 PreloadDisabled,
85 };
86
73 HTMLPreloadScannerTest() 87 HTMLPreloadScannerTest()
74 : m_dummyPageHolder(DummyPageHolder::create()) 88 : m_dummyPageHolder(DummyPageHolder::create())
75 { 89 {
76 } 90 }
77 91
78 PassRefPtr<MediaValues> createMediaValues() 92 PassRefPtr<MediaValues> createMediaValues()
79 { 93 {
80 MediaValuesCached::MediaValuesCachedData data; 94 MediaValuesCached::MediaValuesCachedData data;
81 data.viewportWidth = 500; 95 data.viewportWidth = 500;
82 data.viewportHeight = 600; 96 data.viewportHeight = 600;
83 data.deviceWidth = 500; 97 data.deviceWidth = 500;
84 data.deviceHeight = 500; 98 data.deviceHeight = 500;
85 data.devicePixelRatio = 2.0; 99 data.devicePixelRatio = 2.0;
86 data.colorBitsPerComponent = 24; 100 data.colorBitsPerComponent = 24;
87 data.monochromeBitsPerComponent = 0; 101 data.monochromeBitsPerComponent = 0;
88 data.primaryPointerType = PointerTypeFine; 102 data.primaryPointerType = PointerTypeFine;
89 data.defaultFontSize = 16; 103 data.defaultFontSize = 16;
90 data.threeDEnabled = true; 104 data.threeDEnabled = true;
91 data.mediaType = MediaTypeNames::screen; 105 data.mediaType = MediaTypeNames::screen;
92 data.strictMode = true; 106 data.strictMode = true;
93 data.displayMode = WebDisplayModeBrowser; 107 data.displayMode = WebDisplayModeBrowser;
94 return MediaValuesCached::create(data); 108 return MediaValuesCached::create(data);
95 } 109 }
96 110
97 void runSetUp(bool viewportEnabled) 111 void runSetUp(ViewportState viewportState, PreloadState preloadState = Prelo adEnabled)
98 { 112 {
99 HTMLParserOptions options(&m_dummyPageHolder->document()); 113 HTMLParserOptions options(&m_dummyPageHolder->document());
100 KURL documentURL(ParsedURLString, "http://whatever.test/"); 114 KURL documentURL(ParsedURLString, "http://whatever.test/");
101 m_dummyPageHolder->document().settings()->setViewportEnabled(viewportEna bled); 115 m_dummyPageHolder->document().settings()->setViewportEnabled(viewportSta te == ViewportEnabled);
102 m_dummyPageHolder->document().settings()->setViewportMetaEnabled(viewpor tEnabled); 116 m_dummyPageHolder->document().settings()->setViewportMetaEnabled(viewpor tState == ViewportEnabled);
117 m_dummyPageHolder->document().settings()->setDoHtmlPreloadScanning(prelo adState == PreloadEnabled);
103 m_scanner = HTMLPreloadScanner::create(options, documentURL, CachedDocum entParameters::create(&m_dummyPageHolder->document(), createMediaValues())); 118 m_scanner = HTMLPreloadScanner::create(options, documentURL, CachedDocum entParameters::create(&m_dummyPageHolder->document(), createMediaValues()));
104 } 119 }
105 120
106 void SetUp() override 121 void SetUp() override
107 { 122 {
108 runSetUp(true); 123 runSetUp(ViewportEnabled);
109 } 124 }
110 125
111 void test(TestCase testCase) 126 void test(TestCase testCase)
112 { 127 {
113 MockHTMLResourcePreloader preloader; 128 MockHTMLResourcePreloader preloader;
114 KURL baseURL(ParsedURLString, testCase.baseURL); 129 KURL baseURL(ParsedURLString, testCase.baseURL);
115 m_scanner->appendToEnd(String(testCase.inputHTML)); 130 m_scanner->appendToEnd(String(testCase.inputHTML));
116 m_scanner->scan(&preloader, baseURL); 131 m_scanner->scan(&preloader, baseURL);
117 132
118 preloader.preloadRequestVerification(testCase.type, testCase.preloadedUR L, testCase.outputBaseURL, testCase.resourceWidth, testCase.preferences); 133 preloader.preloadRequestVerification(testCase.type, testCase.preloadedUR L, testCase.outputBaseURL, testCase.resourceWidth, testCase.preferences);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 {"http://example.test", "<img srcset='bla2.gif 160w, bla3.gif 250w, bla4 .gif 500w' src='bla.gif' sizes='50vw'>", "bla2.gif", "http://example.test/", Res ource::Image, 80}, 196 {"http://example.test", "<img srcset='bla2.gif 160w, bla3.gif 250w, bla4 .gif 500w' src='bla.gif' sizes='50vw'>", "bla2.gif", "http://example.test/", Res ource::Image, 80},
182 {"http://example.test", "<img srcset='bla2.gif 160w, bla3.gif 250w, bla4 .gif 500w' sizes='50vw' src='bla.gif'>", "bla2.gif", "http://example.test/", Res ource::Image, 80}, 197 {"http://example.test", "<img srcset='bla2.gif 160w, bla3.gif 250w, bla4 .gif 500w' sizes='50vw' src='bla.gif'>", "bla2.gif", "http://example.test/", Res ource::Image, 80},
183 }; 198 };
184 199
185 for (const auto& testCase : testCases) 200 for (const auto& testCase : testCases)
186 test(testCase); 201 test(testCase);
187 } 202 }
188 203
189 TEST_F(HTMLPreloadScannerTest, testImagesWithViewportDisabled) 204 TEST_F(HTMLPreloadScannerTest, testImagesWithViewportDisabled)
190 { 205 {
191 runSetUp(false); 206 runSetUp(ViewportDisabled);
192 TestCase testCases[] = { 207 TestCase testCases[] = {
193 {"http://example.test", "<meta name=viewport content='width=160'><img sr c='bla.gif'>", "bla.gif", "http://example.test/", Resource::Image, 0}, 208 {"http://example.test", "<meta name=viewport content='width=160'><img sr c='bla.gif'>", "bla.gif", "http://example.test/", Resource::Image, 0},
194 {"http://example.test", "<img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0}, 209 {"http://example.test", "<img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0},
195 {"http://example.test", "<img sizes='50vw' src='bla.gif'>", "bla.gif", " http://example.test/", Resource::Image, 250}, 210 {"http://example.test", "<img sizes='50vw' src='bla.gif'>", "bla.gif", " http://example.test/", Resource::Image, 250},
196 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 1x'>", "bla2.gif", "http://example.test/", Resource::Image, 250}, 211 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 1x'>", "bla2.gif", "http://example.test/", Resource::Image, 250},
197 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 0.5x'>", "bla.gif", "http://example.test/", Resource::Image, 250}, 212 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 0.5x'>", "bla.gif", "http://example.test/", Resource::Image, 250},
198 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 100w'>", "bla2.gif", "http://example.test/", Resource::Image, 250}, 213 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 100w'>", "bla2.gif", "http://example.test/", Resource::Image, 250},
199 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 100w, bla3.gif 250w'>", "bla3.gif", "http://example.test/", Resource::Image, 2 50}, 214 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 100w, bla3.gif 250w'>", "bla3.gif", "http://example.test/", Resource::Image, 2 50},
200 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 100w, bla3.gif 250w, bla4.gif 500w'>", "bla4.gif", "http://example.test/", Res ource::Image, 250}, 215 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 100w, bla3.gif 250w, bla4.gif 500w'>", "bla4.gif", "http://example.test/", Res ource::Image, 250},
201 {"http://example.test", "<img src='bla.gif' srcset='bla2.gif 100w, bla3. gif 250w, bla4.gif 500w' sizes='50vw'>", "bla4.gif", "http://example.test/", Res ource::Image, 250}, 216 {"http://example.test", "<img src='bla.gif' srcset='bla2.gif 100w, bla3. gif 250w, bla4.gif 500w' sizes='50vw'>", "bla4.gif", "http://example.test/", Res ource::Image, 250},
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 {"http://example.test", "<meta http-equiv='accept-ch' content='dpr \t'>< img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test /", Resource::Image, 0, dpr}, 254 {"http://example.test", "<meta http-equiv='accept-ch' content='dpr \t'>< img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test /", Resource::Image, 0, dpr},
240 {"http://example.test", "<meta http-equiv='accept-ch' content='bla,dpr \ t'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example. test/", Resource::Image, 0, dpr}, 255 {"http://example.test", "<meta http-equiv='accept-ch' content='bla,dpr \ t'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example. test/", Resource::Image, 0, dpr},
241 {"http://example.test", "<meta http-equiv='accept-ch' content=' width '><img sizes='100vw' srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "ht tp://example.test/", Resource::Image, 500, resourceWidth}, 256 {"http://example.test", "<meta http-equiv='accept-ch' content=' width '><img sizes='100vw' srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "ht tp://example.test/", Resource::Image, 500, resourceWidth},
242 {"http://example.test", "<meta http-equiv='accept-ch' content=' width , wutever'><img sizes='300px' srcset='bla.gif 320w, blabla.gif 640w'>", "blabla. gif", "http://example.test/", Resource::Image, 300, resourceWidth}, 257 {"http://example.test", "<meta http-equiv='accept-ch' content=' width , wutever'><img sizes='300px' srcset='bla.gif 320w, blabla.gif 640w'>", "blabla. gif", "http://example.test/", Resource::Image, 300, resourceWidth},
243 {"http://example.test", "<meta http-equiv='accept-ch' content=' viewpor t-width '><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http:// example.test/", Resource::Image, 0, viewportWidth}, 258 {"http://example.test", "<meta http-equiv='accept-ch' content=' viewpor t-width '><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http:// example.test/", Resource::Image, 0, viewportWidth},
244 {"http://example.test", "<meta http-equiv='accept-ch' content=' viewpor t-width , wutever'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0, viewportWidth}, 259 {"http://example.test", "<meta http-equiv='accept-ch' content=' viewpor t-width , wutever'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0, viewportWidth},
245 {"http://example.test", "<meta http-equiv='accept-ch' content=' viewpor t-width ,width, wutever, dpr \t'><img sizes='90vw' srcset='bla.gif 320w, blabla .gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 450, all}, 260 {"http://example.test", "<meta http-equiv='accept-ch' content=' viewpor t-width ,width, wutever, dpr \t'><img sizes='90vw' srcset='bla.gif 320w, blabla .gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 450, all},
246 }; 261 };
247 262
248 for (const auto& testCase : testCases) { 263 for (const auto& testCase : testCases) {
249 runSetUp(false); 264 runSetUp(ViewportDisabled);
250 test(testCase); 265 test(testCase);
251 } 266 }
252 } 267 }
253 268
254 TEST_F(HTMLPreloadScannerTest, testPreconnect) 269 TEST_F(HTMLPreloadScannerTest, testPreconnect)
255 { 270 {
256 PreconnectTestCase testCases[] = { 271 PreconnectTestCase testCases[] = {
257 {"http://example.test", "<link rel=preconnect href=http://example2.test> ", "http://example2.test", CrossOriginAttributeNotSet}, 272 {"http://example.test", "<link rel=preconnect href=http://example2.test> ", "http://example2.test", CrossOriginAttributeNotSet},
258 {"http://example.test", "<link rel=preconnect href=http://example2.test crossorigin=anonymous>", "http://example2.test", CrossOriginAttributeAnonymous}, 273 {"http://example.test", "<link rel=preconnect href=http://example2.test crossorigin=anonymous>", "http://example2.test", CrossOriginAttributeAnonymous},
259 {"http://example.test", "<link rel=preconnect href=http://example2.test crossorigin='use-credentials'>", "http://example2.test", CrossOriginAttributeUse Credentials}, 274 {"http://example.test", "<link rel=preconnect href=http://example2.test crossorigin='use-credentials'>", "http://example2.test", CrossOriginAttributeUse Credentials},
260 {"http://example.test", "<link rel=preconnected href=http://example2.tes t crossorigin='use-credentials'>", nullptr, CrossOriginAttributeNotSet}, 275 {"http://example.test", "<link rel=preconnected href=http://example2.tes t crossorigin='use-credentials'>", nullptr, CrossOriginAttributeNotSet},
261 {"http://example.test", "<link rel=preconnect href=ws://example2.test cr ossorigin='use-credentials'>", nullptr, CrossOriginAttributeNotSet}, 276 {"http://example.test", "<link rel=preconnect href=ws://example2.test cr ossorigin='use-credentials'>", nullptr, CrossOriginAttributeNotSet},
262 }; 277 };
263 278
264 for (const auto& testCase : testCases) 279 for (const auto& testCase : testCases)
265 test(testCase); 280 test(testCase);
266 } 281 }
267 282
283 TEST_F(HTMLPreloadScannerTest, testDisables)
284 {
285 runSetUp(ViewportEnabled, PreloadDisabled);
286
287 TestCase testCases[] = {
288 {"http://example.test", "<img src='bla.gif'>"},
289 };
290
291 for (const auto& testCase : testCases)
292 test(testCase);
293 }
294
268 } // namespace blink 295 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/html/parser/HTMLPreloadScanner.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698