Index: third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp |
diff --git a/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp b/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp |
index 24018a15fce89156d35510abe0f1a0e277c2ea6e..2d8f8c5117a33b951f13f52a18cc8d852833525e 100644 |
--- a/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp |
+++ b/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp |
@@ -22,6 +22,8 @@ |
namespace blink { |
+namespace { |
+ |
class MockLinkLoaderClient final |
: public GarbageCollectedFinalized<MockLinkLoaderClient>, |
public LinkLoaderClient { |
@@ -81,182 +83,176 @@ class NetworkHintsMock : public NetworkHintsInterface { |
mutable bool m_isCrossOrigin = false; |
}; |
-TEST(LinkLoaderTest, Preload) { |
- struct TestCase { |
- const char* href; |
- const char* as; |
- const char* type; |
- const char* media; |
- const ReferrerPolicy referrerPolicy; |
- const ResourceLoadPriority priority; |
- const WebURLRequest::RequestContext context; |
- const bool linkLoaderShouldLoadValue; |
- const bool expectingLoad; |
- const ReferrerPolicy expectedReferrerPolicy; |
- } cases[] = { |
- {"http://example.test/cat.jpg", "image", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityLow, WebURLRequest::RequestContextImage, true, true, |
- ReferrerPolicyDefault}, |
- {"http://example.test/cat.js", "script", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityHigh, WebURLRequest::RequestContextScript, true, |
- true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.css", "style", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityVeryHigh, WebURLRequest::RequestContextStyle, true, |
- true, ReferrerPolicyDefault}, |
- // TODO(yoav): It doesn't seem like the audio context is ever used. That |
- // should probably be fixed (or we can consolidate audio and video). |
- {"http://example.test/cat.wav", "audio", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, |
- ReferrerPolicyDefault}, |
- {"http://example.test/cat.mp4", "video", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, |
- ReferrerPolicyDefault}, |
- {"http://example.test/cat.vtt", "track", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityLow, WebURLRequest::RequestContextTrack, true, true, |
- ReferrerPolicyDefault}, |
- {"http://example.test/cat.woff", "font", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityHigh, WebURLRequest::RequestContextFont, true, true, |
- ReferrerPolicyDefault}, |
- // TODO(yoav): subresource should be *very* low priority (rather than |
- // low). |
- {"http://example.test/cat.empty", "", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityHigh, WebURLRequest::RequestContextSubresource, true, |
- true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.blob", "blabla", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, false, |
- false, ReferrerPolicyDefault}, |
- {"bla://example.test/cat.gif", "image", "", "", ReferrerPolicyDefault, |
- ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, |
- false, false, ReferrerPolicyDefault}, |
- // MIME type tests |
- {"http://example.test/cat.webp", "image", "image/webp", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextImage, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.svg", "image", "image/svg+xml", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextImage, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.jxr", "image", "image/jxr", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
- WebURLRequest::RequestContextImage, false, false, ReferrerPolicyDefault}, |
- {"http://example.test/cat.js", "script", "text/javascript", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityHigh, |
- WebURLRequest::RequestContextScript, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.js", "script", "text/coffeescript", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
- WebURLRequest::RequestContextScript, false, false, |
- ReferrerPolicyDefault}, |
- {"http://example.test/cat.css", "style", "text/css", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityVeryHigh, |
- WebURLRequest::RequestContextStyle, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.css", "style", "text/sass", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
- WebURLRequest::RequestContextStyle, false, false, ReferrerPolicyDefault}, |
- {"http://example.test/cat.wav", "audio", "audio/wav", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextVideo, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.wav", "audio", "audio/mp57", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
- WebURLRequest::RequestContextVideo, false, false, ReferrerPolicyDefault}, |
- {"http://example.test/cat.webm", "video", "video/webm", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextVideo, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.mp199", "video", "video/mp199", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
- WebURLRequest::RequestContextVideo, false, false, ReferrerPolicyDefault}, |
- {"http://example.test/cat.vtt", "track", "text/vtt", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextTrack, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.vtt", "track", "text/subtitlething", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
- WebURLRequest::RequestContextTrack, false, false, ReferrerPolicyDefault}, |
- {"http://example.test/cat.woff", "font", "font/woff2", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityHigh, |
- WebURLRequest::RequestContextFont, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.woff", "font", "font/woff84", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
- WebURLRequest::RequestContextFont, false, false, ReferrerPolicyDefault}, |
- {"http://example.test/cat.empty", "", "foo/bar", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityHigh, |
- WebURLRequest::RequestContextSubresource, true, true, |
- ReferrerPolicyDefault}, |
- {"http://example.test/cat.blob", "blabla", "foo/bar", "", |
- ReferrerPolicyDefault, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextSubresource, false, false, |
- ReferrerPolicyDefault}, |
- // Media tests |
- {"http://example.test/cat.gif", "image", "image/gif", |
- "(max-width: 600px)", ReferrerPolicyDefault, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextImage, true, true, ReferrerPolicyDefault}, |
- {"http://example.test/cat.gif", "image", "image/gif", |
- "(max-width: 400px)", ReferrerPolicyDefault, |
- ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, true, |
- false, ReferrerPolicyDefault}, |
- {"http://example.test/cat.gif", "image", "image/gif", |
- "(max-width: 600px)", ReferrerPolicyDefault, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextImage, false, false, ReferrerPolicyDefault}, |
- // Referrer Policy |
- {"http://example.test/cat.gif", "image", "image/gif", "", |
- ReferrerPolicyOrigin, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextImage, true, true, ReferrerPolicyOrigin}, |
- {"http://example.test/cat.gif", "image", "image/gif", "", |
- ReferrerPolicyOriginWhenCrossOrigin, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextImage, true, true, |
- ReferrerPolicyOriginWhenCrossOrigin}, |
- {"http://example.test/cat.gif", "image", "image/gif", "", |
- ReferrerPolicyNever, ResourceLoadPriorityLow, |
- WebURLRequest::RequestContextImage, true, true, ReferrerPolicyNever}, |
- }; |
+struct PreloadTestParams { |
+ const char* href; |
+ const char* as; |
+ const char* type; |
+ const char* media; |
+ const ReferrerPolicy referrerPolicy; |
+ const ResourceLoadPriority priority; |
+ const WebURLRequest::RequestContext context; |
+ const bool linkLoaderShouldLoadValue; |
+ const bool expectingLoad; |
+ const ReferrerPolicy expectedReferrerPolicy; |
+}; |
- // Test the cases with a single header |
- for (const auto& testCase : cases) { |
- std::unique_ptr<DummyPageHolder> dummyPageHolder = |
- DummyPageHolder::create(IntSize(500, 500)); |
- dummyPageHolder->frame().settings()->setScriptEnabled(true); |
- Persistent<MockLinkLoaderClient> loaderClient = |
- MockLinkLoaderClient::create(testCase.linkLoaderShouldLoadValue); |
- LinkLoader* loader = LinkLoader::create(loaderClient.get()); |
- KURL hrefURL = KURL(KURL(), testCase.href); |
- URLTestHelpers::registerMockedErrorURLLoad(hrefURL); |
- loader->loadLink(LinkRelAttribute("preload"), CrossOriginAttributeNotSet, |
- testCase.type, testCase.as, testCase.media, |
- testCase.referrerPolicy, hrefURL, |
- dummyPageHolder->document(), NetworkHintsMock()); |
- ASSERT_TRUE(dummyPageHolder->document().fetcher()); |
- HeapListHashSet<Member<Resource>>* preloads = |
- dummyPageHolder->document().fetcher()->preloads(); |
- if (testCase.expectingLoad) { |
- if (!preloads) { |
- fprintf(stderr, "Unexpected result %s %s %s\n", testCase.href, |
- testCase.as, testCase.type); |
- } |
- EXPECT_TRUE(preloads); |
- } else { |
- EXPECT_FALSE(preloads); |
- } |
- if (preloads) { |
- if (testCase.priority == ResourceLoadPriorityUnresolved) { |
- EXPECT_EQ(0u, preloads->size()); |
- } else { |
- EXPECT_EQ(1u, preloads->size()); |
- if (preloads->size() > 0) { |
- Resource* resource = preloads->begin().get()->get(); |
- EXPECT_EQ(testCase.priority, resource->resourceRequest().priority()); |
- EXPECT_EQ(testCase.context, |
- resource->resourceRequest().requestContext()); |
- if (testCase.expectedReferrerPolicy != ReferrerPolicyDefault) { |
- EXPECT_EQ(testCase.expectedReferrerPolicy, |
- resource->resourceRequest().getReferrerPolicy()); |
- } |
- } |
- } |
- dummyPageHolder->document().fetcher()->clearPreloads(); |
- } |
+class LinkLoaderPreloadTest |
+ : public ::testing::TestWithParam<PreloadTestParams> { |
+ public: |
+ ~LinkLoaderPreloadTest() { |
Platform::current() |
->getURLLoaderMockFactory() |
->unregisterAllURLsAndClearMemoryCache(); |
} |
+}; |
+ |
+TEST_P(LinkLoaderPreloadTest, Preload) { |
+ const auto& testCase = GetParam(); |
+ std::unique_ptr<DummyPageHolder> dummyPageHolder = |
+ DummyPageHolder::create(IntSize(500, 500)); |
+ ResourceFetcher* fetcher = dummyPageHolder->document().fetcher(); |
+ ASSERT_TRUE(fetcher); |
+ dummyPageHolder->frame().settings()->setScriptEnabled(true); |
+ Persistent<MockLinkLoaderClient> loaderClient = |
+ MockLinkLoaderClient::create(testCase.linkLoaderShouldLoadValue); |
+ LinkLoader* loader = LinkLoader::create(loaderClient.get()); |
+ KURL hrefURL = KURL(KURL(), testCase.href); |
+ URLTestHelpers::registerMockedErrorURLLoad(hrefURL); |
+ loader->loadLink(LinkRelAttribute("preload"), CrossOriginAttributeNotSet, |
+ testCase.type, testCase.as, testCase.media, |
+ testCase.referrerPolicy, hrefURL, |
+ dummyPageHolder->document(), NetworkHintsMock()); |
+ if (testCase.expectingLoad && |
+ testCase.priority != ResourceLoadPriorityUnresolved) { |
+ ASSERT_EQ(1, fetcher->countPreloads()); |
+ Resource* resource = loader->linkPreloadedResourceForTesting(); |
+ ASSERT_NE(resource, nullptr); |
+ EXPECT_TRUE(fetcher->containsAsPreloadForTesting(resource)); |
+ EXPECT_EQ(testCase.priority, resource->resourceRequest().priority()); |
+ EXPECT_EQ(testCase.context, resource->resourceRequest().requestContext()); |
+ if (testCase.expectedReferrerPolicy != ReferrerPolicyDefault) { |
+ EXPECT_EQ(testCase.expectedReferrerPolicy, |
+ resource->resourceRequest().getReferrerPolicy()); |
+ } |
+ } else { |
+ ASSERT_EQ(0, fetcher->countPreloads()); |
+ } |
} |
+constexpr PreloadTestParams kPreloadTestParams[] = { |
+ {"http://example.test/cat.jpg", "image", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityLow, WebURLRequest::RequestContextImage, true, true, |
+ ReferrerPolicyDefault}, |
+ {"http://example.test/cat.js", "script", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityHigh, WebURLRequest::RequestContextScript, true, true, |
+ ReferrerPolicyDefault}, |
+ {"http://example.test/cat.css", "style", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityVeryHigh, WebURLRequest::RequestContextStyle, true, |
+ true, ReferrerPolicyDefault}, |
+ // TODO(yoav): It doesn't seem like the audio context is ever used. That |
+ // should probably be fixed (or we can consolidate audio and video). |
+ {"http://example.test/cat.wav", "audio", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, |
+ ReferrerPolicyDefault}, |
+ {"http://example.test/cat.mp4", "video", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, |
+ ReferrerPolicyDefault}, |
+ {"http://example.test/cat.vtt", "track", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityLow, WebURLRequest::RequestContextTrack, true, true, |
+ ReferrerPolicyDefault}, |
+ {"http://example.test/cat.woff", "font", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityHigh, WebURLRequest::RequestContextFont, true, true, |
+ ReferrerPolicyDefault}, |
+ // TODO(yoav): subresource should be *very* low priority (rather than |
+ // low). |
+ {"http://example.test/cat.empty", "", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityHigh, WebURLRequest::RequestContextSubresource, true, |
+ true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.blob", "blabla", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityLow, WebURLRequest::RequestContextSubresource, false, |
+ false, ReferrerPolicyDefault}, |
+ {"bla://example.test/cat.gif", "image", "", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityUnresolved, WebURLRequest::RequestContextImage, false, |
+ false, ReferrerPolicyDefault}, |
+ // MIME type tests |
+ {"http://example.test/cat.webp", "image", "image/webp", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextImage, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.svg", "image", "image/svg+xml", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextImage, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.jxr", "image", "image/jxr", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
+ WebURLRequest::RequestContextImage, false, false, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.js", "script", "text/javascript", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityHigh, |
+ WebURLRequest::RequestContextScript, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.js", "script", "text/coffeescript", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
+ WebURLRequest::RequestContextScript, false, false, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.css", "style", "text/css", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityVeryHigh, |
+ WebURLRequest::RequestContextStyle, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.css", "style", "text/sass", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
+ WebURLRequest::RequestContextStyle, false, false, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.wav", "audio", "audio/wav", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextVideo, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.wav", "audio", "audio/mp57", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
+ WebURLRequest::RequestContextVideo, false, false, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.webm", "video", "video/webm", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextVideo, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.mp199", "video", "video/mp199", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
+ WebURLRequest::RequestContextVideo, false, false, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.vtt", "track", "text/vtt", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextTrack, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.vtt", "track", "text/subtitlething", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
+ WebURLRequest::RequestContextTrack, false, false, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.woff", "font", "font/woff2", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityHigh, |
+ WebURLRequest::RequestContextFont, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.woff", "font", "font/woff84", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
+ WebURLRequest::RequestContextFont, false, false, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.empty", "", "foo/bar", "", ReferrerPolicyDefault, |
+ ResourceLoadPriorityHigh, WebURLRequest::RequestContextSubresource, true, |
+ true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.blob", "blabla", "foo/bar", "", |
+ ReferrerPolicyDefault, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextSubresource, false, false, |
+ ReferrerPolicyDefault}, |
+ // Media tests |
+ {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 600px)", |
+ ReferrerPolicyDefault, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextImage, true, true, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 400px)", |
+ ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, |
+ WebURLRequest::RequestContextImage, true, false, ReferrerPolicyDefault}, |
+ {"http://example.test/cat.gif", "image", "image/gif", "(max-width: 600px)", |
+ ReferrerPolicyDefault, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextImage, false, false, ReferrerPolicyDefault}, |
+ // Referrer Policy |
+ {"http://example.test/cat.gif", "image", "image/gif", "", |
+ ReferrerPolicyOrigin, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextImage, true, true, ReferrerPolicyOrigin}, |
+ {"http://example.test/cat.gif", "image", "image/gif", "", |
+ ReferrerPolicyOriginWhenCrossOrigin, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextImage, true, true, |
+ ReferrerPolicyOriginWhenCrossOrigin}, |
+ {"http://example.test/cat.gif", "image", "image/gif", "", |
+ ReferrerPolicyNever, ResourceLoadPriorityLow, |
+ WebURLRequest::RequestContextImage, true, true, ReferrerPolicyNever}}; |
+ |
+INSTANTIATE_TEST_CASE_P(LinkLoaderPreloadTest, |
+ LinkLoaderPreloadTest, |
+ ::testing::ValuesIn(kPreloadTestParams)); |
+ |
TEST(LinkLoaderTest, Prefetch) { |
struct TestCase { |
const char* href; |
@@ -377,4 +373,6 @@ TEST(LinkLoaderTest, Preconnect) { |
} |
} |
+} // namespace |
+ |
} // namespace blink |