Chromium Code Reviews| Index: Source/core/loader/FrameFetchContextTest.cpp |
| diff --git a/Source/core/loader/FrameFetchContextTest.cpp b/Source/core/loader/FrameFetchContextTest.cpp |
| index 75ae5c2da912923f1797d4be95218dc7c2d1b976..e948beee3ba088bcbeaa440d269a480b962c5a0e 100644 |
| --- a/Source/core/loader/FrameFetchContextTest.cpp |
| +++ b/Source/core/loader/FrameFetchContextTest.cpp |
| @@ -35,6 +35,7 @@ |
| #include "core/frame/FrameHost.h" |
| #include "core/frame/FrameOwner.h" |
| #include "core/frame/FrameView.h" |
| +#include "core/frame/Settings.h" |
| #include "core/html/HTMLDocument.h" |
| #include "core/loader/DocumentLoader.h" |
| #include "core/loader/EmptyClients.h" |
| @@ -46,32 +47,103 @@ |
| namespace blink { |
| -class FrameFetchContextUpgradeTest : public ::testing::Test { |
| +class StubFrameLoaderClientWithParent final : public EmptyFrameLoaderClient { |
|
Nate Chapin
2015/09/01 23:54:47
Moved without modification from farther down in th
|
| public: |
| - FrameFetchContextUpgradeTest() |
| - : secureURL(ParsedURLString, "https://secureorigin.test/image.png") |
| - , exampleOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://example.test/"))) |
| - , secureOrigin(SecurityOrigin::create(secureURL)) |
| + static PassOwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> create(Frame* parent) |
| + { |
| + return adoptPtrWillBeNoop(new StubFrameLoaderClientWithParent(parent)); |
| + } |
| + |
| + DEFINE_INLINE_VIRTUAL_TRACE() |
| { |
| + visitor->trace(m_parent); |
| + EmptyFrameLoaderClient::trace(visitor); |
| } |
| + Frame* parent() const override { return m_parent.get(); } |
| + |
| +private: |
| + explicit StubFrameLoaderClientWithParent(Frame* parent) |
| + : m_parent(parent) |
| + { |
| + } |
| + |
| + RawPtrWillBeMember<Frame> m_parent; |
| +}; |
| + |
| +class StubFrameOwner : public NoBaseWillBeGarbageCollectedFinalized<StubFrameOwner>, public FrameOwner { |
|
Nate Chapin
2015/09/01 23:54:47
Moved without modification from farther down in th
|
| + 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 FrameFetchContextTest : public ::testing::Test { |
| protected: |
| - virtual void SetUp() |
| + 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 = &documentLoader->fetcher()->context(); |
| + fetchContext = static_cast<FrameFetchContext*>(&documentLoader->fetcher()->context()); |
| FrameFetchContext::provideDocumentToContext(*fetchContext, document.get()); |
| } |
| - virtual void TearDown() |
| + void TearDown() override |
| { |
| documentLoader->detachFromFrame(); |
| documentLoader.clear(); |
| + |
| + if (childFrame) { |
| + childDocumentLoader->detachFromFrame(); |
| + childDocumentLoader.clear(); |
| + childFrame->detach(FrameDetachType::Remove); |
| + } |
| } |
| + FrameFetchContext* createChildFrame() |
| + { |
| + childClient = StubFrameLoaderClientWithParent::create(document->frame()); |
| + childFrame = LocalFrame::create(childClient.get(), document->frame()->host(), &owner); |
| + childFrame->setView(FrameView::create(childFrame.get(), IntSize(500, 500))); |
| + childFrame->init(); |
| + childDocumentLoader = DocumentLoader::create(childFrame.get(), ResourceRequest("http://www.example.com"), SubstituteData()); |
| + childDocument = childFrame->document(); |
| + FrameFetchContext* childFetchContext = static_cast<FrameFetchContext*>(&childDocumentLoader->fetcher()->context()); |
| + FrameFetchContext::provideDocumentToContext(*childFetchContext, childDocument.get()); |
| + return childFetchContext; |
| + } |
| + |
| + 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; |
|
dcheng
2015/09/02 17:17:12
It might be nice to update these to use the right
|
| + RefPtrWillBePersistent<Document> document; |
| + Persistent<FrameFetchContext> fetchContext; |
| + |
| + OwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> childClient; |
| + RefPtrWillBeRawPtr<LocalFrame> childFrame; |
| + RefPtrWillBePersistent<DocumentLoader> childDocumentLoader; |
| + RefPtrWillBePersistent<Document> childDocument; |
| + StubFrameOwner owner; |
| + |
| +}; |
| + |
| +class FrameFetchContextUpgradeTest : public FrameFetchContextTest { |
| +public: |
| + FrameFetchContextUpgradeTest() |
| + : secureURL(ParsedURLString, "https://secureorigin.test/image.png") |
|
dcheng
2015/09/02 17:17:12
Maybe just inline this directly into line 142? I d
Nate Chapin
2015/09/02 17:29:55
Done.
|
| + , exampleOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://example.test/"))) |
| + , secureOrigin(SecurityOrigin::create(secureURL)) |
| + { |
| + } |
| + |
| +protected: |
| void expectUpgrade(const char* input, const char* expected) |
| { |
| expectUpgrade(input, WebURLRequest::RequestContextScript, WebURLRequest::FrameTypeNone, expected); |
| @@ -113,13 +185,6 @@ protected: |
| KURL secureURL; |
| RefPtr<SecurityOrigin> exampleOrigin; |
| RefPtr<SecurityOrigin> secureOrigin; |
| - |
| - 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<FetchContext> fetchContext; |
| }; |
| TEST_F(FrameFetchContextUpgradeTest, UpgradeInsecureResourceRequests) |
| @@ -224,27 +289,11 @@ TEST_F(FrameFetchContextUpgradeTest, SendHTTPSHeader) |
| } |
| } |
| -class FrameFetchContextHintsTest : public ::testing::Test { |
| +class FrameFetchContextHintsTest : public FrameFetchContextTest { |
| public: |
| FrameFetchContextHintsTest() { } |
| protected: |
| - virtual void SetUp() |
| - { |
| - 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()); |
| - } |
| - |
| - virtual void TearDown() |
| - { |
| - documentLoader->detachFromFrame(); |
| - documentLoader.clear(); |
| - } |
| - |
| void expectHeader(const char* input, const char* headerName, bool isPresent, const char* headerValue, float width = 0) |
| { |
| KURL inputURL(ParsedURLString, input); |
| @@ -260,13 +309,6 @@ protected: |
| EXPECT_STREQ(isPresent ? headerValue : "", |
| fetchRequest.resourceRequest().httpHeaderField(headerName).utf8().data()); |
| } |
| - |
| - 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(FrameFetchContextHintsTest, MonitorDPRHints) |
| @@ -323,71 +365,7 @@ TEST_F(FrameFetchContextHintsTest, MonitorAllHints) |
| expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500"); |
| } |
| -class StubFrameLoaderClientWithParent final : public EmptyFrameLoaderClient { |
| -public: |
| - static PassOwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> create(Frame* parent) |
| - { |
| - return adoptPtrWillBeNoop(new StubFrameLoaderClientWithParent(parent)); |
| - } |
| - |
| - DEFINE_INLINE_VIRTUAL_TRACE() |
| - { |
| - visitor->trace(m_parent); |
| - EmptyFrameLoaderClient::trace(visitor); |
| - } |
| - |
| - Frame* parent() const override { return m_parent.get(); } |
| - |
| -private: |
| - explicit StubFrameLoaderClientWithParent(Frame* parent) |
| - : m_parent(parent) |
| - { |
| - } |
| - |
| - RawPtrWillBeMember<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) |
| +TEST_F(FrameFetchContextTest, MainResource) |
| { |
| // Default case |
| ResourceRequest request("http://www.example.com"); |
| @@ -419,16 +397,7 @@ TEST_F(FrameFetchContextCachePolicyTest, MainResource) |
| EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(conditional, Resource::MainResource)); |
| // Set up a child frame |
| - OwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> client = StubFrameLoaderClientWithParent::create(document->frame()); |
| - StubFrameOwner owner; |
| - RefPtrWillBeRawPtr<LocalFrame> childFrame = LocalFrame::create(client.get(), 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()); |
| + FrameFetchContext* childFetchContext = createChildFrame(); |
| // Child frame as part of back/forward |
| document->frame()->loader().setLoadType(FrameLoadTypeBackForward); |
| @@ -441,10 +410,84 @@ TEST_F(FrameFetchContextCachePolicyTest, 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(); |
| - childFrame->detach(FrameDetachType::Remove); |
| +TEST_F(FrameFetchContextTest, ModifyPriorityForExperiments) |
| +{ |
| + Settings* settings = document->frame()->settings(); |
| + FetchRequest request(ResourceRequest("http://www.example.com"), FetchInitiatorInfo()); |
| + |
| + FetchRequest preloadRequest(ResourceRequest("http://www.example.com"), FetchInitiatorInfo()); |
| + preloadRequest.setForPreload(true); |
| + |
| + FetchRequest deferredRequest(ResourceRequest("http://www.example.com"), FetchInitiatorInfo()); |
| + deferredRequest.setDefer(FetchRequest::LazyLoad); |
| + |
| + // Start with all experiments disabled. |
| + settings->setFEtchIncreaseAsyncScriptPriority(false); |
| + settings->setFEtchIncreaseFontPriority(false); |
| + settings->setFEtchDeferLateScripts(false); |
| + settings->setFEtchIncreasePriorities(false); |
| + settings->setLowPriorityIframes(false); |
| + |
| + // Base case, no priority change. Note that this triggers m_imageFetched, which will matter for setFetchDeferLateScripts() case below. |
| + EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityLow, Resource::Image, request)); |
| + |
| + // Font priority with and without fetchIncreaseFontPriority() |
| + EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Font, request)); |
| + settings->setFEtchIncreaseFontPriority(true); |
| + EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Font, request)); |
| + |
| + // Basic script cases |
| + EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, request)); |
| + EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); |
| + |
| + // Enable deferring late scripts. Preload priority should drop. |
| + settings->setFEtchDeferLateScripts(true); |
| + EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); |
| + |
| + // Enable increasing priority of async scripts. |
| + EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); |
| + settings->setFEtchIncreaseAsyncScriptPriority(true); |
| + EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); |
| + |
| + // Enable increased priorities for the remainder. |
| + settings->setFEtchIncreasePriorities(true); |
| + |
| + // Re-test font priority with increased prioriries |
| + settings->setFEtchIncreaseFontPriority(false); |
| + EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Font, request)); |
| + settings->setFEtchIncreaseFontPriority(true); |
| + EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Font, request)); |
| + |
| + // Re-test basic script cases and deferring late script case with increased prioriries |
| + settings->setFEtchIncreasePriorities(true); |
| + settings->setFEtchDeferLateScripts(false); |
| + EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, request)); |
| + EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); |
| + |
| + // Re-test deferring late scripts. |
| + settings->setFEtchDeferLateScripts(true); |
| + EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); |
| + |
| + // Re-test increasing priority of async scripts. Should ignore general incraesed priorities. |
| + settings->setFEtchIncreaseAsyncScriptPriority(false); |
| + EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); |
| + settings->setFEtchIncreaseAsyncScriptPriority(true); |
| + EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); |
| + |
| + // Set up a child frame, test main resource load with and without setLowPriorityIframes() |
| + FrameFetchContext* childFetchContext = createChildFrame(); |
| + EXPECT_EQ(ResourceLoadPriorityVeryHigh, childFetchContext->modifyPriorityForExperiments(ResourceLoadPriorityVeryHigh, Resource::MainResource, request)); |
| + settings->setLowPriorityIframes(true); |
| + EXPECT_EQ(ResourceLoadPriorityVeryLow, childFetchContext->modifyPriorityForExperiments(ResourceLoadPriorityVeryHigh, Resource::MainResource, request)); |
| + |
| + // Ensure we don't go out of bounds |
| + settings->setFEtchIncreasePriorities(true); |
| + EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityVeryHigh, Resource::Script, request)); |
| + settings->setFEtchIncreasePriorities(false); |
| + settings->setFEtchDeferLateScripts(true); |
| + EXPECT_EQ(ResourceLoadPriorityVeryLow, fetchContext->modifyPriorityForExperiments(ResourceLoadPriorityVeryLow, Resource::Script, preloadRequest)); |
| } |
| } // namespace |