Index: Source/WebCore/loader/FrameLoader.cpp |
=================================================================== |
--- Source/WebCore/loader/FrameLoader.cpp (revision 141117) |
+++ Source/WebCore/loader/FrameLoader.cpp (working copy) |
@@ -854,7 +854,7 @@ |
&& !m_frame->document()->loadEventFinished()) { |
HistoryItem* childItem = parentItem->childItemWithTarget(childFrame->tree()->uniqueName()); |
if (childItem) { |
- childFrame->loader()->loadDifferentDocumentItem(childItem, loadType(), MayAttemptCacheOnlyLoadForFormSubmissionItem); |
+ childFrame->loader()->loadDifferentDocumentItem(childItem, loadType()); |
return; |
} |
} |
@@ -1463,8 +1463,6 @@ |
if (!unreachableURL.isEmpty()) |
request.setURL(unreachableURL); |
- // FIXME: If the resource is a result of form submission and is not cached, the form will be silently resubmitted. |
- // We should ask the user for confirmation in this case. |
request.setCachePolicy(ReturnCacheDataElseLoad); |
RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, defaultSubstituteDataForURL(request.url())); |
@@ -2422,15 +2420,13 @@ |
void FrameLoader::addExtraFieldsToMainResourceRequest(ResourceRequest& request) |
{ |
- // FIXME: Using m_loadType seems wrong for some callers. |
- // If we are only preparing to load the main resource, that is previous load's load type! |
addExtraFieldsToRequest(request, m_loadType, true); |
} |
void FrameLoader::addExtraFieldsToRequest(ResourceRequest& request, FrameLoadType loadType, bool mainResource) |
{ |
// Don't set the cookie policy URL if it's already been set. |
- // But make sure to set it on all requests regardless of protocol, as it has significance beyond the cookie policy (<rdar://problem/6616664>). |
+ // But make sure to set it on all requests, as it has significance beyond the cookie policy for all protocols (<rdar://problem/6616664>). |
if (request.firstPartyForCookies().isEmpty()) { |
if (mainResource && isLoadingMainFrame()) |
request.setFirstPartyForCookies(request.url()); |
@@ -2443,31 +2439,26 @@ |
return; |
applyUserAgent(request); |
- |
+ |
+ // If we inherit cache policy from a main resource, we use the DocumentLoader's |
+ // original request cache policy for two reasons: |
+ // 1. For POST requests, we mutate the cache policy for the main resource, |
+ // but we do not want this to apply to subresources |
+ // 2. Delegates that modify the cache policy using willSendRequest: should |
+ // not affect any other resources. Such changes need to be done |
+ // per request. |
if (!mainResource) { |
if (request.isConditional()) |
request.setCachePolicy(ReloadIgnoringCacheData); |
- else if (documentLoader()->isLoadingInAPISense()) { |
- // If we inherit cache policy from a main resource, we use the DocumentLoader's |
- // original request cache policy for two reasons: |
- // 1. For POST requests, we mutate the cache policy for the main resource, |
- // but we do not want this to apply to subresources |
- // 2. Delegates that modify the cache policy using willSendRequest: should |
- // not affect any other resources. Such changes need to be done |
- // per request. |
- ResourceRequestCachePolicy mainDocumentOriginalCachePolicy = documentLoader()->originalRequest().cachePolicy(); |
- // Back-forward navigations try to load main resource from cache only to avoid re-submitting form data, and start over (with a warning dialog) if that fails. |
- // This policy is set on initial request too, but should not be inherited. |
- ResourceRequestCachePolicy subresourceCachePolicy = (mainDocumentOriginalCachePolicy == ReturnCacheDataDontLoad) ? ReturnCacheDataElseLoad : mainDocumentOriginalCachePolicy; |
- request.setCachePolicy(subresourceCachePolicy); |
- } else |
+ else if (documentLoader()->isLoadingInAPISense()) |
+ request.setCachePolicy(documentLoader()->originalRequest().cachePolicy()); |
+ else |
request.setCachePolicy(UseProtocolCachePolicy); |
- |
- // FIXME: Other FrameLoader functions have duplicated code for setting cache policy of main request when reloading. |
- // It seems better to manage it explicitly than to hide the logic inside addExtraFieldsToRequest(). |
} else if (loadType == FrameLoadTypeReload || loadType == FrameLoadTypeReloadFromOrigin || request.isConditional()) |
request.setCachePolicy(ReloadIgnoringCacheData); |
- |
+ else if (isBackForwardLoadType(loadType) && m_stateMachine.committedFirstRealDocumentLoad()) |
+ request.setCachePolicy(ReturnCacheDataElseLoad); |
+ |
if (request.cachePolicy() == ReloadIgnoringCacheData) { |
if (loadType == FrameLoadTypeReload) |
request.setHTTPHeaderField("Cache-Control", "max-age=0"); |
@@ -3051,7 +3042,7 @@ |
// FIXME: This function should really be split into a couple pieces, some of |
// which should be methods of HistoryController and some of which should be |
// methods of FrameLoader. |
-void FrameLoader::loadDifferentDocumentItem(HistoryItem* item, FrameLoadType loadType, FormSubmissionCacheLoadPolicy cacheLoadPolicy) |
+void FrameLoader::loadDifferentDocumentItem(HistoryItem* item, FrameLoadType loadType) |
{ |
// Remember this item so we can traverse any child items as child frames load |
history()->setProvisionalItem(item); |
@@ -3086,7 +3077,7 @@ |
// Make sure to add extra fields to the request after the Origin header is added for the FormData case. |
// See https://bugs.webkit.org/show_bug.cgi?id=22194 for more discussion. |
- addExtraFieldsToRequest(request, loadType, true); |
+ addExtraFieldsToRequest(request, m_loadType, true); |
// FIXME: Slight hack to test if the NSURL cache contains the page we're going to. |
// We want to know this before talking to the policy delegate, since it affects whether |
@@ -3096,11 +3087,10 @@ |
// have the item vanish when we try to use it in the ensuing nav. This should be |
// extremely rare, but in that case the user will get an error on the navigation. |
- if (cacheLoadPolicy == MayAttemptCacheOnlyLoadForFormSubmissionItem) { |
- request.setCachePolicy(ReturnCacheDataDontLoad); |
+ if (ResourceHandle::willLoadFromCache(request, m_frame)) |
action = NavigationAction(request, loadType, false); |
- } else { |
- request.setCachePolicy(ReturnCacheDataElseLoad); |
+ else { |
+ request.setCachePolicy(ReloadIgnoringCacheData); |
action = NavigationAction(request, NavigationTypeFormResubmitted); |
} |
} else { |
@@ -3114,7 +3104,7 @@ |
case FrameLoadTypeIndexedBackForward: |
// If the first load within a frame is a navigation within a back/forward list that was attached |
// without any of the items being loaded then we should use the default caching policy (<rdar://problem/8131355>). |
- if (m_stateMachine.committedFirstRealDocumentLoad()) |
+ if (m_stateMachine.committedFirstRealDocumentLoad() && !itemURL.protocolIs("https")) |
request.setCachePolicy(ReturnCacheDataElseLoad); |
break; |
case FrameLoadTypeStandard: |
@@ -3125,7 +3115,7 @@ |
ASSERT_NOT_REACHED(); |
} |
- addExtraFieldsToRequest(request, loadType, true); |
+ addExtraFieldsToRequest(request, m_loadType, true); |
ResourceRequest requestForOriginalURL(request); |
requestForOriginalURL.setURL(itemOriginalURL); |
@@ -3145,25 +3135,9 @@ |
if (sameDocumentNavigation) |
loadSameDocumentItem(item); |
else |
- loadDifferentDocumentItem(item, loadType, MayAttemptCacheOnlyLoadForFormSubmissionItem); |
+ loadDifferentDocumentItem(item, loadType); |
} |
-void FrameLoader::retryAfterFailedCacheOnlyMainResourceLoad() |
-{ |
- ASSERT(m_state == FrameStateProvisional); |
- ASSERT(!m_loadingFromCachedPage); |
- // We only use cache-only loads to avoid resubmitting forms. |
- ASSERT(isBackForwardLoadType(m_loadType)); |
- ASSERT(m_history.provisionalItem()->formData()); |
- ASSERT(m_history.provisionalItem() == m_requestedHistoryItem.get()); |
- |
- FrameLoadType loadType = m_loadType; |
- HistoryItem* item = m_history.provisionalItem(); |
- |
- stopAllLoaders(ShouldNotClearProvisionalItem); |
- loadDifferentDocumentItem(item, loadType, MayNotAttemptCacheOnlyLoadForFormSubmissionItem); |
-} |
- |
ResourceError FrameLoader::cancelledError(const ResourceRequest& request) const |
{ |
ResourceError error = m_client->cancelledError(request); |