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 | 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All |
6 rights reserved. | 6 rights reserved. |
7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ | 7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ |
8 | 8 |
9 This library is free software; you can redistribute it and/or | 9 This library is free software; you can redistribute it and/or |
10 modify it under the terms of the GNU Library General Public | 10 modify it under the terms of the GNU Library General Public |
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 DCHECK(resource->isLoaded()); | 676 DCHECK(resource->isLoaded()); |
677 DCHECK(resource->canUseCacheValidator()); | 677 DCHECK(resource->canUseCacheValidator()); |
678 DCHECK(!resource->isCacheValidator()); | 678 DCHECK(!resource->isCacheValidator()); |
679 DCHECK(!context().isControlledByServiceWorker()); | 679 DCHECK(!context().isControlledByServiceWorker()); |
680 | 680 |
681 const AtomicString& lastModified = | 681 const AtomicString& lastModified = |
682 resource->response().httpHeaderField(HTTPNames::Last_Modified); | 682 resource->response().httpHeaderField(HTTPNames::Last_Modified); |
683 const AtomicString& eTag = | 683 const AtomicString& eTag = |
684 resource->response().httpHeaderField(HTTPNames::ETag); | 684 resource->response().httpHeaderField(HTTPNames::ETag); |
685 if (!lastModified.isEmpty() || !eTag.isEmpty()) { | 685 if (!lastModified.isEmpty() || !eTag.isEmpty()) { |
686 DCHECK_NE(context().getCachePolicy(), CachePolicyReload); | 686 DCHECK_NE(WebCachePolicy::BypassingCache, |
687 if (context().getCachePolicy() == CachePolicyRevalidate) { | 687 revalidatingRequest.getCachePolicy()); |
| 688 if (revalidatingRequest.getCachePolicy() == |
| 689 WebCachePolicy::ValidatingCacheData) { |
688 revalidatingRequest.setHTTPHeaderField(HTTPNames::Cache_Control, | 690 revalidatingRequest.setHTTPHeaderField(HTTPNames::Cache_Control, |
689 "max-age=0"); | 691 "max-age=0"); |
690 } | 692 } |
691 } | 693 } |
692 if (!lastModified.isEmpty()) { | 694 if (!lastModified.isEmpty()) { |
693 revalidatingRequest.setHTTPHeaderField(HTTPNames::If_Modified_Since, | 695 revalidatingRequest.setHTTPHeaderField(HTTPNames::If_Modified_Since, |
694 lastModified); | 696 lastModified); |
695 } | 697 } |
696 if (!eTag.isEmpty()) | 698 if (!eTag.isEmpty()) |
697 revalidatingRequest.setHTTPHeaderField(HTTPNames::If_None_Match, eTag); | 699 revalidatingRequest.setHTTPHeaderField(HTTPNames::If_None_Match, eTag); |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 // with resourceNeedsLoad() so that it never actually goes to the network. | 858 // with resourceNeedsLoad() so that it never actually goes to the network. |
857 // | 859 // |
858 // 2. Images are enabled, but not loaded automatically. In this case, we will | 860 // 2. Images are enabled, but not loaded automatically. In this case, we will |
859 // Use cached resources or data: urls, but will similarly fall back to a | 861 // Use cached resources or data: urls, but will similarly fall back to a |
860 // deferred network load if we don't have the data available without a network | 862 // deferred network load if we don't have the data available without a network |
861 // request. We check allowImage() here, which is affected by m_imagesEnabled | 863 // request. We check allowImage() here, which is affected by m_imagesEnabled |
862 // but not m_autoLoadImages, in order to allow for this differing behavior. | 864 // but not m_autoLoadImages, in order to allow for this differing behavior. |
863 // | 865 // |
864 // TODO(japhet): Can we get rid of one of these settings? | 866 // TODO(japhet): Can we get rid of one of these settings? |
865 if (existingResource->isImage() && | 867 if (existingResource->isImage() && |
866 !context().allowImage(m_imagesEnabled, existingResource->url())) | 868 !context().allowImage(m_imagesEnabled, existingResource->url())) { |
867 return Reload; | 869 return Reload; |
| 870 } |
868 | 871 |
869 // Never use cache entries for downloadToFile / useStreamOnResponse requests. | 872 // Never use cache entries for downloadToFile / useStreamOnResponse requests. |
870 // The data will be delivered through other paths. | 873 // The data will be delivered through other paths. |
871 if (request.downloadToFile() || request.useStreamOnResponse()) | 874 if (request.downloadToFile() || request.useStreamOnResponse()) |
872 return Reload; | 875 return Reload; |
873 | 876 |
874 // Never reuse opaque responses from a service worker for requests that are | 877 // Never reuse opaque responses from a service worker for requests that are |
875 // not no-cors. https://crbug.com/625575 | 878 // not no-cors. https://crbug.com/625575 |
876 if (existingResource->response().wasFetchedViaServiceWorker() && | 879 if (existingResource->response().wasFetchedViaServiceWorker() && |
877 existingResource->response().serviceWorkerResponseType() == | 880 existingResource->response().serviceWorkerResponseType() == |
878 WebServiceWorkerResponseTypeOpaque && | 881 WebServiceWorkerResponseTypeOpaque && |
879 request.fetchRequestMode() != WebURLRequest::FetchRequestModeNoCORS) | 882 request.fetchRequestMode() != WebURLRequest::FetchRequestModeNoCORS) { |
880 return Reload; | 883 return Reload; |
| 884 } |
881 | 885 |
882 // If resource was populated from a SubstituteData load or data: url, use it. | 886 // If resource was populated from a SubstituteData load or data: url, use it. |
883 if (isStaticData) | 887 if (isStaticData) |
884 return Use; | 888 return Use; |
885 | 889 |
886 if (!existingResource->canReuse(request)) | 890 if (!existingResource->canReuse(request)) |
887 return Reload; | 891 return Reload; |
888 | 892 |
889 // Certain requests (e.g., XHRs) might have manually set headers that require | 893 // Certain requests (e.g., XHRs) might have manually set headers that require |
890 // revalidation. In theory, this should be a Revalidate case. In practice, the | 894 // revalidation. In theory, this should be a Revalidate case. In practice, the |
891 // MemoryCache revalidation path assumes a whole bunch of things about how | 895 // MemoryCache revalidation path assumes a whole bunch of things about how |
892 // revalidation works that manual headers violate, so punt to Reload instead. | 896 // revalidation works that manual headers violate, so punt to Reload instead. |
893 // | 897 // |
894 // Similarly, a request with manually added revalidation headers can lead to a | 898 // Similarly, a request with manually added revalidation headers can lead to a |
895 // 304 response for a request that wasn't flagged as a revalidation attempt. | 899 // 304 response for a request that wasn't flagged as a revalidation attempt. |
896 // Normally, successful revalidation will maintain the original response's | 900 // Normally, successful revalidation will maintain the original response's |
897 // status code, but for a manual revalidation the response code remains 304. | 901 // status code, but for a manual revalidation the response code remains 304. |
898 // In this case, the Resource likely has insufficient context to provide a | 902 // In this case, the Resource likely has insufficient context to provide a |
899 // useful cache hit or revalidation. See http://crbug.com/643659 | 903 // useful cache hit or revalidation. See http://crbug.com/643659 |
900 if (request.isConditional() || | 904 if (request.isConditional() || |
901 existingResource->response().httpStatusCode() == 304) | 905 existingResource->response().httpStatusCode() == 304) { |
902 return Reload; | 906 return Reload; |
| 907 } |
903 | 908 |
904 // Don't reload resources while pasting. | 909 // Don't reload resources while pasting. |
905 if (m_allowStaleResources) | 910 if (m_allowStaleResources) |
906 return Use; | 911 return Use; |
907 | 912 |
908 if (!fetchRequest.options().canReuseRequest(existingResource->options())) | 913 if (!fetchRequest.options().canReuseRequest(existingResource->options())) |
909 return Reload; | 914 return Reload; |
910 | 915 |
911 // Always use preloads. | 916 // Always use preloads. |
912 if (existingResource->isPreloaded()) | 917 if (existingResource->isPreloaded()) |
913 return Use; | 918 return Use; |
914 | 919 |
915 // CachePolicyHistoryBuffer uses the cache no matter what. | 920 // WebCachePolicy::ReturnCacheDataElseLoad uses the cache no matter what. |
916 CachePolicy cachePolicy = context().getCachePolicy(); | 921 if (request.getCachePolicy() == WebCachePolicy::ReturnCacheDataElseLoad) |
917 if (cachePolicy == CachePolicyHistoryBuffer) | |
918 return Use; | 922 return Use; |
919 | 923 |
920 // Don't reuse resources with Cache-control: no-store. | 924 // Don't reuse resources with Cache-control: no-store. |
921 if (existingResource->hasCacheControlNoStoreHeader()) { | 925 if (existingResource->hasCacheControlNoStoreHeader()) { |
922 RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " | 926 RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " |
923 "reloading due to Cache-control: no-store."; | 927 "reloading due to Cache-control: no-store."; |
924 return Reload; | 928 return Reload; |
925 } | 929 } |
926 | 930 |
927 // If credentials were sent with the previous request and won't be with this | 931 // If credentials were sent with the previous request and won't be with this |
(...skipping 16 matching lines...) Expand all Loading... |
944 // XHRs fall into this category and may have user-set Cache-Control: headers | 948 // XHRs fall into this category and may have user-set Cache-Control: headers |
945 // or other factors that require separate requests. | 949 // or other factors that require separate requests. |
946 if (type != Resource::Raw) { | 950 if (type != Resource::Raw) { |
947 if (!context().isLoadComplete() && | 951 if (!context().isLoadComplete() && |
948 m_validatedURLs.contains(existingResource->url())) | 952 m_validatedURLs.contains(existingResource->url())) |
949 return Use; | 953 return Use; |
950 if (existingResource->isLoading()) | 954 if (existingResource->isLoading()) |
951 return Use; | 955 return Use; |
952 } | 956 } |
953 | 957 |
954 if (request.getCachePolicy() == WebCachePolicy::BypassingCache) | 958 // WebCachePolicy::BypassingCache always reloads |
955 return Reload; | 959 if (request.getCachePolicy() == WebCachePolicy::BypassingCache) { |
956 | |
957 // CachePolicyReload always reloads | |
958 if (cachePolicy == CachePolicyReload) { | |
959 RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " | 960 RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " |
960 "reloading due to CachePolicyReload."; | 961 "reloading due to " |
| 962 "WebCachePolicy::BypassingCache."; |
961 return Reload; | 963 return Reload; |
962 } | 964 } |
963 | 965 |
964 // We'll try to reload the resource if it failed last time. | 966 // We'll try to reload the resource if it failed last time. |
965 if (existingResource->errorOccurred()) { | 967 if (existingResource->errorOccurred()) { |
966 RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::" | 968 RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " |
967 "determineRevalidationPolicye reloading due " | 969 "reloading due to resource being in the error " |
968 "to resource being in the error state"; | 970 "state"; |
969 return Reload; | 971 return Reload; |
970 } | 972 } |
971 | 973 |
972 // List of available images logic allows images to be re-used without cache | 974 // List of available images logic allows images to be re-used without cache |
973 // validation. We restrict this only to images from memory cache which are the | 975 // validation. We restrict this only to images from memory cache which are the |
974 // same as the version in the current document. | 976 // same as the version in the current document. |
975 if (type == Resource::Image && | 977 if (type == Resource::Image && |
976 existingResource == cachedResource(request.url())) | 978 existingResource == cachedResource(request.url())) { |
977 return Use; | 979 return Use; |
| 980 } |
978 | 981 |
979 if (existingResource->mustReloadDueToVaryHeader(request)) | 982 if (existingResource->mustReloadDueToVaryHeader(request)) |
980 return Reload; | 983 return Reload; |
981 | 984 |
982 // If any of the redirects in the chain to loading the resource were not | 985 // If any of the redirects in the chain to loading the resource were not |
983 // cacheable, we cannot reuse our cached resource. | 986 // cacheable, we cannot reuse our cached resource. |
984 if (!existingResource->canReuseRedirectChain()) { | 987 if (!existingResource->canReuseRedirectChain()) { |
985 RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " | 988 RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " |
986 "reloading due to an uncacheable redirect"; | 989 "reloading due to an uncacheable redirect"; |
987 return Reload; | 990 return Reload; |
988 } | 991 } |
989 | 992 |
990 // Check if the cache headers requires us to revalidate (cache expiration for | 993 // Check if the cache headers requires us to revalidate (cache expiration for |
991 // example). | 994 // example). |
992 if (cachePolicy == CachePolicyRevalidate || | 995 if (request.getCachePolicy() == WebCachePolicy::ValidatingCacheData || |
993 existingResource->mustRevalidateDueToCacheHeaders() || | 996 existingResource->mustRevalidateDueToCacheHeaders() || |
994 request.cacheControlContainsNoCache()) { | 997 request.cacheControlContainsNoCache()) { |
995 // See if the resource has usable ETag or Last-modified headers. If the page | 998 // See if the resource has usable ETag or Last-modified headers. If the page |
996 // is controlled by the ServiceWorker, we choose the Reload policy because | 999 // is controlled by the ServiceWorker, we choose the Reload policy because |
997 // the revalidation headers should not be exposed to the | 1000 // the revalidation headers should not be exposed to the |
998 // ServiceWorker.(crbug.com/429570) | 1001 // ServiceWorker.(crbug.com/429570) |
999 if (existingResource->canUseCacheValidator() && | 1002 if (existingResource->canUseCacheValidator() && |
1000 !context().isControlledByServiceWorker()) { | 1003 !context().isControlledByServiceWorker()) { |
1001 // If the resource is already a cache validator but not started yet, the | 1004 // If the resource is already a cache validator but not started yet, the |
1002 // |Use| policy should be applied to subsequent requests. | 1005 // |Use| policy should be applied to subsequent requests. |
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1549 visitor->trace(m_context); | 1552 visitor->trace(m_context); |
1550 visitor->trace(m_archive); | 1553 visitor->trace(m_archive); |
1551 visitor->trace(m_loaders); | 1554 visitor->trace(m_loaders); |
1552 visitor->trace(m_nonBlockingLoaders); | 1555 visitor->trace(m_nonBlockingLoaders); |
1553 visitor->trace(m_documentResources); | 1556 visitor->trace(m_documentResources); |
1554 visitor->trace(m_preloads); | 1557 visitor->trace(m_preloads); |
1555 visitor->trace(m_resourceTimingInfoMap); | 1558 visitor->trace(m_resourceTimingInfoMap); |
1556 } | 1559 } |
1557 | 1560 |
1558 } // namespace blink | 1561 } // namespace blink |
OLD | NEW |