Index: third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp |
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp |
index b3e7bd54f971fbf5d812bba2597586dc155d2ec9..840620250ddb4cd037a48cb5684ca8f8cc17f25b 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp |
@@ -49,6 +49,7 @@ |
#include "platform/weborigin/KURL.h" |
#include "public/platform/Platform.h" |
#include "public/platform/WebTaskRunner.h" |
+#include "public/platform/WebURLError.h" |
#include "public/platform/WebURLLoaderMockFactory.h" |
#include "public/platform/WebURLResponse.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -749,4 +750,86 @@ TEST_F(ResourceFetcherTest, Revalidate304) { |
EXPECT_NE(resource, newResource); |
} |
+class CacheAwareResourceClient |
+ : public GarbageCollectedFinalized<CacheAwareResourceClient>, |
+ public RawResourceClient { |
+ USING_GARBAGE_COLLECTED_MIXIN(CacheAwareResourceClient); |
+ |
+ public: |
+ CacheAwareResourceClient() : m_willReloadAfterDiskCacheMissCalled(false) {} |
+ |
+ void setResource(Resource* resource) { |
+ ASSERT_FALSE(m_resource); |
+ m_resource = resource; |
+ } |
+ |
+ void willReloadAfterDiskCacheMiss(Resource* resource) override { |
+ EXPECT_EQ(m_resource, resource); |
+ m_willReloadAfterDiskCacheMissCalled = true; |
+ } |
+ |
+ bool willReloadAfterDiskCacheMissCalled() const { |
+ return m_willReloadAfterDiskCacheMissCalled; |
+ } |
+ |
+ DEFINE_INLINE_TRACE() { |
+ visitor->trace(m_resource); |
+ RawResourceClient::trace(visitor); |
+ } |
+ |
+ String debugName() const override { return "CacheAwareResourceClient"; } |
+ |
+ private: |
+ Member<Resource> m_resource; |
+ bool m_willReloadAfterDiskCacheMissCalled; |
+}; |
+ |
+void runCacheAwareLoadingTest(CacheAwareResourceClient* client, |
+ const WebURLError& error) { |
+ ResourceFetcher* fetcher = |
+ ResourceFetcher::create(ResourceFetcherTestMockFetchContext::create()); |
+ KURL url(ParsedURLString, "http://127.0.0.1:8000/foo.html"); |
+ FetchRequest fetchRequest = FetchRequest(url, FetchInitiatorInfo()); |
+ fetchRequest.mutableResourceRequest().setIsCacheAwareLoadingEnabled(true); |
+ |
+ ResourceResponse response; |
+ response.setURL(url); |
+ Platform::current()->getURLLoaderMockFactory()->registerErrorURL( |
+ url, WrappedResourceResponse(response), error); |
+ |
+ Resource* resource = |
+ fetcher->requestResource(fetchRequest, TestResourceFactory()); |
+ ASSERT_TRUE(resource); |
+ ASSERT_TRUE(resource->resourceRequest().isCacheAwareLoadingActivated()); |
+ |
+ client->setResource(resource); |
+ resource->addClient(client); |
+ Platform::current()->getURLLoaderMockFactory()->serveAsynchronousRequests(); |
+ Platform::current()->getURLLoaderMockFactory()->unregisterURL(url); |
+ |
+ resource->removeClient(client); |
+ memoryCache()->remove(resource); |
+} |
+ |
+TEST_F(ResourceFetcherTest, CacheAwareLoading) { |
+ Persistent<CacheAwareResourceClient> client = new CacheAwareResourceClient; |
+ WebURLError error; |
+ error.reason = -400; // ERR_CACHE_MISS |
+ runCacheAwareLoadingTest(client, error); |
+ EXPECT_TRUE(client->willReloadAfterDiskCacheMissCalled()); |
+} |
+ |
+TEST_F(ResourceFetcherTest, CacheAwareLoadingFailByAccessCheck) { |
+ Persistent<CacheAwareResourceClient> client = new CacheAwareResourceClient; |
+ runCacheAwareLoadingTest(client, |
+ ResourceError::cancelledDueToAccessCheckError("")); |
+ EXPECT_FALSE(client->willReloadAfterDiskCacheMissCalled()); |
+} |
+ |
+TEST_F(ResourceFetcherTest, CacheAwareLoadingFailByCancellation) { |
+ Persistent<CacheAwareResourceClient> client = new CacheAwareResourceClient; |
+ runCacheAwareLoadingTest(client, ResourceError::cancelledError("")); |
+ EXPECT_FALSE(client->willReloadAfterDiskCacheMissCalled()); |
+} |
+ |
} // namespace blink |