Index: Source/core/loader/FrameFetchContextTest.cpp |
diff --git a/Source/core/loader/FrameFetchContextTest.cpp b/Source/core/loader/FrameFetchContextTest.cpp |
index 75ae5c2da912923f1797d4be95218dc7c2d1b976..c6ce4a080ef08c5919cc5ce2b32ba1d250ba4b97 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,102 @@ |
namespace blink { |
-class FrameFetchContextUpgradeTest : public ::testing::Test { |
+class StubFrameLoaderClientWithParent final : public EmptyFrameLoaderClient { |
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 { |
+ 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; |
+ 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() |
+ : exampleOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://example.test/"))) |
+ , secureOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://secureorigin.test/image.png"))) |
+ { |
+ } |
+ |
+protected: |
void expectUpgrade(const char* input, const char* expected) |
{ |
expectUpgrade(input, WebURLRequest::RequestContextScript, WebURLRequest::FrameTypeNone, expected); |
@@ -110,16 +181,8 @@ protected: |
fetchRequest.resourceRequest().httpHeaderField("Upgrade-Insecure-Requests").utf8().data()); |
} |
- 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 +287,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 +307,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 +363,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 +395,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 +408,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 |