| 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
|
|
|