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

Side by Side Diff: Source/core/fetch/ResourceFetcher.cpp

Issue 640463003: MemoryCache: Enable MemoryCache to have multiple isolated resource maps (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: tweak variable names Created 6 years, 1 month 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 | « Source/core/fetch/ResourceFetcher.h ('k') | Source/core/html/parser/HTMLSrcsetParser.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « Source/core/fetch/ResourceFetcher.h ('k') | Source/core/html/parser/HTMLSrcsetParser.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698