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

Side by Side 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, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/fetch/Resource.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013, Google Inc. All rights reserved. 2 * Copyright (c) 2013, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 RawResource* jpegResource(RawResource::create(jpegRequest, Resource::Raw)); 50 RawResource* jpegResource(RawResource::create(jpegRequest, Resource::Raw));
51 51
52 ResourceRequest pngRequest; 52 ResourceRequest pngRequest;
53 pngRequest.setHTTPAccept("image/png"); 53 pngRequest.setHTTPAccept("image/png");
54 54
55 ASSERT_FALSE(jpegResource->canReuse(pngRequest)); 55 ASSERT_FALSE(jpegResource->canReuse(pngRequest));
56 } 56 }
57 57
58 class DummyClient final : public GarbageCollectedFinalized<DummyClient>, public RawResourceClient { 58 class DummyClient final : public GarbageCollectedFinalized<DummyClient>, public RawResourceClient {
59 public: 59 public:
60 DummyClient() : m_called(false) {} 60 DummyClient() : m_called(false), m_numberOfRedirectsReceived(0) {}
61 ~DummyClient() override {} 61 ~DummyClient() override {}
62 62
63 // ResourceClient implementation. 63 // ResourceClient implementation.
64 void notifyFinished(Resource* resource) override 64 void notifyFinished(Resource* resource) override
65 { 65 {
66 m_called = true; 66 m_called = true;
67 } 67 }
68 String debugName() const override { return "DummyClient"; } 68 String debugName() const override { return "DummyClient"; }
69 69
70 void dataReceived(Resource*, const char* data, size_t length) override 70 void dataReceived(Resource*, const char* data, size_t length) override
71 { 71 {
72 m_data.append(data, length); 72 m_data.append(data, length);
73 } 73 }
74 74
75 void redirectReceived(Resource*, ResourceRequest&, const ResourceResponse&) override
76 {
77 ++m_numberOfRedirectsReceived;
78 }
79
75 bool called() { return m_called; } 80 bool called() { return m_called; }
81 int numberOfRedirectsReceived() const { return m_numberOfRedirectsReceived; }
76 const Vector<char>& data() { return m_data; } 82 const Vector<char>& data() { return m_data; }
77 DEFINE_INLINE_TRACE() {} 83 DEFINE_INLINE_TRACE() {}
78 84
79 private: 85 private:
80 bool m_called; 86 bool m_called;
87 int m_numberOfRedirectsReceived;
81 Vector<char> m_data; 88 Vector<char> m_data;
82 }; 89 };
83 90
84 // This client adds another client when notified. 91 // This client adds another client when notified.
85 class AddingClient final : public GarbageCollectedFinalized<AddingClient>, publi c RawResourceClient { 92 class AddingClient final : public GarbageCollectedFinalized<AddingClient>, publi c RawResourceClient {
86 public: 93 public:
87 AddingClient(DummyClient* client, Resource* resource) 94 AddingClient(DummyClient* client, Resource* resource)
88 : m_dummyClient(client) 95 : m_dummyClient(client)
89 , m_resource(resource) 96 , m_resource(resource)
90 , m_removeClientTimer(this, &AddingClient::removeClient) {} 97 , m_removeClientTimer(this, &AddingClient::removeClient) {}
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 EXPECT_EQ("updated", resource->response().httpHeaderField("x-custom")); 243 EXPECT_EQ("updated", resource->response().httpHeaderField("x-custom"));
237 244
238 memoryCache()->remove(resource); 245 memoryCache()->remove(resource);
239 246
240 resource->removeClient(client); 247 resource->removeClient(client);
241 EXPECT_FALSE(resource->hasClientsOrObservers()); 248 EXPECT_FALSE(resource->hasClientsOrObservers());
242 EXPECT_FALSE(client->called()); 249 EXPECT_FALSE(client->called());
243 EXPECT_EQ(0u, client->data().size()); 250 EXPECT_EQ(0u, client->data().size());
244 } 251 }
245 252
253 TEST(RawResourceTest, RedirectDuringRevalidation)
254 {
255 Resource* resource = RawResource::create(ResourceRequest("https://example.co m/1"), Resource::Raw);
256 ResourceResponse response;
257 response.setURL(KURL(ParsedURLString, "https://example.com/1"));
258 response.setHTTPStatusCode(200);
259 resource->responseReceived(response, nullptr);
260 const char data[5] = "abcd";
261 resource->appendData(data, 4);
262 resource->finish();
263 memoryCache()->add(resource);
264
265 EXPECT_FALSE(resource->isCacheValidator());
266 EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getStri ng());
267 EXPECT_EQ("https://example.com/1", resource->lastResourceRequest().url().get String());
268
269 // Simulate a revalidation.
270 resource->setRevalidatingRequest(ResourceRequest("https://example.com/1"));
271 EXPECT_TRUE(resource->isCacheValidator());
272 EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getStri ng());
273 EXPECT_EQ("https://example.com/1", resource->lastResourceRequest().url().get String());
274
275 Persistent<DummyClient> client = new DummyClient;
276 resource->addClient(client);
277
278 // The revalidating request is redirected.
279 ResourceResponse redirectResponse;
280 redirectResponse.setURL(KURL(ParsedURLString, "https://example.com/1"));
281 redirectResponse.setHTTPHeaderField("location", "https://example.com/2");
282 redirectResponse.setHTTPStatusCode(308);
283 ResourceRequest redirectedRevalidatingRequest("https://example.com/2");
284 resource->willFollowRedirect(redirectedRevalidatingRequest, redirectResponse );
285 EXPECT_FALSE(resource->isCacheValidator());
286 EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getStri ng());
287 EXPECT_EQ("https://example.com/2", resource->lastResourceRequest().url().get String());
288
289 // The final response is received.
290 ResourceResponse revalidatingResponse;
291 revalidatingResponse.setURL(KURL(ParsedURLString, "https://example.com/2"));
292 revalidatingResponse.setHTTPStatusCode(200);
293 resource->responseReceived(revalidatingResponse, nullptr);
294 const char data2[4] = "xyz";
295 resource->appendData(data2, 3);
296 resource->finish();
297 EXPECT_FALSE(resource->isCacheValidator());
298 EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getStri ng());
299 EXPECT_EQ("https://example.com/2", resource->lastResourceRequest().url().get String());
300 EXPECT_FALSE(resource->isCacheValidator());
301 EXPECT_EQ(200, resource->response().httpStatusCode());
302 EXPECT_EQ(3u, resource->resourceBuffer()->size());
303 EXPECT_EQ(memoryCache()->resourceForURL(KURL(ParsedURLString, "https://examp le.com/1")), resource);
304
305 EXPECT_TRUE(client->called());
306 EXPECT_EQ(1, client->numberOfRedirectsReceived());
307 EXPECT_EQ("xyz", String(client->data().data(), client->data().size()));
308
309 // Test the case where a client is added after revalidation is completed.
310 Persistent<DummyClient> client2 = new DummyClient;
311 resource->addClient(client2);
312
313 // Because RawResourceClient is added asynchronously,
314 // |runPendingTasks()| is called to make |client2| to be notified.
315 testing::runPendingTasks();
316
317 EXPECT_TRUE(client2->called());
318 EXPECT_EQ(1, client2->numberOfRedirectsReceived());
319 EXPECT_EQ("xyz", String(client2->data().data(), client2->data().size()));
320
321 memoryCache()->remove(resource);
322
323 resource->removeClient(client);
324 resource->removeClient(client2);
325 EXPECT_FALSE(resource->hasClientsOrObservers());
326 }
327
246 TEST(RawResourceTest, AddClientDuringCallback) 328 TEST(RawResourceTest, AddClientDuringCallback)
247 { 329 {
248 Resource* raw = RawResource::create(ResourceRequest("data:text/html,"), Reso urce::Raw); 330 Resource* raw = RawResource::create(ResourceRequest("data:text/html,"), Reso urce::Raw);
249 331
250 // Create a non-null response. 332 // Create a non-null response.
251 ResourceResponse response = raw->response(); 333 ResourceResponse response = raw->response();
252 response.setURL(KURL(ParsedURLString, "http://600.613/")); 334 response.setURL(KURL(ParsedURLString, "http://600.613/"));
253 raw->setResponse(response); 335 raw->setResponse(response);
254 raw->finish(); 336 raw->finish();
255 EXPECT_FALSE(raw->response().isNull()); 337 EXPECT_FALSE(raw->response().isNull());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 390
309 TEST(RawResourceTest, CanReuseDevToolsEmulateNetworkConditionsClientIdHeader) 391 TEST(RawResourceTest, CanReuseDevToolsEmulateNetworkConditionsClientIdHeader)
310 { 392 {
311 ResourceRequest request("data:text/html,"); 393 ResourceRequest request("data:text/html,");
312 request.setHTTPHeaderField(HTTPNames::X_DevTools_Emulate_Network_Conditions_ Client_Id, "Foo"); 394 request.setHTTPHeaderField(HTTPNames::X_DevTools_Emulate_Network_Conditions_ Client_Id, "Foo");
313 Resource* raw = RawResource::create(request, Resource::Raw); 395 Resource* raw = RawResource::create(request, Resource::Raw);
314 EXPECT_TRUE(raw->canReuse(ResourceRequest("data:text/html,"))); 396 EXPECT_TRUE(raw->canReuse(ResourceRequest("data:text/html,")));
315 } 397 }
316 398
317 } // namespace blink 399 } // namespace blink
OLDNEW
« 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