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

Side by Side Diff: sky/engine/core/fetch/CachingCorrectnessTest.cpp

Issue 871383002: Merge HTMLDocument into Document (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 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 | « sky/engine/core/dom/Element.cpp ('k') | sky/engine/core/frame/LocalDOMWindow.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2014, Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "sky/engine/config.h"
32
33 #include "sky/engine/core/fetch/ImageResource.h"
34 #include "sky/engine/core/fetch/MemoryCache.h"
35 #include "sky/engine/core/fetch/Resource.h"
36 #include "sky/engine/core/fetch/ResourceFetcher.h"
37 #include "sky/engine/core/fetch/ResourcePtr.h"
38 #include "sky/engine/core/html/HTMLDocument.h"
39 #include "sky/engine/platform/network/ResourceRequest.h"
40 #include "sky/engine/public/platform/Platform.h"
41 #include "sky/engine/wtf/OwnPtr.h"
42 #include "sky/engine/wtf/RefPtr.h"
43
44 #include <gtest/gtest.h>
45
46 using namespace blink;
47
48 namespace {
49
50 // An URL for the original request.
51 const char kResourceURL[] = "http://resource.com/";
52
53 // The origin time of our first request.
54 const char kOriginalRequestDateAsString[] = "Thu, 25 May 1977 18:30:00 GMT";
55 const double kOriginalRequestDateAsDouble = 233433000.;
56
57 const char kOneDayBeforeOriginalRequest[] = "Wed, 24 May 1977 18:30:00 GMT";
58 const char kOneDayAfterOriginalRequest[] = "Fri, 26 May 1977 18:30:00 GMT";
59
60 const unsigned char kAConstUnsignedCharZero = 0;
61
62 class CachingCorrectnessTest : public ::testing::Test {
63 protected:
64 void advanceClock(double seconds)
65 {
66 m_proxyPlatform.advanceClock(seconds);
67 }
68
69 ResourcePtr<Resource> resourceFromResourceResponse(ResourceResponse response , Resource::Type type = Resource::Raw)
70 {
71 if (response.url().isNull())
72 response.setURL(KURL(ParsedURLString, kResourceURL));
73 ResourcePtr<Resource> resource =
74 new Resource(ResourceRequest(response.url()), type);
75 resource->setResponse(response);
76 memoryCache()->add(resource.get());
77
78 return resource;
79 }
80
81 ResourcePtr<Resource> resourceFromResourceRequest(ResourceRequest request, R esource::Type type = Resource::Raw)
82 {
83 if (request.url().isNull())
84 request.setURL(KURL(ParsedURLString, kResourceURL));
85 ResourcePtr<Resource> resource =
86 new Resource(request, type);
87 resource->setResponse(ResourceResponse(KURL(ParsedURLString, kResourceUR L), "text/html", 0, nullAtom, String()));
88 memoryCache()->add(resource.get());
89
90 return resource;
91 }
92
93 ResourcePtr<Resource> fetchImage()
94 {
95 FetchRequest fetchRequest(ResourceRequest(KURL(ParsedURLString, kResourc eURL)), FetchInitiatorInfo());
96 return m_fetcher->fetchImage(fetchRequest);
97 }
98
99 ResourceFetcher* fetcher() const { return m_fetcher.get(); }
100
101 private:
102 // A simple platform that mocks out the clock, for cache freshness testing.
103 class ProxyPlatform : public blink::Platform {
104 public:
105 ProxyPlatform() : m_elapsedSeconds(0.) { }
106
107 void advanceClock(double seconds)
108 {
109 m_elapsedSeconds += seconds;
110 }
111
112 private:
113 // From blink::Platform:
114 virtual double currentTime()
115 {
116 return kOriginalRequestDateAsDouble + m_elapsedSeconds;
117 }
118
119 // These blink::Platform methods must be overriden to make a usable obje ct.
120 virtual const unsigned char* getTraceCategoryEnabledFlag(const char* cat egoryName)
121 {
122 return &kAConstUnsignedCharZero;
123 }
124
125 double m_elapsedSeconds;
126 };
127
128 virtual void SetUp()
129 {
130 m_savedPlatform = blink::Platform::current();
131 blink::Platform::initialize(&m_proxyPlatform);
132
133 // Save the global memory cache to restore it upon teardown.
134 m_globalMemoryCache = replaceMemoryCacheForTesting(MemoryCache::create() );
135
136 // Create a ResourceFetcher that has a real Document, but is not attache d to a LocalFrame.
137 const KURL kDocumentURL(ParsedURLString, "http://document.com/");
138 m_document = HTMLDocument::create();
139 m_fetcher = ResourceFetcher::create(m_document.get());
140 }
141
142 virtual void TearDown()
143 {
144 memoryCache()->evictResources();
145
146 // Yield the ownership of the global memory cache back.
147 replaceMemoryCacheForTesting(m_globalMemoryCache.release());
148
149 blink::Platform::initialize(m_savedPlatform);
150 }
151
152 blink::Platform* m_savedPlatform;
153 ProxyPlatform m_proxyPlatform;
154
155 OwnPtr<MemoryCache> m_globalMemoryCache;
156
157 RefPtr<HTMLDocument> m_document;
158 RefPtr<ResourceFetcher> m_fetcher;
159 };
160
161 TEST_F(CachingCorrectnessTest, FreshFromLastModified)
162 {
163 ResourceResponse fresh200Response;
164 fresh200Response.setHTTPStatusCode(200);
165 fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
166 fresh200Response.setHTTPHeaderField("Last-Modified", kOneDayBeforeOriginalRe quest);
167
168 ResourcePtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Respon se);
169
170 // Advance the clock within the implicit freshness period of this resource b efore we make a request.
171 advanceClock(600.);
172
173 ResourcePtr<Resource> fetched = fetch();
174 EXPECT_EQ(fresh200, fetched);
175 }
176
177 TEST_F(CachingCorrectnessTest, FreshFromExpires)
178 {
179 ResourceResponse fresh200Response;
180 fresh200Response.setHTTPStatusCode(200);
181 fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
182 fresh200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
183
184 ResourcePtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Respon se);
185
186 // Advance the clock within the freshness period of this resource before we make a request.
187 advanceClock(24. * 60. * 60. - 15.);
188
189 ResourcePtr<Resource> fetched = fetch();
190 EXPECT_EQ(fresh200, fetched);
191 }
192
193 TEST_F(CachingCorrectnessTest, FreshFromMaxAge)
194 {
195 ResourceResponse fresh200Response;
196 fresh200Response.setHTTPStatusCode(200);
197 fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
198 fresh200Response.setHTTPHeaderField("Cache-Control", "max-age=600");
199
200 ResourcePtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Respon se);
201
202 // Advance the clock within the freshness period of this resource before we make a request.
203 advanceClock(500.);
204
205 ResourcePtr<Resource> fetched = fetch();
206 EXPECT_EQ(fresh200, fetched);
207 }
208
209 // The strong validator causes a revalidation to be launched, and the proxy and original resources leak because of their reference loop.
210 TEST_F(CachingCorrectnessTest, DISABLED_ExpiredFromLastModified)
211 {
212 ResourceResponse expired200Response;
213 expired200Response.setHTTPStatusCode(200);
214 expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
215 expired200Response.setHTTPHeaderField("Last-Modified", kOneDayBeforeOriginal Request);
216
217 ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Re sponse);
218
219 // Advance the clock beyond the implicit freshness period.
220 advanceClock(24. * 60. * 60. * 0.2);
221
222 ResourcePtr<Resource> fetched = fetch();
223 EXPECT_NE(expired200, fetched);
224 }
225
226 TEST_F(CachingCorrectnessTest, ExpiredFromExpires)
227 {
228 ResourceResponse expired200Response;
229 expired200Response.setHTTPStatusCode(200);
230 expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
231 expired200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest );
232
233 ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Re sponse);
234
235 // Advance the clock within the expiredness period of this resource before w e make a request.
236 advanceClock(24. * 60. * 60. + 15.);
237
238 ResourcePtr<Resource> fetched = fetch();
239 EXPECT_NE(expired200, fetched);
240 }
241
242 // If the image hasn't been loaded in this "document" before, then it shouldn't have list of available images logic.
243 TEST_F(CachingCorrectnessTest, NewImageExpiredFromExpires)
244 {
245 ResourceResponse expired200Response;
246 expired200Response.setHTTPStatusCode(200);
247 expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
248 expired200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest );
249
250 ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Re sponse, Resource::Image);
251
252 // Advance the clock within the expiredness period of this resource before w e make a request.
253 advanceClock(24. * 60. * 60. + 15.);
254
255 ResourcePtr<Resource> fetched = fetchImage();
256 EXPECT_NE(expired200, fetched);
257 }
258
259 // If the image has been loaded in this "document" before, then it should have l ist of available images logic, and so
260 // normal cache testing should be bypassed.
261 TEST_F(CachingCorrectnessTest, ReuseImageExpiredFromExpires)
262 {
263 ResourceResponse expired200Response;
264 expired200Response.setHTTPStatusCode(200);
265 expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
266 expired200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest );
267
268 ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Re sponse, Resource::Image);
269
270 // Advance the clock within the freshness period, and make a request to add this image to the document resources.
271 advanceClock(15.);
272 ResourcePtr<Resource> firstFetched = fetchImage();
273 EXPECT_EQ(expired200, firstFetched);
274
275 // Advance the clock within the expiredness period of this resource before w e make a request.
276 advanceClock(24. * 60. * 60. + 15.);
277
278 ResourcePtr<Resource> fetched = fetchImage();
279 EXPECT_EQ(expired200, fetched);
280 }
281
282 TEST_F(CachingCorrectnessTest, ExpiredFromMaxAge)
283 {
284 ResourceResponse expired200Response;
285 expired200Response.setHTTPStatusCode(200);
286 expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
287 expired200Response.setHTTPHeaderField("Cache-Control", "max-age=600");
288
289 ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Re sponse);
290
291 // Advance the clock within the expiredness period of this resource before w e make a request.
292 advanceClock(700.);
293
294 ResourcePtr<Resource> fetched = fetch();
295 EXPECT_NE(expired200, fetched);
296 }
297
298 TEST_F(CachingCorrectnessTest, FreshButNoCache)
299 {
300 ResourceResponse fresh200NocacheResponse;
301 fresh200NocacheResponse.setHTTPStatusCode(200);
302 fresh200NocacheResponse.setHTTPHeaderField("Date", kOriginalRequestDateAsStr ing);
303 fresh200NocacheResponse.setHTTPHeaderField("Expires", kOneDayAfterOriginalRe quest);
304 fresh200NocacheResponse.setHTTPHeaderField("Cache-Control", "no-cache");
305
306 ResourcePtr<Resource> fresh200Nocache = resourceFromResourceResponse(fresh20 0NocacheResponse);
307
308 // Advance the clock within the freshness period of this resource before we make a request.
309 advanceClock(24. * 60. * 60. - 15.);
310
311 ResourcePtr<Resource> fetched = fetch();
312 EXPECT_NE(fresh200Nocache, fetched);
313 }
314
315 TEST_F(CachingCorrectnessTest, RequestWithNoCahe)
316 {
317 ResourceRequest noCacheRequest;
318 noCacheRequest.setHTTPHeaderField("Cache-Control", "no-cache");
319 ResourcePtr<Resource> noCacheResource = resourceFromResourceRequest(noCacheR equest);
320 ResourcePtr<Resource> fetched = fetch();
321 EXPECT_NE(noCacheResource, fetched);
322 }
323
324 TEST_F(CachingCorrectnessTest, FreshButNoStore)
325 {
326 ResourceResponse fresh200NostoreResponse;
327 fresh200NostoreResponse.setHTTPStatusCode(200);
328 fresh200NostoreResponse.setHTTPHeaderField("Date", kOriginalRequestDateAsStr ing);
329 fresh200NostoreResponse.setHTTPHeaderField("Expires", kOneDayAfterOriginalRe quest);
330 fresh200NostoreResponse.setHTTPHeaderField("Cache-Control", "no-store");
331
332 ResourcePtr<Resource> fresh200Nostore = resourceFromResourceResponse(fresh20 0NostoreResponse);
333
334 // Advance the clock within the freshness period of this resource before we make a request.
335 advanceClock(24. * 60. * 60. - 15.);
336
337 ResourcePtr<Resource> fetched = fetch();
338 EXPECT_NE(fresh200Nostore, fetched);
339 }
340
341 TEST_F(CachingCorrectnessTest, RequestWithNoStore)
342 {
343 ResourceRequest noStoreRequest;
344 noStoreRequest.setHTTPHeaderField("Cache-Control", "no-store");
345 ResourcePtr<Resource> noStoreResource = resourceFromResourceRequest(noStoreR equest);
346 ResourcePtr<Resource> fetched = fetch();
347 EXPECT_NE(noStoreResource, fetched);
348 }
349
350 // FIXME: Determine if ignoring must-revalidate for blink is correct behaviour.
351 // See crbug.com/340088 .
352 TEST_F(CachingCorrectnessTest, DISABLED_FreshButMustRevalidate)
353 {
354 ResourceResponse fresh200MustRevalidateResponse;
355 fresh200MustRevalidateResponse.setHTTPStatusCode(200);
356 fresh200MustRevalidateResponse.setHTTPHeaderField("Date", kOriginalRequestDa teAsString);
357 fresh200MustRevalidateResponse.setHTTPHeaderField("Expires", kOneDayAfterOri ginalRequest);
358 fresh200MustRevalidateResponse.setHTTPHeaderField("Cache-Control", "must-rev alidate");
359
360 ResourcePtr<Resource> fresh200MustRevalidate = resourceFromResourceResponse( fresh200MustRevalidateResponse);
361
362 // Advance the clock within the freshness period of this resource before we make a request.
363 advanceClock(24. * 60. * 60. - 15.);
364
365 ResourcePtr<Resource> fetched = fetch();
366 EXPECT_NE(fresh200MustRevalidate, fetched);
367 }
368
369 TEST_F(CachingCorrectnessTest, FreshWithFreshRedirect)
370 {
371 KURL redirectUrl(ParsedURLString, kResourceURL);
372 const char redirectTargetUrlString[] = "http://redirect-target.com";
373 KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
374
375 ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectU rl), Resource::Raw);
376
377 ResourceResponse fresh301Response;
378 fresh301Response.setURL(redirectUrl);
379 fresh301Response.setHTTPStatusCode(301);
380 fresh301Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
381 fresh301Response.setHTTPHeaderField("Location", redirectTargetUrlString);
382 fresh301Response.setHTTPHeaderField("Cache-Control", "max-age=600");
383
384 // Add the redirect to our request.
385 ResourceRequest redirectRequest = ResourceRequest(redirectTargetUrl);
386 firstResource->willSendRequest(redirectRequest, fresh301Response);
387
388 // Add the final response to our request.
389 ResourceResponse fresh200Response;
390 fresh200Response.setURL(redirectTargetUrl);
391 fresh200Response.setHTTPStatusCode(200);
392 fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
393 fresh200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
394
395 firstResource->setResponse(fresh200Response);
396 memoryCache()->add(firstResource.get());
397
398 advanceClock(500.);
399
400 ResourcePtr<Resource> fetched = fetch();
401 EXPECT_EQ(firstResource, fetched);
402 }
403
404 TEST_F(CachingCorrectnessTest, FreshWithStaleRedirect)
405 {
406 KURL redirectUrl(ParsedURLString, kResourceURL);
407 const char redirectTargetUrlString[] = "http://redirect-target.com";
408 KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
409
410 ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectU rl), Resource::Raw);
411
412 ResourceResponse stale301Response;
413 stale301Response.setURL(redirectUrl);
414 stale301Response.setHTTPStatusCode(301);
415 stale301Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
416 stale301Response.setHTTPHeaderField("Location", redirectTargetUrlString);
417
418 // Add the redirect to our request.
419 ResourceRequest redirectRequest = ResourceRequest(redirectTargetUrl);
420 firstResource->willSendRequest(redirectRequest, stale301Response);
421
422 // Add the final response to our request.
423 ResourceResponse fresh200Response;
424 fresh200Response.setURL(redirectTargetUrl);
425 fresh200Response.setHTTPStatusCode(200);
426 fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
427 fresh200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
428
429 firstResource->setResponse(fresh200Response);
430 memoryCache()->add(firstResource.get());
431
432 advanceClock(500.);
433
434 ResourcePtr<Resource> fetched = fetch();
435 EXPECT_NE(firstResource, fetched);
436 }
437
438 TEST_F(CachingCorrectnessTest, 302RedirectNotImplicitlyFresh)
439 {
440 KURL redirectUrl(ParsedURLString, kResourceURL);
441 const char redirectTargetUrlString[] = "http://redirect-target.com";
442 KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
443
444 ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectU rl), Resource::Raw);
445
446 ResourceResponse fresh302Response;
447 fresh302Response.setURL(redirectUrl);
448 fresh302Response.setHTTPStatusCode(302);
449 fresh302Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
450 fresh302Response.setHTTPHeaderField("Last-Modified", kOneDayBeforeOriginalRe quest);
451 fresh302Response.setHTTPHeaderField("Location", redirectTargetUrlString);
452
453 // Add the redirect to our request.
454 ResourceRequest redirectRequest = ResourceRequest(redirectTargetUrl);
455 firstResource->willSendRequest(redirectRequest, fresh302Response);
456
457 // Add the final response to our request.
458 ResourceResponse fresh200Response;
459 fresh200Response.setURL(redirectTargetUrl);
460 fresh200Response.setHTTPStatusCode(200);
461 fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
462 fresh200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
463
464 firstResource->setResponse(fresh200Response);
465 memoryCache()->add(firstResource.get());
466
467 advanceClock(500.);
468
469 ResourcePtr<Resource> fetched = fetch();
470 EXPECT_NE(firstResource, fetched);
471 }
472
473 TEST_F(CachingCorrectnessTest, 302RedirectExplicitlyFreshMaxAge)
474 {
475 KURL redirectUrl(ParsedURLString, kResourceURL);
476 const char redirectTargetUrlString[] = "http://redirect-target.com";
477 KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
478
479 ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectU rl), Resource::Raw);
480
481 ResourceResponse fresh302Response;
482 fresh302Response.setURL(redirectUrl);
483 fresh302Response.setHTTPStatusCode(302);
484 fresh302Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
485 fresh302Response.setHTTPHeaderField("Cache-Control", "max-age=600");
486 fresh302Response.setHTTPHeaderField("Location", redirectTargetUrlString);
487
488 // Add the redirect to our request.
489 ResourceRequest redirectRequest = ResourceRequest(redirectTargetUrl);
490 firstResource->willSendRequest(redirectRequest, fresh302Response);
491
492 // Add the final response to our request.
493 ResourceResponse fresh200Response;
494 fresh200Response.setURL(redirectTargetUrl);
495 fresh200Response.setHTTPStatusCode(200);
496 fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
497 fresh200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
498
499 firstResource->setResponse(fresh200Response);
500 memoryCache()->add(firstResource.get());
501
502 advanceClock(500.);
503
504 ResourcePtr<Resource> fetched = fetch();
505 EXPECT_EQ(firstResource, fetched);
506 }
507
508 TEST_F(CachingCorrectnessTest, 302RedirectExplicitlyFreshExpires)
509 {
510 KURL redirectUrl(ParsedURLString, kResourceURL);
511 const char redirectTargetUrlString[] = "http://redirect-target.com";
512 KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
513
514 ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectU rl), Resource::Raw);
515
516 ResourceResponse fresh302Response;
517 fresh302Response.setURL(redirectUrl);
518 fresh302Response.setHTTPStatusCode(302);
519 fresh302Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
520 fresh302Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
521 fresh302Response.setHTTPHeaderField("Location", redirectTargetUrlString);
522
523 // Add the redirect to our request.
524 ResourceRequest redirectRequest = ResourceRequest(redirectTargetUrl);
525 firstResource->willSendRequest(redirectRequest, fresh302Response);
526
527 // Add the final response to our request.
528 ResourceResponse fresh200Response;
529 fresh200Response.setURL(redirectTargetUrl);
530 fresh200Response.setHTTPStatusCode(200);
531 fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
532 fresh200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
533
534 firstResource->setResponse(fresh200Response);
535 memoryCache()->add(firstResource.get());
536
537 advanceClock(500.);
538
539 ResourcePtr<Resource> fetched = fetch();
540 EXPECT_EQ(firstResource, fetched);
541 }
542
543 } // namespace
OLDNEW
« no previous file with comments | « sky/engine/core/dom/Element.cpp ('k') | sky/engine/core/frame/LocalDOMWindow.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698