| 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 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 | 369 |
| 370 const RevalidationPolicy policy = determineRevalidationPolicy(factory.type()
, request, resource.get(), isStaticData); | 370 const RevalidationPolicy policy = determineRevalidationPolicy(factory.type()
, request, resource.get(), isStaticData); |
| 371 switch (policy) { | 371 switch (policy) { |
| 372 case Reload: | 372 case Reload: |
| 373 memoryCache()->remove(resource.get()); | 373 memoryCache()->remove(resource.get()); |
| 374 // Fall through | 374 // Fall through |
| 375 case Load: | 375 case Load: |
| 376 resource = createResourceForLoading(request, request.charset(), factory)
; | 376 resource = createResourceForLoading(request, request.charset(), factory)
; |
| 377 break; | 377 break; |
| 378 case Revalidate: | 378 case Revalidate: |
| 379 resource = createResourceForRevalidation(request, resource.get(), factor
y); | 379 initializeRevalidation(request, resource.get()); |
| 380 break; | 380 break; |
| 381 case Use: | 381 case Use: |
| 382 memoryCache()->updateForAccess(resource.get()); | 382 memoryCache()->updateForAccess(resource.get()); |
| 383 break; | 383 break; |
| 384 } | 384 } |
| 385 | 385 |
| 386 if (!resource) | 386 if (!resource) |
| 387 return nullptr; | 387 return nullptr; |
| 388 if (resource->type() != factory.type()) { | 388 if (resource->type() != factory.type()) { |
| 389 ASSERT(request.forPreload()); | 389 ASSERT(request.forPreload()); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 if (request.cachePolicy() == UseProtocolCachePolicy) | 468 if (request.cachePolicy() == UseProtocolCachePolicy) |
| 469 request.setCachePolicy(context().resourceRequestCachePolicy(request, typ
e)); | 469 request.setCachePolicy(context().resourceRequestCachePolicy(request, typ
e)); |
| 470 if (request.requestContext() == WebURLRequest::RequestContextUnspecified) | 470 if (request.requestContext() == WebURLRequest::RequestContextUnspecified) |
| 471 determineRequestContext(request, type); | 471 determineRequestContext(request, type); |
| 472 if (type == Resource::LinkPrefetch || type == Resource::LinkSubresource) | 472 if (type == Resource::LinkPrefetch || type == Resource::LinkSubresource) |
| 473 request.setHTTPHeaderField("Purpose", "prefetch"); | 473 request.setHTTPHeaderField("Purpose", "prefetch"); |
| 474 | 474 |
| 475 context().addAdditionalRequestHeaders(request, (type == Resource::MainResour
ce) ? FetchMainResource : FetchSubresource); | 475 context().addAdditionalRequestHeaders(request, (type == Resource::MainResour
ce) ? FetchMainResource : FetchSubresource); |
| 476 } | 476 } |
| 477 | 477 |
| 478 ResourcePtr<Resource> ResourceFetcher::createResourceForRevalidation(const Fetch
Request& request, Resource* resource, const ResourceFactory& factory) | 478 void ResourceFetcher::initializeRevalidation(const FetchRequest& request, Resour
ce* resource) |
| 479 { | 479 { |
| 480 ASSERT(resource); | 480 ASSERT(resource); |
| 481 ASSERT(memoryCache()->contains(resource)); | 481 ASSERT(memoryCache()->contains(resource)); |
| 482 ASSERT(resource->isLoaded()); | 482 ASSERT(resource->isLoaded()); |
| 483 ASSERT(resource->canUseCacheValidator()); | 483 ASSERT(resource->canUseCacheValidator()); |
| 484 ASSERT(!resource->resourceToRevalidate()); | 484 ASSERT(!resource->isCacheValidator()); |
| 485 ASSERT(!context().isControlledByServiceWorker()); | 485 ASSERT(!context().isControlledByServiceWorker()); |
| 486 | 486 |
| 487 ResourceRequest revalidatingRequest(resource->resourceRequest()); | 487 ResourceRequest revalidatingRequest(resource->resourceRequest()); |
| 488 revalidatingRequest.clearHTTPReferrer(); | 488 revalidatingRequest.clearHTTPReferrer(); |
| 489 initializeResourceRequest(revalidatingRequest, resource->type()); | 489 initializeResourceRequest(revalidatingRequest, resource->type()); |
| 490 | 490 |
| 491 const AtomicString& lastModified = resource->response().httpHeaderField("Las
t-Modified"); | 491 const AtomicString& lastModified = resource->response().httpHeaderField("Las
t-Modified"); |
| 492 const AtomicString& eTag = resource->response().httpHeaderField("ETag"); | 492 const AtomicString& eTag = resource->response().httpHeaderField("ETag"); |
| 493 if (!lastModified.isEmpty() || !eTag.isEmpty()) { | 493 if (!lastModified.isEmpty() || !eTag.isEmpty()) { |
| 494 ASSERT(context().cachePolicy() != CachePolicyReload); | 494 ASSERT(context().cachePolicy() != CachePolicyReload); |
| 495 if (context().cachePolicy() == CachePolicyRevalidate) | 495 if (context().cachePolicy() == CachePolicyRevalidate) |
| 496 revalidatingRequest.setHTTPHeaderField("Cache-Control", "max-age=0")
; | 496 revalidatingRequest.setHTTPHeaderField("Cache-Control", "max-age=0")
; |
| 497 } | 497 } |
| 498 if (!lastModified.isEmpty()) | 498 if (!lastModified.isEmpty()) |
| 499 revalidatingRequest.setHTTPHeaderField("If-Modified-Since", lastModified
); | 499 revalidatingRequest.setHTTPHeaderField("If-Modified-Since", lastModified
); |
| 500 if (!eTag.isEmpty()) | 500 if (!eTag.isEmpty()) |
| 501 revalidatingRequest.setHTTPHeaderField("If-None-Match", eTag); | 501 revalidatingRequest.setHTTPHeaderField("If-None-Match", eTag); |
| 502 | 502 |
| 503 double stalenessLifetime = resource->stalenessLifetime(); | 503 double stalenessLifetime = resource->stalenessLifetime(); |
| 504 if (std::isfinite(stalenessLifetime) && stalenessLifetime > 0) { | 504 if (std::isfinite(stalenessLifetime) && stalenessLifetime > 0) { |
| 505 revalidatingRequest.setHTTPHeaderField("Resource-Freshness", AtomicStrin
g(String::format("max-age=%.0lf,stale-while-revalidate=%.0lf,age=%.0lf", resourc
e->freshnessLifetime(), stalenessLifetime, resource->currentAge()))); | 505 revalidatingRequest.setHTTPHeaderField("Resource-Freshness", AtomicStrin
g(String::format("max-age=%.0lf,stale-while-revalidate=%.0lf,age=%.0lf", resourc
e->freshnessLifetime(), stalenessLifetime, resource->currentAge()))); |
| 506 } | 506 } |
| 507 | 507 |
| 508 ResourcePtr<Resource> newResource = factory.create(revalidatingRequest, reso
urce->encoding()); | 508 resource->setRevalidatingRequest(revalidatingRequest); |
| 509 WTF_LOG(ResourceLoading, "Resource %p created to revalidate %p", newResource
.get(), resource); | |
| 510 | |
| 511 newResource->setResourceToRevalidate(resource); | |
| 512 newResource->setCacheIdentifier(resource->cacheIdentifier()); | |
| 513 | |
| 514 memoryCache()->remove(resource); | |
| 515 memoryCache()->add(newResource.get()); | |
| 516 return newResource; | |
| 517 } | 509 } |
| 518 | 510 |
| 519 ResourcePtr<Resource> ResourceFetcher::createResourceForLoading(FetchRequest& re
quest, const String& charset, const ResourceFactory& factory) | 511 ResourcePtr<Resource> ResourceFetcher::createResourceForLoading(FetchRequest& re
quest, const String& charset, const ResourceFactory& factory) |
| 520 { | 512 { |
| 521 const String cacheIdentifier = getCacheIdentifier(); | 513 const String cacheIdentifier = getCacheIdentifier(); |
| 522 ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url(), cache
Identifier)); | 514 ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url(), cache
Identifier)); |
| 523 | 515 |
| 524 WTF_LOG(ResourceLoading, "Loading Resource for '%s'.", request.resourceReque
st().url().elidedString().latin1().data()); | 516 WTF_LOG(ResourceLoading, "Loading Resource for '%s'.", request.resourceReque
st().url().elidedString().latin1().data()); |
| 525 | 517 |
| 526 initializeResourceRequest(request.mutableResourceRequest(), factory.type()); | 518 initializeResourceRequest(request.mutableResourceRequest(), factory.type()); |
| 527 ResourcePtr<Resource> resource = factory.create(request.resourceRequest(), c
harset); | 519 ResourcePtr<Resource> resource = factory.create(request.resourceRequest(), c
harset); |
| 528 resource->setCacheIdentifier(cacheIdentifier); | 520 resource->setCacheIdentifier(cacheIdentifier); |
| 529 | 521 |
| 530 memoryCache()->add(resource.get()); | 522 memoryCache()->add(resource.get()); |
| 531 return resource; | 523 return resource; |
| 532 } | 524 } |
| 533 | 525 |
| 534 void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource
) | 526 void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource
) |
| 535 { | 527 { |
| 536 if (resource->options().initiatorInfo.name == FetchInitiatorTypeNames::inter
nal) | 528 if (resource->options().initiatorInfo.name == FetchInitiatorTypeNames::inter
nal) |
| 537 return; | 529 return; |
| 538 | 530 |
| 539 OwnPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(resource->optio
ns().initiatorInfo.name, monotonicallyIncreasingTime(), resource->type() == Reso
urce::MainResource); | 531 OwnPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(resource->optio
ns().initiatorInfo.name, monotonicallyIncreasingTime(), resource->type() == Reso
urce::MainResource); |
| 540 | 532 |
| 541 if (resource->isCacheValidator()) { | 533 if (resource->isCacheValidator()) { |
| 542 const AtomicString& timingAllowOrigin = resource->resourceToRevalidate()
->response().httpHeaderField("Timing-Allow-Origin"); | 534 const AtomicString& timingAllowOrigin = resource->response().httpHeaderF
ield("Timing-Allow-Origin"); |
| 543 if (!timingAllowOrigin.isEmpty()) | 535 if (!timingAllowOrigin.isEmpty()) |
| 544 info->setOriginalTimingAllowOrigin(timingAllowOrigin); | 536 info->setOriginalTimingAllowOrigin(timingAllowOrigin); |
| 545 } | 537 } |
| 546 | 538 |
| 547 if (resource->type() != Resource::MainResource || context().updateTimingInfo
ForIFrameNavigation(info.get())) | 539 if (resource->type() != Resource::MainResource || context().updateTimingInfo
ForIFrameNavigation(info.get())) |
| 548 m_resourceTimingInfoMap.add(resource, info.release()); | 540 m_resourceTimingInfoMap.add(resource, info.release()); |
| 549 } | 541 } |
| 550 | 542 |
| 551 ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy
(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResour
ce, bool isStaticData) const | 543 ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy
(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResour
ce, bool isStaticData) const |
| 552 { | 544 { |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1167 visitor->trace(m_archiveResourceCollection); | 1159 visitor->trace(m_archiveResourceCollection); |
| 1168 visitor->trace(m_loaders); | 1160 visitor->trace(m_loaders); |
| 1169 visitor->trace(m_nonBlockingLoaders); | 1161 visitor->trace(m_nonBlockingLoaders); |
| 1170 #if ENABLE(OILPAN) | 1162 #if ENABLE(OILPAN) |
| 1171 visitor->trace(m_preloads); | 1163 visitor->trace(m_preloads); |
| 1172 visitor->trace(m_resourceTimingInfoMap); | 1164 visitor->trace(m_resourceTimingInfoMap); |
| 1173 #endif | 1165 #endif |
| 1174 } | 1166 } |
| 1175 | 1167 |
| 1176 } | 1168 } |
| OLD | NEW |