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

Unified Diff: third_party/WebKit/Source/core/fetch/ResourceLoader.cpp

Issue 2454983002: Cache-aware Resource loading (Closed)
Patch Set: nit Created 4 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
diff --git a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
index c9e4d3c4ad80eeea93dee39b13d3bad95bea8aac..019e5751274c124257b08cf8459ee358eca09de0 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
@@ -37,6 +37,7 @@
#include "platform/exported/WrappedResourceResponse.h"
#include "platform/network/ResourceError.h"
#include "public/platform/Platform.h"
+#include "public/platform/WebCachePolicy.h"
#include "public/platform/WebData.h"
#include "public/platform/WebURLError.h"
#include "public/platform/WebURLRequest.h"
@@ -54,7 +55,9 @@ ResourceLoader* ResourceLoader::create(ResourceFetcher* fetcher,
}
ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, Resource* resource)
- : m_fetcher(fetcher), m_resource(resource) {
+ : m_fetcher(fetcher),
+ m_resource(resource),
+ m_isCacheAwareLoadingActivated(false) {
DCHECK(m_resource);
DCHECK(m_fetcher);
m_resource->setLoader(this);
@@ -84,6 +87,16 @@ void ResourceLoader::start(const ResourceRequest& request,
m_loader->setDefersLoading(defersLoading);
m_loader->setLoadingTaskRunner(loadingTaskRunner);
+ if (m_isCacheAwareLoadingActivated) {
+ // Override cache policy for cache-aware loading. If this request fails, a
+ // reload with original request will be triggered in didFail().
+ ResourceRequest cacheAwareRequest(request);
+ cacheAwareRequest.setCachePolicy(WebCachePolicy::ReturnCacheDataIfValid);
+ m_loader->loadAsynchronously(WrappedResourceRequest(cacheAwareRequest),
+ this);
+ return;
+ }
+
if (m_resource->options().synchronousPolicy == RequestSynchronously)
requestSynchronously(request);
else
@@ -137,6 +150,13 @@ bool ResourceLoader::willFollowRedirect(
DCHECK(!passedNewRequest.isNull());
DCHECK(!passedRedirectResponse.isNull());
+ if (m_isCacheAwareLoadingActivated) {
+ // Fail as cache miss if cached response is a redirect.
+ didFail(
+ ResourceError::cacheMissError(m_resource->lastResourceRequest().url()));
+ return false;
+ }
+
ResourceRequest& newRequest(passedNewRequest.toMutableResourceRequest());
const ResourceResponse& redirectResponse(
passedRedirectResponse.toResourceResponse());
@@ -226,6 +246,15 @@ void ResourceLoader::didFail(WebURLLoader*, const WebURLError& error) {
}
void ResourceLoader::didFail(const ResourceError& error) {
+ if (m_isCacheAwareLoadingActivated && error.isCacheMiss()) {
+ m_resource->willReloadAfterDiskCacheMiss();
+ m_isCacheAwareLoadingActivated = false;
+ restart(m_resource->resourceRequest(),
+ m_fetcher->context().loadingTaskRunner(),
+ m_fetcher->context().defersLoading());
+ return;
+ }
+
m_loader.reset();
m_fetcher->didFailLoading(m_resource.get(), error);
}
@@ -269,4 +298,27 @@ void ResourceLoader::requestSynchronously(const ResourceRequest& request) {
didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength);
}
+void ResourceLoader::activateCacheAwareLoadingIfNeeded(
+ const ResourceRequest& request) {
+ DCHECK(!m_isCacheAwareLoadingActivated);
+
+ if (m_resource->options().cacheAwareLoadingEnabled !=
+ IsCacheAwareLoadingEnabled)
+ return;
+
+ // Synchronous requests are not supported.
+ if (m_resource->options().synchronousPolicy == RequestSynchronously)
+ return;
+
+ // Don't activate on Resource revalidation.
+ if (m_resource->isCacheValidator())
+ return;
+
+ // Don't activate if cache policy is explicitly set.
+ if (request.getCachePolicy() != WebCachePolicy::UseProtocolCachePolicy)
+ return;
+
+ m_isCacheAwareLoadingActivated = true;
+}
+
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ResourceLoader.h ('k') | third_party/WebKit/Source/core/fetch/ResourceLoaderOptions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698