Index: third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp |
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp |
index 6b3047689356e9cb628ceb566dd552ee86c0ff1a..13638fc15d3dec5318932fa6d19a7db4b7227d27 100644 |
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp |
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp |
@@ -493,18 +493,22 @@ TEST_F(ResourceFetcherTest, PreloadResourceTwice) { |
FetchParameters fetch_params_original = |
FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
+ fetch_params_original.SetLinkPreload(true); |
Resource* resource = MockResource::Fetch(fetch_params_original, fetcher); |
ASSERT_TRUE(resource); |
+ EXPECT_TRUE(resource->IsLinkPreload()); |
+ EXPECT_TRUE(fetcher->ContainsAsPreload(resource)); |
Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
- fetcher->PreloadStarted(resource); |
FetchParameters fetch_params = |
FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
+ fetch_params.SetLinkPreload(true); |
Resource* new_resource = MockResource::Fetch(fetch_params, fetcher); |
EXPECT_EQ(resource, new_resource); |
- fetcher->PreloadStarted(resource); |
+ EXPECT_TRUE(fetcher->ContainsAsPreload(resource)); |
fetcher->ClearPreloads(ResourceFetcher::kClearAllPreloads); |
+ EXPECT_FALSE(fetcher->ContainsAsPreload(resource)); |
EXPECT_FALSE(GetMemoryCache()->Contains(resource)); |
EXPECT_FALSE(resource->IsPreloaded()); |
} |
@@ -523,7 +527,6 @@ TEST_F(ResourceFetcherTest, LinkPreloadResourceAndUse) { |
ASSERT_TRUE(resource); |
EXPECT_TRUE(resource->IsLinkPreload()); |
Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
- fetcher->PreloadStarted(resource); |
// Resource created by preload scanner |
FetchParameters fetch_params_preload_scanner = |
@@ -532,7 +535,6 @@ TEST_F(ResourceFetcherTest, LinkPreloadResourceAndUse) { |
MockResource::Fetch(fetch_params_preload_scanner, fetcher); |
EXPECT_EQ(resource, preload_scanner_resource); |
EXPECT_FALSE(resource->IsLinkPreload()); |
- fetcher->PreloadStarted(resource); |
// Resource created by parser |
FetchParameters fetch_params = |
@@ -548,7 +550,29 @@ TEST_F(ResourceFetcherTest, LinkPreloadResourceAndUse) { |
EXPECT_FALSE(resource->IsPreloaded()); |
} |
-TEST_F(ResourceFetcherTest, LinkPreloadResourceMultipleFetchersAndUse) { |
+TEST_F(ResourceFetcherTest, PreloadMatchWithBypassingCache) { |
+ ResourceFetcher* fetcher = ResourceFetcher::Create(Context()); |
+ KURL url(kParsedURLString, "http://127.0.0.1:8000/foo.png"); |
+ RegisterMockedURLLoad(url); |
+ |
+ FetchParameters fetch_params_original = |
+ FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
+ fetch_params_original.SetLinkPreload(true); |
+ Resource* resource = MockResource::Fetch(fetch_params_original, fetcher); |
+ ASSERT_TRUE(resource); |
+ EXPECT_TRUE(resource->IsLinkPreload()); |
+ Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
+ |
+ FetchParameters fetch_params_second = |
+ FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
+ fetch_params_second.MutableResourceRequest().SetCachePolicy( |
+ WebCachePolicy::kBypassingCache); |
+ Resource* second_resource = MockResource::Fetch(fetch_params_second, fetcher); |
+ EXPECT_EQ(resource, second_resource); |
+ EXPECT_FALSE(resource->IsLinkPreload()); |
+} |
+ |
+TEST_F(ResourceFetcherTest, CrossFramePreloadMatchIsNotAllowed) { |
ResourceFetcher* fetcher = ResourceFetcher::Create(Context()); |
ResourceFetcher* fetcher2 = ResourceFetcher::Create(Context()); |
@@ -562,73 +586,116 @@ TEST_F(ResourceFetcherTest, LinkPreloadResourceMultipleFetchersAndUse) { |
ASSERT_TRUE(resource); |
EXPECT_TRUE(resource->IsLinkPreload()); |
Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
- fetcher->PreloadStarted(resource); |
FetchParameters fetch_params_second = |
FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
- fetch_params_second.SetLinkPreload(true); |
+ fetch_params_second.MutableResourceRequest().SetCachePolicy( |
+ WebCachePolicy::kBypassingCache); |
Resource* second_resource = |
MockResource::Fetch(fetch_params_second, fetcher2); |
- ASSERT_TRUE(second_resource); |
- EXPECT_TRUE(second_resource->IsLinkPreload()); |
- Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
- fetcher2->PreloadStarted(second_resource); |
- // Link rel preload scanner |
- FetchParameters fetch_params_link_preload_scanner = |
- FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
- fetch_params_link_preload_scanner.SetLinkPreload(true); |
- Resource* link_preload_scanner_resource = |
- MockResource::Fetch(fetch_params_link_preload_scanner, fetcher); |
- EXPECT_EQ(resource, link_preload_scanner_resource); |
+ EXPECT_NE(resource, second_resource); |
EXPECT_TRUE(resource->IsLinkPreload()); |
- fetcher->PreloadStarted(resource); |
+} |
- // Resource created by preload scanner |
- FetchParameters fetch_params_preload_scanner = |
- FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
- Resource* preload_scanner_resource = |
- MockResource::Fetch(fetch_params_preload_scanner, fetcher); |
- EXPECT_EQ(resource, preload_scanner_resource); |
- EXPECT_FALSE(resource->IsLinkPreload()); |
- fetcher->PreloadStarted(resource); |
+TEST_F(ResourceFetcherTest, RepetitiveLinkPreloadShouldBeMerged) { |
+ ResourceFetcher* fetcher = ResourceFetcher::Create(Context()); |
- // Resource created by preload scanner on the second fetcher |
- FetchParameters fetch_params_preload_scanner2 = |
- FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
- Resource* preload_scanner_resource2 = |
- MockResource::Fetch(fetch_params_preload_scanner2, fetcher2); |
- EXPECT_EQ(resource, preload_scanner_resource2); |
- EXPECT_FALSE(resource->IsLinkPreload()); |
- fetcher2->PreloadStarted(resource); |
+ KURL url(kParsedURLString, "http://127.0.0.1:8000/foo.png"); |
+ RegisterMockedURLLoad(url); |
- // Resource created by parser |
- FetchParameters fetch_params = |
+ FetchParameters fetch_params_for_request = |
FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
- Resource* new_resource = MockResource::Fetch(fetch_params, fetcher); |
- Persistent<MockResourceClient> client = new MockResourceClient(new_resource); |
- EXPECT_EQ(resource, new_resource); |
- EXPECT_FALSE(resource->IsLinkPreload()); |
+ FetchParameters fetch_params_for_preload = fetch_params_for_request; |
+ fetch_params_for_preload.SetLinkPreload(true); |
- // Resource created by parser on the second fetcher |
- FetchParameters fetch_params2 = |
+ Resource* resource1 = MockResource::Fetch(fetch_params_for_preload, fetcher); |
+ ASSERT_TRUE(resource1); |
+ EXPECT_TRUE(resource1->IsPreloaded()); |
+ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); |
+ Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
+ |
+ // The second preload fetch returnes the first preload. |
+ Resource* resource2 = MockResource::Fetch(fetch_params_for_preload, fetcher); |
+ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); |
+ EXPECT_TRUE(resource1->IsPreloaded()); |
+ EXPECT_EQ(resource1, resource2); |
+ |
+ // preload matching |
+ Resource* resource3 = MockResource::Fetch(fetch_params_for_request, fetcher); |
+ EXPECT_EQ(resource1, resource3); |
+ EXPECT_FALSE(fetcher->ContainsAsPreload(resource1)); |
+ EXPECT_FALSE(resource1->IsPreloaded()); |
+} |
+ |
+TEST_F(ResourceFetcherTest, RepetitiveSpeculativePreloadShouldBeMerged) { |
+ ResourceFetcher* fetcher = ResourceFetcher::Create(Context()); |
+ |
+ KURL url(kParsedURLString, "http://127.0.0.1:8000/foo.png"); |
+ RegisterMockedURLLoad(url); |
+ |
+ FetchParameters fetch_params_for_request = |
FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
- Resource* new_resource2 = MockResource::Fetch(fetch_params, fetcher2); |
- Persistent<MockResourceClient> client2 = |
- new MockResourceClient(new_resource2); |
- EXPECT_EQ(resource, new_resource2); |
- EXPECT_FALSE(resource->IsLinkPreload()); |
+ FetchParameters fetch_params_for_preload = fetch_params_for_request; |
+ fetch_params_for_preload.SetSpeculativePreloadType( |
+ FetchParameters::SpeculativePreloadType::kInDocument); |
+ |
+ Resource* resource1 = MockResource::Fetch(fetch_params_for_preload, fetcher); |
+ ASSERT_TRUE(resource1); |
+ EXPECT_TRUE(resource1->IsPreloaded()); |
+ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); |
+ Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
- // DCL reached on first fetcher |
- EXPECT_TRUE(resource->IsPreloaded()); |
- fetcher->ClearPreloads(ResourceFetcher::kClearSpeculativeMarkupPreloads); |
- EXPECT_TRUE(GetMemoryCache()->Contains(resource)); |
- EXPECT_TRUE(resource->IsPreloaded()); |
+ // The second preload fetch returnes the first preload. |
+ Resource* resource2 = MockResource::Fetch(fetch_params_for_preload, fetcher); |
+ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); |
+ EXPECT_TRUE(resource1->IsPreloaded()); |
+ EXPECT_EQ(resource1, resource2); |
+ |
+ // preload matching |
+ Resource* resource3 = MockResource::Fetch(fetch_params_for_request, fetcher); |
+ EXPECT_EQ(resource1, resource3); |
+ EXPECT_FALSE(fetcher->ContainsAsPreload(resource1)); |
+ EXPECT_FALSE(resource1->IsPreloaded()); |
+} |
- // DCL reached on second fetcher |
- fetcher2->ClearPreloads(ResourceFetcher::kClearSpeculativeMarkupPreloads); |
- EXPECT_TRUE(GetMemoryCache()->Contains(resource)); |
- EXPECT_FALSE(resource->IsPreloaded()); |
+TEST_F(ResourceFetcherTest, SpeculativePreloadShouldBePromotedToLinkePreload) { |
+ ResourceFetcher* fetcher = ResourceFetcher::Create(Context()); |
+ |
+ KURL url(kParsedURLString, "http://127.0.0.1:8000/foo.png"); |
+ RegisterMockedURLLoad(url); |
+ |
+ FetchParameters fetch_params_for_request = |
+ FetchParameters(ResourceRequest(url), FetchInitiatorInfo()); |
+ FetchParameters fetch_params_for_speculative_preload = |
+ fetch_params_for_request; |
+ fetch_params_for_speculative_preload.SetSpeculativePreloadType( |
+ FetchParameters::SpeculativePreloadType::kInDocument); |
+ FetchParameters fetch_params_for_link_preload = fetch_params_for_request; |
+ fetch_params_for_link_preload.SetLinkPreload(true); |
+ |
+ Resource* resource1 = |
+ MockResource::Fetch(fetch_params_for_speculative_preload, fetcher); |
+ ASSERT_TRUE(resource1); |
+ EXPECT_TRUE(resource1->IsPreloaded()); |
+ EXPECT_FALSE(resource1->IsLinkPreload()); |
+ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); |
+ Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
+ |
+ // The second preload fetch returnes the first preload. |
+ Resource* resource2 = |
+ MockResource::Fetch(fetch_params_for_link_preload, fetcher); |
+ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); |
+ EXPECT_TRUE(resource1->IsPreloaded()); |
+ EXPECT_TRUE(resource1->IsLinkPreload()); |
+ EXPECT_EQ(resource1, resource2); |
+ |
+ // preload matching |
+ Resource* resource3 = MockResource::Fetch(fetch_params_for_request, fetcher); |
+ EXPECT_EQ(resource1, resource3); |
+ EXPECT_FALSE(fetcher->ContainsAsPreload(resource1)); |
+ EXPECT_FALSE(resource1->IsPreloaded()); |
+ EXPECT_FALSE(resource1->IsLinkPreload()); |
} |
TEST_F(ResourceFetcherTest, Revalidate304) { |
@@ -670,7 +737,6 @@ TEST_F(ResourceFetcherTest, LinkPreloadResourceMultipleFetchersAndMove) { |
ASSERT_TRUE(resource); |
EXPECT_TRUE(resource->IsLinkPreload()); |
EXPECT_FALSE(fetcher->IsFetching()); |
- fetcher->PreloadStarted(resource); |
// Resource created by parser on the second fetcher |
FetchParameters fetch_params2 = |