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