Index: third_party/WebKit/Source/core/timing/PerformanceBaseTest.cpp |
diff --git a/third_party/WebKit/Source/core/timing/PerformanceBaseTest.cpp b/third_party/WebKit/Source/core/timing/PerformanceBaseTest.cpp |
index 1ff271cd886a065e9cf9992dc8ca54fc64cecf59..1c11006cfa0907ebca6d078b2d038f3189aad312 100644 |
--- a/third_party/WebKit/Source/core/timing/PerformanceBaseTest.cpp |
+++ b/third_party/WebKit/Source/core/timing/PerformanceBaseTest.cpp |
@@ -7,10 +7,12 @@ |
#include "bindings/core/v8/PerformanceObserverCallback.h" |
#include "bindings/core/v8/V8BindingForTesting.h" |
#include "core/testing/DummyPageHolder.h" |
+#include "core/testing/NullExecutionContext.h" |
#include "core/timing/PerformanceBase.h" |
#include "core/timing/PerformanceLongTaskTiming.h" |
#include "core/timing/PerformanceObserver.h" |
#include "core/timing/PerformanceObserverInit.h" |
+#include "platform/network/ResourceResponse.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace blink { |
@@ -58,6 +60,15 @@ class PerformanceBaseTest : public ::testing::Test { |
return PerformanceBase::getNavigationType(type, document); |
} |
+ static bool allowsTimingRedirect( |
+ const Vector<ResourceResponse>& redirectChain, |
+ const ResourceResponse& finalResponse, |
+ const SecurityOrigin& initiatorSecurityOrigin, |
+ ExecutionContext* context) { |
+ return PerformanceBase::allowsTimingRedirect( |
+ redirectChain, finalResponse, initiatorSecurityOrigin, context); |
+ } |
+ |
Persistent<TestPerformanceBase> m_base; |
Persistent<PerformanceObserver> m_observer; |
std::unique_ptr<DummyPageHolder> m_pageHolder; |
@@ -144,4 +155,42 @@ TEST_F(PerformanceBaseTest, GetNavigationType) { |
EXPECT_EQ(returnedType, |
PerformanceNavigationTiming::NavigationType::Navigate); |
} |
+ |
+TEST_F(PerformanceBaseTest, AllowsTimingRedirect) { |
+ // When there are no cross-origin redirects. |
+ AtomicString originDomain = "http://127.0.0.1:8000"; |
+ Vector<ResourceResponse> redirectChain; |
+ KURL url(ParsedURLString, originDomain + "/foo.html"); |
+ ResourceResponse finalResponse; |
+ finalResponse.setURL(url); |
+ ResourceResponse redirectResponse1; |
+ redirectResponse1.setURL(url); |
+ ResourceResponse redirectResponse2; |
+ redirectResponse2.setURL(url); |
+ redirectChain.append(redirectResponse1); |
+ redirectChain.append(redirectResponse2); |
+ RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(url); |
+ NullExecutionContext nullExecutionContext; |
panicker
2016/12/07 00:40:52
Nit: Make this a member in PerformanceBaseTest?
In
sunjian
2016/12/07 20:10:32
Done.
|
+ const ExecutionContext* context = &nullExecutionContext; |
+ EXPECT_TRUE(allowsTimingRedirect(redirectChain, finalResponse, |
+ *securityOrigin.get(), |
+ const_cast<ExecutionContext*>(context))); |
+ // When there exist cross-origin redirects. |
+ AtomicString crossOriginDomain = "http://126.0.0.1:8000"; |
+ KURL redirectUrl(ParsedURLString, crossOriginDomain + "/bar.html"); |
+ ResourceResponse redirectResponse3; |
+ redirectResponse3.setURL(redirectUrl); |
+ redirectChain.append(redirectResponse3); |
+ EXPECT_FALSE(allowsTimingRedirect(redirectChain, finalResponse, |
+ *securityOrigin.get(), |
+ const_cast<ExecutionContext*>(context))); |
+ |
+ // When cross-origin redirect opts in. |
+ redirectChain.back().setHTTPHeaderField(HTTPNames::Timing_Allow_Origin, |
+ originDomain); |
+ EXPECT_TRUE(allowsTimingRedirect(redirectChain, finalResponse, |
+ *securityOrigin.get(), |
+ const_cast<ExecutionContext*>(context))); |
+} |
+ |
} // namespace blink |