| 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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 RawResource* jpegResource(RawResource::create(jpegRequest, Resource::Raw)); | 49 RawResource* jpegResource(RawResource::create(jpegRequest, Resource::Raw)); |
| 50 | 50 |
| 51 ResourceRequest pngRequest; | 51 ResourceRequest pngRequest; |
| 52 pngRequest.setHTTPAccept("image/png"); | 52 pngRequest.setHTTPAccept("image/png"); |
| 53 | 53 |
| 54 ASSERT_FALSE(jpegResource->canReuse(pngRequest)); | 54 ASSERT_FALSE(jpegResource->canReuse(pngRequest)); |
| 55 } | 55 } |
| 56 | 56 |
| 57 class DummyClient final : public RawResourceClient { | 57 class DummyClient final : public RawResourceClient { |
| 58 public: | 58 public: |
| 59 DummyClient() : m_called(false) {} | 59 DummyClient() : m_called(false), m_numberOfRedirectsReceived(0) {} |
| 60 ~DummyClient() override {} | 60 ~DummyClient() override {} |
| 61 | 61 |
| 62 // ResourceClient implementation. | 62 // ResourceClient implementation. |
| 63 void notifyFinished(Resource* resource) override | 63 void notifyFinished(Resource* resource) override |
| 64 { | 64 { |
| 65 m_called = true; | 65 m_called = true; |
| 66 } | 66 } |
| 67 String debugName() const override { return "DummyClient"; } | 67 String debugName() const override { return "DummyClient"; } |
| 68 | 68 |
| 69 void dataReceived(Resource*, const char* data, size_t length) override | 69 void dataReceived(Resource*, const char* data, size_t length) override |
| 70 { | 70 { |
| 71 m_data.append(data, length); | 71 m_data.append(data, length); |
| 72 } | 72 } |
| 73 | 73 |
| 74 void redirectReceived(Resource*, ResourceRequest&, const ResourceResponse&)
override |
| 75 { |
| 76 ++m_numberOfRedirectsReceived; |
| 77 } |
| 78 |
| 74 bool called() { return m_called; } | 79 bool called() { return m_called; } |
| 80 int numberOfRedirectsReceived() const { return m_numberOfRedirectsReceived;
} |
| 75 const Vector<char>& data() { return m_data; } | 81 const Vector<char>& data() { return m_data; } |
| 76 private: | 82 private: |
| 77 bool m_called; | 83 bool m_called; |
| 84 int m_numberOfRedirectsReceived; |
| 78 Vector<char> m_data; | 85 Vector<char> m_data; |
| 79 }; | 86 }; |
| 80 | 87 |
| 81 // This client adds another client when notified. | 88 // This client adds another client when notified. |
| 82 class AddingClient : public RawResourceClient { | 89 class AddingClient : public RawResourceClient { |
| 83 public: | 90 public: |
| 84 AddingClient(DummyClient* client, Resource* resource) | 91 AddingClient(DummyClient* client, Resource* resource) |
| 85 : m_dummyClient(client) | 92 : m_dummyClient(client) |
| 86 , m_resource(resource) | 93 , m_resource(resource) |
| 87 , m_removeClientTimer(this, &AddingClient::removeClient) {} | 94 , m_removeClientTimer(this, &AddingClient::removeClient) {} |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 EXPECT_EQ("updated", resource->response().httpHeaderField("x-custom")); | 233 EXPECT_EQ("updated", resource->response().httpHeaderField("x-custom")); |
| 227 | 234 |
| 228 memoryCache()->remove(resource); | 235 memoryCache()->remove(resource); |
| 229 | 236 |
| 230 resource->removeClient(client.get()); | 237 resource->removeClient(client.get()); |
| 231 EXPECT_FALSE(resource->hasClientsOrObservers()); | 238 EXPECT_FALSE(resource->hasClientsOrObservers()); |
| 232 EXPECT_FALSE(client->called()); | 239 EXPECT_FALSE(client->called()); |
| 233 EXPECT_EQ(0u, client->data().size()); | 240 EXPECT_EQ(0u, client->data().size()); |
| 234 } | 241 } |
| 235 | 242 |
| 243 TEST(RawResourceTest, RedirectDuringRevalidation) |
| 244 { |
| 245 Resource* resource = RawResource::create(ResourceRequest("https://example.co
m/1"), Resource::Raw); |
| 246 ResourceResponse response; |
| 247 response.setURL(KURL(ParsedURLString, "https://example.com/1")); |
| 248 response.setHTTPStatusCode(200); |
| 249 resource->responseReceived(response, nullptr); |
| 250 const char data[5] = "abcd"; |
| 251 resource->appendData(data, 4); |
| 252 resource->finish(); |
| 253 memoryCache()->add(resource); |
| 254 |
| 255 EXPECT_FALSE(resource->isCacheValidator()); |
| 256 EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getStri
ng()); |
| 257 EXPECT_EQ("https://example.com/1", resource->lastResourceRequest().url().get
String()); |
| 258 |
| 259 // Simulate a revalidation. |
| 260 resource->setRevalidatingRequest(ResourceRequest("https://example.com/1")); |
| 261 EXPECT_TRUE(resource->isCacheValidator()); |
| 262 EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getStri
ng()); |
| 263 EXPECT_EQ("https://example.com/1", resource->lastResourceRequest().url().get
String()); |
| 264 |
| 265 OwnPtr<DummyClient> client = adoptPtr(new DummyClient); |
| 266 resource->addClient(client.get()); |
| 267 |
| 268 // The revalidating request is redirected. |
| 269 ResourceResponse redirectResponse; |
| 270 redirectResponse.setURL(KURL(ParsedURLString, "https://example.com/1")); |
| 271 redirectResponse.setHTTPHeaderField("location", "https://example.com/2"); |
| 272 redirectResponse.setHTTPStatusCode(308); |
| 273 ResourceRequest redirectedRevalidatingRequest("https://example.com/2"); |
| 274 resource->willFollowRedirect(redirectedRevalidatingRequest, redirectResponse
); |
| 275 EXPECT_FALSE(resource->isCacheValidator()); |
| 276 EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getStri
ng()); |
| 277 EXPECT_EQ("https://example.com/2", resource->lastResourceRequest().url().get
String()); |
| 278 |
| 279 // The final response is received. |
| 280 ResourceResponse revalidatingResponse; |
| 281 revalidatingResponse.setURL(KURL(ParsedURLString, "https://example.com/2")); |
| 282 revalidatingResponse.setHTTPStatusCode(200); |
| 283 resource->responseReceived(revalidatingResponse, nullptr); |
| 284 const char data2[4] = "xyz"; |
| 285 resource->appendData(data2, 3); |
| 286 resource->finish(); |
| 287 EXPECT_FALSE(resource->isCacheValidator()); |
| 288 EXPECT_EQ("https://example.com/1", resource->resourceRequest().url().getStri
ng()); |
| 289 EXPECT_EQ("https://example.com/2", resource->lastResourceRequest().url().get
String()); |
| 290 EXPECT_FALSE(resource->isCacheValidator()); |
| 291 EXPECT_EQ(200, resource->response().httpStatusCode()); |
| 292 EXPECT_EQ(3u, resource->resourceBuffer()->size()); |
| 293 EXPECT_EQ(memoryCache()->resourceForURL(KURL(ParsedURLString, "https://examp
le.com/1")), resource); |
| 294 |
| 295 EXPECT_TRUE(client->called()); |
| 296 EXPECT_EQ(1, client->numberOfRedirectsReceived()); |
| 297 EXPECT_EQ("xyz", String(client->data().data(), client->data().size())); |
| 298 |
| 299 // Test the case where a client is added after revalidation is completed. |
| 300 OwnPtr<DummyClient> client2 = adoptPtr(new DummyClient); |
| 301 resource->addClient(client2.get()); |
| 302 |
| 303 // Because RawResourceClient is added asynchronously, |
| 304 // |runPendingTasks()| is called to make |client2| to be notified. |
| 305 testing::runPendingTasks(); |
| 306 |
| 307 EXPECT_TRUE(client2->called()); |
| 308 EXPECT_EQ(1, client2->numberOfRedirectsReceived()); |
| 309 EXPECT_EQ("xyz", String(client2->data().data(), client2->data().size())); |
| 310 |
| 311 memoryCache()->remove(resource); |
| 312 |
| 313 resource->removeClient(client.get()); |
| 314 resource->removeClient(client2.get()); |
| 315 EXPECT_FALSE(resource->hasClientsOrObservers()); |
| 316 } |
| 317 |
| 236 TEST(RawResourceTest, AddClientDuringCallback) | 318 TEST(RawResourceTest, AddClientDuringCallback) |
| 237 { | 319 { |
| 238 Resource* raw = RawResource::create(ResourceRequest("data:text/html,"), Reso
urce::Raw); | 320 Resource* raw = RawResource::create(ResourceRequest("data:text/html,"), Reso
urce::Raw); |
| 239 | 321 |
| 240 // Create a non-null response. | 322 // Create a non-null response. |
| 241 ResourceResponse response = raw->response(); | 323 ResourceResponse response = raw->response(); |
| 242 response.setURL(KURL(ParsedURLString, "http://600.613/")); | 324 response.setURL(KURL(ParsedURLString, "http://600.613/")); |
| 243 raw->setResponse(response); | 325 raw->setResponse(response); |
| 244 raw->finish(); | 326 raw->finish(); |
| 245 EXPECT_FALSE(raw->response().isNull()); | 327 EXPECT_FALSE(raw->response().isNull()); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 | 375 |
| 294 TEST(RawResourceTest, CanReuseDevToolsEmulateNetworkConditionsClientIdHeader) | 376 TEST(RawResourceTest, CanReuseDevToolsEmulateNetworkConditionsClientIdHeader) |
| 295 { | 377 { |
| 296 ResourceRequest request("data:text/html,"); | 378 ResourceRequest request("data:text/html,"); |
| 297 request.setHTTPHeaderField(HTTPNames::X_DevTools_Emulate_Network_Conditions_
Client_Id, "Foo"); | 379 request.setHTTPHeaderField(HTTPNames::X_DevTools_Emulate_Network_Conditions_
Client_Id, "Foo"); |
| 298 Resource* raw = RawResource::create(request, Resource::Raw); | 380 Resource* raw = RawResource::create(request, Resource::Raw); |
| 299 EXPECT_TRUE(raw->canReuse(ResourceRequest("data:text/html,"))); | 381 EXPECT_TRUE(raw->canReuse(ResourceRequest("data:text/html,"))); |
| 300 } | 382 } |
| 301 | 383 |
| 302 } // namespace blink | 384 } // namespace blink |
| OLD | NEW |