Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Unified Diff: third_party/WebKit/Source/core/fetch/RawResourceTest.cpp

Issue 2017883002: Make revalidation to fail when received a redirect response (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added a unit test, reflected kinuko@'s comment. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/fetch/Resource.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
diff --git a/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp b/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
index 6de2585257c2deca724bcdadb72a1e0fc7918d38..636920a41bf8c493397a69cb71953dcbb58a4c08 100644
--- a/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
@@ -57,7 +57,7 @@ TEST(RawResourceTest, DontIgnoreAcceptForCacheReuse)
class DummyClient final : public GarbageCollectedFinalized<DummyClient>, public RawResourceClient {
public:
- DummyClient() : m_called(false) {}
+ DummyClient() : m_called(false), m_numberOfRedirectsReceived(0) {}
~DummyClient() override {}
// ResourceClient implementation.
@@ -72,12 +72,19 @@ public:
m_data.append(data, length);
}
+ void redirectReceived(Resource*, ResourceRequest&, const ResourceResponse&) override
+ {
+ ++m_numberOfRedirectsReceived;
+ }
+
bool called() { return m_called; }
+ int numberOfRedirectsReceived() const { return m_numberOfRedirectsReceived; }
const Vector<char>& data() { return m_data; }
DEFINE_INLINE_TRACE() {}
private:
bool m_called;
+ int m_numberOfRedirectsReceived;
Vector<char> m_data;
};
@@ -243,6 +250,81 @@ TEST(RawResourceTest, RevalidationSucceededUpdateHeaders)
EXPECT_EQ(0u, client->data().size());
}
+TEST(RawResourceTest, RedirectDuringRevalidation)
+{
+ Resource* resource = RawResource::create(ResourceRequest("https://example.com/1"), Resource::Raw);
+ ResourceResponse response;
+ response.setURL(KURL(ParsedURLString, "https://example.com/1"));
+ response.setHTTPStatusCode(200);
+ resource->responseReceived(response, nullptr);
+ const char data[5] = "abcd";
+ resource->appendData(data, 4);
+ resource->finish();
+ memoryCache()->add(resource);
+
+ EXPECT_FALSE(resource->isCacheValidator());
+ EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getString());
+ EXPECT_EQ("https://example.com/1", resource->lastResourceRequest().url().getString());
+
+ // Simulate a revalidation.
+ resource->setRevalidatingRequest(ResourceRequest("https://example.com/1"));
+ EXPECT_TRUE(resource->isCacheValidator());
+ EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getString());
+ EXPECT_EQ("https://example.com/1", resource->lastResourceRequest().url().getString());
+
+ Persistent<DummyClient> client = new DummyClient;
+ resource->addClient(client);
+
+ // The revalidating request is redirected.
+ ResourceResponse redirectResponse;
+ redirectResponse.setURL(KURL(ParsedURLString, "https://example.com/1"));
+ redirectResponse.setHTTPHeaderField("location", "https://example.com/2");
+ redirectResponse.setHTTPStatusCode(308);
+ ResourceRequest redirectedRevalidatingRequest("https://example.com/2");
+ resource->willFollowRedirect(redirectedRevalidatingRequest, redirectResponse);
+ EXPECT_FALSE(resource->isCacheValidator());
+ EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getString());
+ EXPECT_EQ("https://example.com/2", resource->lastResourceRequest().url().getString());
+
+ // The final response is received.
+ ResourceResponse revalidatingResponse;
+ revalidatingResponse.setURL(KURL(ParsedURLString, "https://example.com/2"));
+ revalidatingResponse.setHTTPStatusCode(200);
+ resource->responseReceived(revalidatingResponse, nullptr);
+ const char data2[4] = "xyz";
+ resource->appendData(data2, 3);
+ resource->finish();
+ EXPECT_FALSE(resource->isCacheValidator());
+ EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getString());
+ EXPECT_EQ("https://example.com/2", resource->lastResourceRequest().url().getString());
+ EXPECT_FALSE(resource->isCacheValidator());
+ EXPECT_EQ(200, resource->response().httpStatusCode());
+ EXPECT_EQ(3u, resource->resourceBuffer()->size());
+ EXPECT_EQ(memoryCache()->resourceForURL(KURL(ParsedURLString, "https://example.com/1")), resource);
+
+ EXPECT_TRUE(client->called());
+ EXPECT_EQ(1, client->numberOfRedirectsReceived());
+ EXPECT_EQ("xyz", String(client->data().data(), client->data().size()));
+
+ // Test the case where a client is added after revalidation is completed.
+ Persistent<DummyClient> client2 = new DummyClient;
+ resource->addClient(client2);
+
+ // Because RawResourceClient is added asynchronously,
+ // |runPendingTasks()| is called to make |client2| to be notified.
+ testing::runPendingTasks();
+
+ EXPECT_TRUE(client2->called());
+ EXPECT_EQ(1, client2->numberOfRedirectsReceived());
+ EXPECT_EQ("xyz", String(client2->data().data(), client2->data().size()));
+
+ memoryCache()->remove(resource);
+
+ resource->removeClient(client);
+ resource->removeClient(client2);
+ EXPECT_FALSE(resource->hasClientsOrObservers());
+}
+
TEST(RawResourceTest, AddClientDuringCallback)
{
Resource* raw = RawResource::create(ResourceRequest("data:text/html,"), Resource::Raw);
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/fetch/Resource.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698