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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 return ResourceLoadPriorityVeryLow; | 149 return ResourceLoadPriorityVeryLow; |
150 case Resource::LinkSubresource: | 150 case Resource::LinkSubresource: |
151 return ResourceLoadPriorityLow; | 151 return ResourceLoadPriorityLow; |
152 case Resource::TextTrack: | 152 case Resource::TextTrack: |
153 return ResourceLoadPriorityLow; | 153 return ResourceLoadPriorityLow; |
154 } | 154 } |
155 ASSERT_NOT_REACHED(); | 155 ASSERT_NOT_REACHED(); |
156 return ResourceLoadPriorityUnresolved; | 156 return ResourceLoadPriorityUnresolved; |
157 } | 157 } |
158 | 158 |
159 static Resource* resourceFromDataURIRequest(const ResourceRequest& request, cons
t ResourceLoaderOptions& resourceOptions) | 159 static Resource* resourceFromDataURIRequest(const ResourceRequest& request, cons
t ResourceLoaderOptions& resourceOptions, const String& cacheIdentifier) |
160 { | 160 { |
161 const KURL& url = request.url(); | 161 const KURL& url = request.url(); |
162 ASSERT(url.protocolIsData()); | 162 ASSERT(url.protocolIsData()); |
163 | 163 |
164 blink::WebString mimetype; | 164 blink::WebString mimetype; |
165 blink::WebString charset; | 165 blink::WebString charset; |
166 RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(blink::Platform::curren
t()->parseDataURL(url, mimetype, charset)); | 166 RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(blink::Platform::curren
t()->parseDataURL(url, mimetype, charset)); |
167 if (!data) | 167 if (!data) |
168 return nullptr; | 168 return nullptr; |
169 ResourceResponse response(url, mimetype, data->size(), charset, String()); | 169 ResourceResponse response(url, mimetype, data->size(), charset, String()); |
170 | 170 |
171 Resource* resource = createResource(Resource::Image, request, charset); | 171 Resource* resource = createResource(Resource::Image, request, charset); |
172 resource->setOptions(resourceOptions); | 172 resource->setOptions(resourceOptions); |
173 resource->responseReceived(response); | 173 resource->responseReceived(response); |
174 if (data->size()) | 174 if (data->size()) |
175 resource->setResourceBuffer(data); | 175 resource->setResourceBuffer(data); |
| 176 resource->setCacheIdentifier(cacheIdentifier); |
176 resource->finish(); | 177 resource->finish(); |
177 return resource; | 178 return resource; |
178 } | 179 } |
179 | 180 |
180 static void populateResourceTiming(ResourceTimingInfo* info, Resource* resource,
bool clearLoadTimings) | 181 static void populateResourceTiming(ResourceTimingInfo* info, Resource* resource,
bool clearLoadTimings) |
181 { | 182 { |
182 info->setInitialRequest(resource->resourceRequest()); | 183 info->setInitialRequest(resource->resourceRequest()); |
183 info->setFinalResponse(resource->response()); | 184 info->setFinalResponse(resource->response()); |
184 if (clearLoadTimings) { | 185 if (clearLoadTimings) { |
185 info->clearLoadTimings(); | 186 info->clearLoadTimings(); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 request.setDefer(clientDefersImage(request.resourceRequest().url()) ? FetchR
equest::DeferredByClient : FetchRequest::NoDefer); | 324 request.setDefer(clientDefersImage(request.resourceRequest().url()) ? FetchR
equest::DeferredByClient : FetchRequest::NoDefer); |
324 ResourcePtr<Resource> resource = requestResource(Resource::Image, request); | 325 ResourcePtr<Resource> resource = requestResource(Resource::Image, request); |
325 return resource && resource->type() == Resource::Image ? toImageResource(res
ource) : 0; | 326 return resource && resource->type() == Resource::Image ? toImageResource(res
ource) : 0; |
326 } | 327 } |
327 | 328 |
328 void ResourceFetcher::preCacheDataURIImage(const FetchRequest& request) | 329 void ResourceFetcher::preCacheDataURIImage(const FetchRequest& request) |
329 { | 330 { |
330 const KURL& url = request.resourceRequest().url(); | 331 const KURL& url = request.resourceRequest().url(); |
331 ASSERT(url.protocolIsData()); | 332 ASSERT(url.protocolIsData()); |
332 | 333 |
333 if (memoryCache()->resourceForURL(url)) | 334 const String cacheIdentifier = getCacheIdentifier(); |
| 335 if (memoryCache()->resourceForURL(url, cacheIdentifier)) |
334 return; | 336 return; |
335 | 337 |
336 if (Resource* resource = resourceFromDataURIRequest(request.resourceRequest(
), request.options())) { | 338 if (Resource* resource = resourceFromDataURIRequest(request.resourceRequest(
), request.options(), cacheIdentifier)) { |
337 memoryCache()->add(resource); | 339 memoryCache()->add(resource); |
338 scheduleDocumentResourcesGC(); | 340 scheduleDocumentResourcesGC(); |
339 } | 341 } |
340 } | 342 } |
341 | 343 |
342 ResourcePtr<FontResource> ResourceFetcher::fetchFont(FetchRequest& request) | 344 ResourcePtr<FontResource> ResourceFetcher::fetchFont(FetchRequest& request) |
343 { | 345 { |
344 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 346 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
345 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textFont); | 347 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textFont); |
346 return toFontResource(requestResource(Resource::Font, request)); | 348 return toFontResource(requestResource(Resource::Font, request)); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 | 419 |
418 ResourcePtr<RawResource> ResourceFetcher::fetchTextTrack(FetchRequest& request) | 420 ResourcePtr<RawResource> ResourceFetcher::fetchTextTrack(FetchRequest& request) |
419 { | 421 { |
420 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 422 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
421 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textTrack); | 423 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textTrack); |
422 return toRawResource(requestResource(Resource::TextTrack, request)); | 424 return toRawResource(requestResource(Resource::TextTrack, request)); |
423 } | 425 } |
424 | 426 |
425 void ResourceFetcher::preCacheSubstituteDataForMainResource(const FetchRequest&
request, const SubstituteData& substituteData) | 427 void ResourceFetcher::preCacheSubstituteDataForMainResource(const FetchRequest&
request, const SubstituteData& substituteData) |
426 { | 428 { |
| 429 const String cacheIdentifier = getCacheIdentifier(); |
427 const KURL& url = request.url(); | 430 const KURL& url = request.url(); |
428 if (Resource* oldResource = memoryCache()->resourceForURL(url)) | 431 if (Resource* oldResource = memoryCache()->resourceForURL(url, cacheIdentifi
er)) |
429 memoryCache()->remove(oldResource); | 432 memoryCache()->remove(oldResource); |
430 | 433 |
431 ResourceResponse response(url, substituteData.mimeType(), substituteData.con
tent()->size(), substituteData.textEncoding(), emptyString()); | 434 ResourceResponse response(url, substituteData.mimeType(), substituteData.con
tent()->size(), substituteData.textEncoding(), emptyString()); |
432 ResourcePtr<Resource> resource = createResource(Resource::MainResource, requ
est.resourceRequest(), substituteData.textEncoding()); | 435 ResourcePtr<Resource> resource = createResource(Resource::MainResource, requ
est.resourceRequest(), substituteData.textEncoding()); |
433 resource->setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad())
; | 436 resource->setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad())
; |
434 resource->setOptions(request.options()); | 437 resource->setOptions(request.options()); |
435 resource->setDataBufferingPolicy(BufferData); | 438 resource->setDataBufferingPolicy(BufferData); |
436 resource->responseReceived(response); | 439 resource->responseReceived(response); |
437 if (substituteData.content()->size()) | 440 if (substituteData.content()->size()) |
438 resource->setResourceBuffer(substituteData.content()); | 441 resource->setResourceBuffer(substituteData.content()); |
| 442 resource->setCacheIdentifier(cacheIdentifier); |
439 resource->finish(); | 443 resource->finish(); |
440 memoryCache()->add(resource.get()); | 444 memoryCache()->add(resource.get()); |
441 } | 445 } |
442 | 446 |
443 bool ResourceFetcher::canRequest(Resource::Type type, const ResourceRequest& res
ourceRequest, const KURL& url, const ResourceLoaderOptions& options, bool forPre
load, FetchRequest::OriginRestriction originRestriction) const | 447 bool ResourceFetcher::canRequest(Resource::Type type, const ResourceRequest& res
ourceRequest, const KURL& url, const ResourceLoaderOptions& options, bool forPre
load, FetchRequest::OriginRestriction originRestriction) const |
444 { | 448 { |
445 SecurityOrigin* securityOrigin = options.securityOrigin.get(); | 449 SecurityOrigin* securityOrigin = options.securityOrigin.get(); |
446 if (!securityOrigin && document()) | 450 if (!securityOrigin && document()) |
447 securityOrigin = document()->securityOrigin(); | 451 securityOrigin = document()->securityOrigin(); |
448 | 452 |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 | 727 |
724 if (activityLogger) { | 728 if (activityLogger) { |
725 Vector<String> argv; | 729 Vector<String> argv; |
726 argv.append(Resource::resourceTypeToString(type, request.options().i
nitiatorInfo)); | 730 argv.append(Resource::resourceTypeToString(type, request.options().i
nitiatorInfo)); |
727 argv.append(url); | 731 argv.append(url); |
728 activityLogger->logEvent("blinkRequestResource", argv.size(), argv.d
ata()); | 732 activityLogger->logEvent("blinkRequestResource", argv.size(), argv.d
ata()); |
729 } | 733 } |
730 } | 734 } |
731 | 735 |
732 // See if we can use an existing resource from the cache. | 736 // See if we can use an existing resource from the cache. |
733 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url); | 737 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url, getCache
Identifier()); |
734 | 738 |
735 const RevalidationPolicy policy = determineRevalidationPolicy(type, request,
resource.get()); | 739 const RevalidationPolicy policy = determineRevalidationPolicy(type, request,
resource.get()); |
736 switch (policy) { | 740 switch (policy) { |
737 case Reload: | 741 case Reload: |
738 memoryCache()->remove(resource.get()); | 742 memoryCache()->remove(resource.get()); |
739 // Fall through | 743 // Fall through |
740 case Load: | 744 case Load: |
741 resource = createResourceForLoading(type, request, request.charset()); | 745 resource = createResourceForLoading(type, request, request.charset()); |
742 break; | 746 break; |
743 case Revalidate: | 747 case Revalidate: |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
795 | 799 |
796 // FIXME: Temporarily leave main resource caching disabled for chromium, | 800 // FIXME: Temporarily leave main resource caching disabled for chromium, |
797 // see https://bugs.webkit.org/show_bug.cgi?id=107962. Before caching main | 801 // see https://bugs.webkit.org/show_bug.cgi?id=107962. Before caching main |
798 // resources, we should be sure to understand the implications for memory | 802 // resources, we should be sure to understand the implications for memory |
799 // use. | 803 // use. |
800 // Remove main resource from cache to prevent reuse. | 804 // Remove main resource from cache to prevent reuse. |
801 if (type == Resource::MainResource) { | 805 if (type == Resource::MainResource) { |
802 ASSERT(policy != Use || m_documentLoader->substituteData().isValid()); | 806 ASSERT(policy != Use || m_documentLoader->substituteData().isValid()); |
803 ASSERT(policy != Revalidate); | 807 ASSERT(policy != Revalidate); |
804 memoryCache()->remove(resource.get()); | 808 memoryCache()->remove(resource.get()); |
805 } else { | |
806 // Remove a resource to be handled by Service Worker from the cache to | |
807 // prevent reuse because Service Worker can serve an arbitrary resource | |
808 // for an URL and pollute a memory cache entry. | |
809 // FIXME: isControlledByServiceWorker() always returns false on main | |
810 // resource request, but main resource is always removed from the cache | |
811 // as the above comment (http://crbug.com/388375). | |
812 if (isControlledByServiceWorker()) { | |
813 ASSERT(policy == Load || policy == Reload); | |
814 memoryCache()->remove(resource.get()); | |
815 } | |
816 } | 809 } |
817 | 810 |
818 requestLoadStarted(resource.get(), request, policy == Use ? ResourceLoadingF
romCache : ResourceLoadingFromNetwork); | 811 requestLoadStarted(resource.get(), request, policy == Use ? ResourceLoadingF
romCache : ResourceLoadingFromNetwork); |
819 | 812 |
820 ASSERT(resource->url() == url.string()); | 813 ASSERT(resource->url() == url.string()); |
821 m_documentResources.set(resource->url(), resource); | 814 m_documentResources.set(resource->url(), resource); |
822 return resource; | 815 return resource; |
823 } | 816 } |
824 | 817 |
825 void ResourceFetcher::resourceTimingReportTimerFired(Timer<ResourceFetcher>* tim
er) | 818 void ResourceFetcher::resourceTimingReportTimerFired(Timer<ResourceFetcher>* tim
er) |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 } | 901 } |
909 if (!lastModified.isEmpty()) | 902 if (!lastModified.isEmpty()) |
910 revalidatingRequest.setHTTPHeaderField("If-Modified-Since", lastModified
); | 903 revalidatingRequest.setHTTPHeaderField("If-Modified-Since", lastModified
); |
911 if (!eTag.isEmpty()) | 904 if (!eTag.isEmpty()) |
912 revalidatingRequest.setHTTPHeaderField("If-None-Match", eTag); | 905 revalidatingRequest.setHTTPHeaderField("If-None-Match", eTag); |
913 | 906 |
914 ResourcePtr<Resource> newResource = createResource(resource->type(), revalid
atingRequest, resource->encoding()); | 907 ResourcePtr<Resource> newResource = createResource(resource->type(), revalid
atingRequest, resource->encoding()); |
915 WTF_LOG(ResourceLoading, "Resource %p created to revalidate %p", newResource
.get(), resource); | 908 WTF_LOG(ResourceLoading, "Resource %p created to revalidate %p", newResource
.get(), resource); |
916 | 909 |
917 newResource->setResourceToRevalidate(resource); | 910 newResource->setResourceToRevalidate(resource); |
| 911 newResource->setCacheIdentifier(resource->cacheIdentifier()); |
918 | 912 |
919 memoryCache()->remove(resource); | 913 memoryCache()->remove(resource); |
920 memoryCache()->add(newResource.get()); | 914 memoryCache()->add(newResource.get()); |
921 return newResource; | 915 return newResource; |
922 } | 916 } |
923 | 917 |
924 ResourcePtr<Resource> ResourceFetcher::createResourceForLoading(Resource::Type t
ype, FetchRequest& request, const String& charset) | 918 ResourcePtr<Resource> ResourceFetcher::createResourceForLoading(Resource::Type t
ype, FetchRequest& request, const String& charset) |
925 { | 919 { |
926 ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url())); | 920 const String cacheIdentifier = getCacheIdentifier(); |
| 921 ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url(), cache
Identifier)); |
927 | 922 |
928 WTF_LOG(ResourceLoading, "Loading Resource for '%s'.", request.resourceReque
st().url().elidedString().latin1().data()); | 923 WTF_LOG(ResourceLoading, "Loading Resource for '%s'.", request.resourceReque
st().url().elidedString().latin1().data()); |
929 | 924 |
930 addAdditionalRequestHeaders(request.mutableResourceRequest(), type); | 925 addAdditionalRequestHeaders(request.mutableResourceRequest(), type); |
931 ResourcePtr<Resource> resource = createResource(type, request.resourceReques
t(), charset); | 926 ResourcePtr<Resource> resource = createResource(type, request.resourceReques
t(), charset); |
| 927 resource->setCacheIdentifier(cacheIdentifier); |
932 | 928 |
933 memoryCache()->add(resource.get()); | 929 memoryCache()->add(resource.get()); |
934 return resource; | 930 return resource; |
935 } | 931 } |
936 | 932 |
937 void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource
) | 933 void ResourceFetcher::storeResourceTimingInitiatorInformation(Resource* resource
) |
938 { | 934 { |
939 if (resource->options().requestInitiatorContext != DocumentContext) | 935 if (resource->options().requestInitiatorContext != DocumentContext) |
940 return; | 936 return; |
941 | 937 |
(...skipping 18 matching lines...) Expand all Loading... |
960 } | 956 } |
961 } | 957 } |
962 | 958 |
963 ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy
(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResour
ce) const | 959 ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy
(Resource::Type type, const FetchRequest& fetchRequest, Resource* existingResour
ce) const |
964 { | 960 { |
965 const ResourceRequest& request = fetchRequest.resourceRequest(); | 961 const ResourceRequest& request = fetchRequest.resourceRequest(); |
966 | 962 |
967 if (!existingResource) | 963 if (!existingResource) |
968 return Load; | 964 return Load; |
969 | 965 |
970 // FIXME: Currently caching for a resource to be handled by Service Worker | |
971 // is disabled (http://crbug.com/388375). | |
972 if (isControlledByServiceWorker()) | |
973 return Reload; | |
974 | |
975 // We already have a preload going for this URL. | 966 // We already have a preload going for this URL. |
976 if (fetchRequest.forPreload() && existingResource->isPreloaded()) | 967 if (fetchRequest.forPreload() && existingResource->isPreloaded()) |
977 return Use; | 968 return Use; |
978 | 969 |
979 // If the same URL has been loaded as a different type, we need to reload. | 970 // If the same URL has been loaded as a different type, we need to reload. |
980 if (existingResource->type() != type) { | 971 if (existingResource->type() != type) { |
981 // FIXME: If existingResource is a Preload and the new type is LinkPrefe
tch | 972 // FIXME: If existingResource is a Preload and the new type is LinkPrefe
tch |
982 // We really should discard the new prefetch since the preload has more | 973 // We really should discard the new prefetch since the preload has more |
983 // specific type information! crbug.com/379893 | 974 // specific type information! crbug.com/379893 |
984 // fast/dom/HTMLLinkElement/link-and-subresource-test hits this case. | 975 // fast/dom/HTMLLinkElement/link-and-subresource-test hits this case. |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1520 printf("IMAGES: %d (%d hits, hit rate %d%%)\n", images, images - imageM
isses, (images - imageMisses) * 100 / images); | 1511 printf("IMAGES: %d (%d hits, hit rate %d%%)\n", images, images - imageM
isses, (images - imageMisses) * 100 / images); |
1521 } | 1512 } |
1522 #endif | 1513 #endif |
1523 | 1514 |
1524 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() | 1515 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() |
1525 { | 1516 { |
1526 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (BufferData, AllowStored
Credentials, ClientRequestedCredentials, CheckContentSecurityPolicy, DocumentCon
text)); | 1517 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (BufferData, AllowStored
Credentials, ClientRequestedCredentials, CheckContentSecurityPolicy, DocumentCon
text)); |
1527 return options; | 1518 return options; |
1528 } | 1519 } |
1529 | 1520 |
| 1521 String ResourceFetcher::getCacheIdentifier() const |
| 1522 { |
| 1523 if (isControlledByServiceWorker()) |
| 1524 return String::number(serviceWorkerID()); |
| 1525 return MemoryCache::defaultCacheIdentifier(); |
| 1526 } |
| 1527 |
1530 ResourceFetcher::DeadResourceStatsRecorder::DeadResourceStatsRecorder() | 1528 ResourceFetcher::DeadResourceStatsRecorder::DeadResourceStatsRecorder() |
1531 : m_useCount(0) | 1529 : m_useCount(0) |
1532 , m_revalidateCount(0) | 1530 , m_revalidateCount(0) |
1533 , m_loadCount(0) | 1531 , m_loadCount(0) |
1534 { | 1532 { |
1535 } | 1533 } |
1536 | 1534 |
1537 ResourceFetcher::DeadResourceStatsRecorder::~DeadResourceStatsRecorder() | 1535 ResourceFetcher::DeadResourceStatsRecorder::~DeadResourceStatsRecorder() |
1538 { | 1536 { |
1539 blink::Platform::current()->histogramCustomCounts( | 1537 blink::Platform::current()->histogramCustomCounts( |
(...skipping 22 matching lines...) Expand all Loading... |
1562 | 1560 |
1563 void ResourceFetcher::trace(Visitor* visitor) | 1561 void ResourceFetcher::trace(Visitor* visitor) |
1564 { | 1562 { |
1565 visitor->trace(m_document); | 1563 visitor->trace(m_document); |
1566 visitor->trace(m_loaders); | 1564 visitor->trace(m_loaders); |
1567 visitor->trace(m_multipartLoaders); | 1565 visitor->trace(m_multipartLoaders); |
1568 ResourceLoaderHost::trace(visitor); | 1566 ResourceLoaderHost::trace(visitor); |
1569 } | 1567 } |
1570 | 1568 |
1571 } | 1569 } |
OLD | NEW |