| 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 "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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |