| OLD | NEW |
| 1 /* | 1 /* |
| 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) | 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) |
| 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) | 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) |
| 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) | 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) |
| 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
rights reserved. | 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
rights reserved. |
| 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ | 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ |
| 7 | 7 |
| 8 This library is free software; you can redistribute it and/or | 8 This library is free software; you can redistribute it and/or |
| 9 modify it under the terms of the GNU Library General Public | 9 modify it under the terms of the GNU Library General Public |
| 10 License as published by the Free Software Foundation; either | 10 License as published by the Free Software Foundation; either |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 | 295 |
| 296 const RevalidationPolicy policy = determineRevalidationPolicy(factory.type()
, request, resource.get()); | 296 const RevalidationPolicy policy = determineRevalidationPolicy(factory.type()
, request, resource.get()); |
| 297 switch (policy) { | 297 switch (policy) { |
| 298 case Reload: | 298 case Reload: |
| 299 memoryCache()->remove(resource.get()); | 299 memoryCache()->remove(resource.get()); |
| 300 // Fall through | 300 // Fall through |
| 301 case Load: | 301 case Load: |
| 302 resource = createResourceForLoading(request, request.charset(), factory)
; | 302 resource = createResourceForLoading(request, request.charset(), factory)
; |
| 303 break; | 303 break; |
| 304 case Revalidate: | 304 case Revalidate: |
| 305 initializeRevalidation(request, resource.get()); | 305 resource = createResourceForRevalidation(request, resource.get(), factor
y); |
| 306 break; | 306 break; |
| 307 case Use: | 307 case Use: |
| 308 memoryCache()->updateForAccess(resource.get()); | 308 memoryCache()->updateForAccess(resource.get()); |
| 309 break; | 309 break; |
| 310 } | 310 } |
| 311 | 311 |
| 312 if (!resource) | 312 if (!resource) |
| 313 return nullptr; | 313 return nullptr; |
| 314 if (resource->type() != factory.type()) { | 314 if (resource->type() != factory.type()) { |
| 315 ASSERT(request.forPreload()); | 315 ASSERT(request.forPreload()); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 if (request.cachePolicy() == UseProtocolCachePolicy) | 396 if (request.cachePolicy() == UseProtocolCachePolicy) |
| 397 request.setCachePolicy(context().resourceRequestCachePolicy(request, typ
e)); | 397 request.setCachePolicy(context().resourceRequestCachePolicy(request, typ
e)); |
| 398 if (request.requestContext() == WebURLRequest::RequestContextUnspecified) | 398 if (request.requestContext() == WebURLRequest::RequestContextUnspecified) |
| 399 determineRequestContext(request, type); | 399 determineRequestContext(request, type); |
| 400 if (type == Resource::LinkPrefetch || type == Resource::LinkSubresource) | 400 if (type == Resource::LinkPrefetch || type == Resource::LinkSubresource) |
| 401 request.setHTTPHeaderField("Purpose", "prefetch"); | 401 request.setHTTPHeaderField("Purpose", "prefetch"); |
| 402 | 402 |
| 403 context().addAdditionalRequestHeaders(request, (type == Resource::MainResour
ce) ? FetchMainResource : FetchSubresource); | 403 context().addAdditionalRequestHeaders(request, (type == Resource::MainResour
ce) ? FetchMainResource : FetchSubresource); |
| 404 } | 404 } |
| 405 | 405 |
| 406 void ResourceFetcher::initializeRevalidation(const FetchRequest& request, Resour
ce* resource) | 406 ResourcePtr<Resource> ResourceFetcher::createResourceForRevalidation(const Fetch
Request& request, Resource* resource, const ResourceFactory& factory) |
| 407 { | 407 { |
| 408 ASSERT(resource); | 408 ASSERT(resource); |
| 409 ASSERT(memoryCache()->contains(resource)); | 409 ASSERT(memoryCache()->contains(resource)); |
| 410 ASSERT(resource->isLoaded()); | 410 ASSERT(resource->isLoaded()); |
| 411 ASSERT(resource->canUseCacheValidator()); | 411 ASSERT(resource->canUseCacheValidator()); |
| 412 ASSERT(!resource->isCacheValidator()); | 412 ASSERT(!resource->resourceToRevalidate()); |
| 413 ASSERT(!context().isControlledByServiceWorker()); | 413 ASSERT(!context().isControlledByServiceWorker()); |
| 414 | 414 |
| 415 ResourceRequest revalidatingRequest(resource->resourceRequest()); | 415 ResourceRequest revalidatingRequest(resource->resourceRequest()); |
| 416 revalidatingRequest.clearHTTPReferrer(); | 416 revalidatingRequest.clearHTTPReferrer(); |
| 417 addAdditionalRequestHeaders(revalidatingRequest, resource->type()); | 417 addAdditionalRequestHeaders(revalidatingRequest, resource->type()); |
| 418 | 418 |
| 419 const AtomicString& lastModified = resource->response().httpHeaderField("Las
t-Modified"); | 419 const AtomicString& lastModified = resource->response().httpHeaderField("Las
t-Modified"); |
| 420 const AtomicString& eTag = resource->response().httpHeaderField("ETag"); | 420 const AtomicString& eTag = resource->response().httpHeaderField("ETag"); |
| 421 if (!lastModified.isEmpty() || !eTag.isEmpty()) { | 421 if (!lastModified.isEmpty() || !eTag.isEmpty()) { |
| 422 ASSERT(context().cachePolicy() != CachePolicyReload); | 422 ASSERT(context().cachePolicy() != CachePolicyReload); |
| 423 if (context().cachePolicy() == CachePolicyRevalidate) | 423 if (context().cachePolicy() == CachePolicyRevalidate) |
| 424 revalidatingRequest.setHTTPHeaderField("Cache-Control", "max-age=0")
; | 424 revalidatingRequest.setHTTPHeaderField("Cache-Control", "max-age=0")
; |
| 425 } | 425 } |
| 426 if (!lastModified.isEmpty()) | 426 if (!lastModified.isEmpty()) |
| 427 revalidatingRequest.setHTTPHeaderField("If-Modified-Since", lastModified
); | 427 revalidatingRequest.setHTTPHeaderField("If-Modified-Since", lastModified
); |
| 428 if (!eTag.isEmpty()) | 428 if (!eTag.isEmpty()) |
| 429 revalidatingRequest.setHTTPHeaderField("If-None-Match", eTag); | 429 revalidatingRequest.setHTTPHeaderField("If-None-Match", eTag); |
| 430 | 430 |
| 431 double stalenessLifetime = resource->stalenessLifetime(); | 431 double stalenessLifetime = resource->stalenessLifetime(); |
| 432 if (std::isfinite(stalenessLifetime) && stalenessLifetime > 0) { | 432 if (std::isfinite(stalenessLifetime) && stalenessLifetime > 0) { |
| 433 revalidatingRequest.setHTTPHeaderField("Resource-Freshness", AtomicStrin
g(String::format("max-age=%.0lf,stale-while-revalidate=%.0lf,age=%.0lf", resourc
e->freshnessLifetime(), stalenessLifetime, resource->currentAge()))); | 433 revalidatingRequest.setHTTPHeaderField("Resource-Freshness", AtomicStrin
g(String::format("max-age=%.0lf,stale-while-revalidate=%.0lf,age=%.0lf", resourc
e->freshnessLifetime(), stalenessLifetime, resource->currentAge()))); |
| 434 } | 434 } |
| 435 | 435 |
| 436 resource->setRevalidatingRequest(revalidatingRequest); | 436 ResourcePtr<Resource> newResource = factory.create(revalidatingRequest, reso
urce->encoding()); |
| 437 WTF_LOG(ResourceLoading, "Resource %p created to revalidate %p", newResource
.get(), resource); |
| 438 |
| 439 newResource->setResourceToRevalidate(resource); |
| 440 newResource->setCacheIdentifier(resource->cacheIdentifier()); |
| 441 |
| 442 memoryCache()->remove(resource); |
| 443 memoryCache()->add(newResource.get()); |
| 444 return newResource; |
| 437 } | 445 } |
| 438 | 446 |
| 439 ResourcePtr<Resource> ResourceFetcher::createResourceForLoading(FetchRequest& re
quest, const String& charset, const ResourceFactory& factory) | 447 ResourcePtr<Resource> ResourceFetcher::createResourceForLoading(FetchRequest& re
quest, const String& charset, const ResourceFactory& factory) |
| 440 { | 448 { |
| 441 const String cacheIdentifier = getCacheIdentifier(); | 449 const String cacheIdentifier = getCacheIdentifier(); |
| 442 ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url(), cache
Identifier)); | 450 ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url(), cache
Identifier)); |
| 443 | 451 |
| 444 WTF_LOG(ResourceLoading, "Loading Resource for '%s'.", request.resourceReque
st().url().elidedString().latin1().data()); | 452 WTF_LOG(ResourceLoading, "Loading Resource for '%s'.", request.resourceReque
st().url().elidedString().latin1().data()); |
| 445 | 453 |
| 446 addAdditionalRequestHeaders(request.mutableResourceRequest(), factory.type()
); | 454 addAdditionalRequestHeaders(request.mutableResourceRequest(), factory.type()
); |
| 447 ResourcePtr<Resource> resource = factory.create(request.resourceRequest(), c
harset); | 455 ResourcePtr<Resource> resource = factory.create(request.resourceRequest(), c
harset); |
| 448 resource->setCacheIdentifier(cacheIdentifier); | 456 resource->setCacheIdentifier(cacheIdentifier); |
| 449 | 457 |
| 450 memoryCache()->add(resource.get()); | 458 memoryCache()->add(resource.get()); |
| 451 return resource; | 459 return resource; |
| 452 } | 460 } |
| 453 | 461 |
| 454 void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource
) | 462 void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource
) |
| 455 { | 463 { |
| 456 if (resource->options().initiatorInfo.name == FetchInitiatorTypeNames::inter
nal) | 464 if (resource->options().initiatorInfo.name == FetchInitiatorTypeNames::inter
nal) |
| 457 return; | 465 return; |
| 458 | 466 |
| 459 OwnPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(resource->optio
ns().initiatorInfo.name, monotonicallyIncreasingTime(), resource->type() == Reso
urce::MainResource); | 467 OwnPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(resource->optio
ns().initiatorInfo.name, monotonicallyIncreasingTime(), resource->type() == Reso
urce::MainResource); |
| 460 | 468 |
| 461 if (resource->isCacheValidator()) { | 469 if (resource->isCacheValidator()) { |
| 462 const AtomicString& timingAllowOrigin = resource->response().httpHeaderF
ield("Timing-Allow-Origin"); | 470 const AtomicString& timingAllowOrigin = resource->resourceToRevalidate()
->response().httpHeaderField("Timing-Allow-Origin"); |
| 463 if (!timingAllowOrigin.isEmpty()) | 471 if (!timingAllowOrigin.isEmpty()) |
| 464 info->setOriginalTimingAllowOrigin(timingAllowOrigin); | 472 info->setOriginalTimingAllowOrigin(timingAllowOrigin); |
| 465 } | 473 } |
| 466 | 474 |
| 467 if (resource->type() != Resource::MainResource || context().updateTimingInfo
ForIFrameNavigation(info.get())) | 475 if (resource->type() != Resource::MainResource || context().updateTimingInfo
ForIFrameNavigation(info.get())) |
| 468 m_resourceTimingInfoMap.add(resource, info.release()); | 476 m_resourceTimingInfoMap.add(resource, info.release()); |
| 469 } | 477 } |
| 470 | 478 |
| 471 ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy
(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResour
ce) const | 479 ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy
(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResour
ce) const |
| 472 { | 480 { |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 | 1052 |
| 1045 DEFINE_TRACE(ResourceFetcher) | 1053 DEFINE_TRACE(ResourceFetcher) |
| 1046 { | 1054 { |
| 1047 visitor->trace(m_context); | 1055 visitor->trace(m_context); |
| 1048 visitor->trace(m_archiveResourceCollection); | 1056 visitor->trace(m_archiveResourceCollection); |
| 1049 visitor->trace(m_loaders); | 1057 visitor->trace(m_loaders); |
| 1050 visitor->trace(m_nonBlockingLoaders); | 1058 visitor->trace(m_nonBlockingLoaders); |
| 1051 } | 1059 } |
| 1052 | 1060 |
| 1053 } | 1061 } |
| OLD | NEW |