OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |