Index: Source/core/loader/FrameFetchContextTest.cpp |
diff --git a/Source/core/loader/FrameFetchContextTest.cpp b/Source/core/loader/FrameFetchContextTest.cpp |
index 7ca3d2370fcde01a59995dc73307740e78d19590..8d570b147aeca64b7dbabeafa16226699963884c 100644 |
--- a/Source/core/loader/FrameFetchContextTest.cpp |
+++ b/Source/core/loader/FrameFetchContextTest.cpp |
@@ -32,9 +32,12 @@ |
#include "core/loader/FrameFetchContext.h" |
#include "core/fetch/FetchInitiatorInfo.h" |
+#include "core/frame/FrameHost.h" |
+#include "core/frame/FrameOwner.h" |
#include "core/frame/FrameView.h" |
#include "core/html/HTMLDocument.h" |
#include "core/loader/DocumentLoader.h" |
+#include "core/loader/EmptyClients.h" |
#include "core/page/Page.h" |
#include "core/testing/DummyPageHolder.h" |
#include "platform/network/ResourceRequest.h" |
@@ -320,4 +323,116 @@ TEST_F(FrameFetchContextHintsTest, MonitorAllHints) |
expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500"); |
} |
+class StubFrameLoaderClientWithParent : public EmptyFrameLoaderClient { |
+public: |
+ explicit StubFrameLoaderClientWithParent(Frame* parent) |
+ : m_parent(parent) |
+ { |
+ } |
+ |
+ Frame* parent() const override { return m_parent; } |
+ |
+private: |
+ Frame* m_parent; |
+}; |
+ |
+class StubFrameOwner : public NoBaseWillBeGarbageCollectedFinalized<StubFrameOwner>, public FrameOwner { |
+ WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(StubFrameOwner); |
+public: |
+ DEFINE_INLINE_VIRTUAL_TRACE() { FrameOwner::trace(visitor); } |
+ |
+ bool isLocal() const override { return false; } |
+ SandboxFlags sandboxFlags() const override { return SandboxNone; } |
+ void dispatchLoad() override { } |
+ void renderFallbackContent() override { } |
+}; |
+ |
+class FrameFetchContextCachePolicyTest : public ::testing::Test { |
+public: |
+ FrameFetchContextCachePolicyTest() { } |
+ |
+protected: |
+ void SetUp() override |
+ { |
+ dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); |
+ dummyPageHolder->page().setDeviceScaleFactor(1.0); |
+ documentLoader = DocumentLoader::create(&dummyPageHolder->frame(), ResourceRequest("http://www.example.com"), SubstituteData()); |
+ document = toHTMLDocument(&dummyPageHolder->document()); |
+ fetchContext = static_cast<FrameFetchContext*>(&documentLoader->fetcher()->context()); |
+ FrameFetchContext::provideDocumentToContext(*fetchContext, document.get()); |
+ } |
+ |
+ void TearDown() override |
+ { |
+ documentLoader->detachFromFrame(); |
+ documentLoader.clear(); |
+ } |
+ |
+ OwnPtr<DummyPageHolder> dummyPageHolder; |
+ // We don't use the DocumentLoader directly in any tests, but need to keep it around as long |
+ // as the ResourceFetcher and Document live due to indirect usage. |
+ RefPtrWillBePersistent<DocumentLoader> documentLoader; |
+ RefPtrWillBePersistent<Document> document; |
+ Persistent<FrameFetchContext> fetchContext; |
+}; |
+ |
+TEST_F(FrameFetchContextCachePolicyTest, MainResource) |
+{ |
+ // Default case |
+ ResourceRequest request("http://www.example.com"); |
+ EXPECT_EQ(UseProtocolCachePolicy, fetchContext->resourceRequestCachePolicy(request, Resource::MainResource)); |
+ |
+ // Post |
+ ResourceRequest postRequest("http://www.example.com"); |
+ postRequest.setHTTPMethod("POST"); |
+ EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(postRequest, Resource::MainResource)); |
+ |
+ // Re-post |
+ document->frame()->loader().setLoadType(FrameLoadTypeBackForward); |
+ EXPECT_EQ(ReturnCacheDataDontLoad, fetchContext->resourceRequestCachePolicy(postRequest, Resource::MainResource)); |
+ |
+ // Enconding overriden |
+ document->frame()->loader().setLoadType(FrameLoadTypeStandard); |
+ document->frame()->host()->setOverrideEncoding("foo"); |
+ EXPECT_EQ(ReturnCacheDataElseLoad, fetchContext->resourceRequestCachePolicy(request, Resource::MainResource)); |
+ document->frame()->host()->setOverrideEncoding(AtomicString()); |
+ |
+ // FrameLoadTypeSame |
+ document->frame()->loader().setLoadType(FrameLoadTypeSame); |
+ EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(request, Resource::MainResource)); |
+ |
+ // Conditional request |
+ document->frame()->loader().setLoadType(FrameLoadTypeStandard); |
+ ResourceRequest conditional("http://www.example.com"); |
+ conditional.setHTTPHeaderField("If-Modified-Since", "foo"); |
+ EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(conditional, Resource::MainResource)); |
+ |
+ // Set up a child frame |
+ StubFrameLoaderClientWithParent client(document->frame()); |
+ StubFrameOwner owner; |
+ RefPtrWillBeRawPtr<LocalFrame> childFrame = LocalFrame::create(&client, document->frame()->host(), &owner); |
+ childFrame->setView(FrameView::create(childFrame.get(), IntSize(500, 500))); |
+ childFrame->init(); |
+ RefPtrWillBePersistent<DocumentLoader> childDocumentLoader = |
+ DocumentLoader::create(childFrame.get(), ResourceRequest("http://www.example.com"), SubstituteData()); |
+ RefPtrWillBePersistent<Document> childDocument = childFrame->document(); |
+ FrameFetchContext* childFetchContext = static_cast<FrameFetchContext*>(&childDocumentLoader->fetcher()->context()); |
+ FrameFetchContext::provideDocumentToContext(*childFetchContext, childDocument.get()); |
+ |
+ // Child frame as part of back/forward |
+ document->frame()->loader().setLoadType(FrameLoadTypeBackForward); |
+ EXPECT_EQ(ReturnCacheDataElseLoad, childFetchContext->resourceRequestCachePolicy(request, Resource::MainResource)); |
+ |
+ // Child frame as part of reload |
+ document->frame()->loader().setLoadType(FrameLoadTypeReload); |
+ EXPECT_EQ(ReloadIgnoringCacheData, childFetchContext->resourceRequestCachePolicy(request, Resource::MainResource)); |
+ |
+ // Child frame as part of end to end reload |
+ document->frame()->loader().setLoadType(FrameLoadTypeReloadFromOrigin); |
+ EXPECT_EQ(ReloadBypassingCache, childFetchContext->resourceRequestCachePolicy(request, Resource::MainResource)); |
+ |
+ childDocumentLoader->detachFromFrame(); |
+ childDocumentLoader.clear(); |
+} |
+ |
} // namespace |