WebCachePolicy FrameFetchContext::resourceRequestCachePolicy(const ResourceRequest& request, Resource::Type type, FetchRequest::DeferOption defer) const { ASSERT(frame()); if (type == Resource::MainResource) { FrameLoadType frameLoadType = frame()->loader().loadType(); if (request.httpMethod() == "POST" && frameLoadType == FrameLoadTypeBackForward) return WebCachePolicy::ReturnCacheDataDontLoad; if (!frame()->host()->overrideEncoding().isEmpty()) return WebCachePolicy::ReturnCacheDataElseLoad; if (frameLoadType == FrameLoadTypeReloadMainResource || request.isConditional() || request.httpMethod() == "POST") return WebCachePolicy::ValidatingCacheData; for (Frame* f = frame(); f; f = f->tree().parent()) { if (!f->isLocalFrame()) continue; frameLoadType = toLocalFrame(f)->loader().loadType(); if (frameLoadType == FrameLoadTypeBackForward) return WebCachePolicy::ReturnCacheDataElseLoad; if (frameLoadType == FrameLoadTypeReloadBypassingCache) return WebCachePolicy::BypassingCache; if (frameLoadType == FrameLoadTypeReload) return WebCachePolicy::ValidatingCacheData; } return WebCachePolicy::UseProtocolCachePolicy; } // For users on slow connections, we want to avoid blocking the parser in // the main frame on script loads inserted via document.write, since it can // add significant delays before page content is displayed on the screen. if (type == Resource::Script && isMainFrame() && m_document && shouldDisallowFetchForMainFrameScript(request, defer, *m_document)) return WebCachePolicy::ReturnCacheDataDontLoad; if (request.isConditional()) return WebCachePolicy::ValidatingCacheData; if (m_documentLoader && m_document && !m_document->loadEventFinished()) { // For POST requests, we mutate the main resource's cache policy to avoid form resubmission. // This policy should not be inherited by subresources. WebCachePolicy mainResourceCachePolicy = m_documentLoader->request().getCachePolicy(); if (m_documentLoader->request().httpMethod() == "POST") { if (mainResourceCachePolicy == WebCachePolicy::ReturnCacheDataDontLoad) return WebCachePolicy::ReturnCacheDataElseLoad; return WebCachePolicy::UseProtocolCachePolicy; } return memoryCachePolicyToResourceRequestCachePolicy(getCachePolicy()); } return WebCachePolicy::UseProtocolCachePolicy; }
PassOwnPtr<CrossThreadResourceRequestData> ResourceRequest::copyData() const { OwnPtr<CrossThreadResourceRequestData> data = adoptPtr(new CrossThreadResourceRequestData()); data->m_url = url().copy(); data->m_cachePolicy = getCachePolicy(); data->m_timeoutInterval = timeoutInterval(); data->m_firstPartyForCookies = firstPartyForCookies().copy(); data->m_requestorOrigin = requestorOrigin() ? requestorOrigin()->isolatedCopy() : nullptr; data->m_httpMethod = httpMethod().getString().isolatedCopy(); data->m_httpHeaders = httpHeaderFields().copyData(); data->m_priority = priority(); data->m_intraPriorityValue = m_intraPriorityValue; if (m_httpBody) data->m_httpBody = m_httpBody->deepCopy(); data->m_allowStoredCredentials = m_allowStoredCredentials; data->m_reportUploadProgress = m_reportUploadProgress; data->m_hasUserGesture = m_hasUserGesture; data->m_downloadToFile = m_downloadToFile; data->m_useStreamOnResponse = m_useStreamOnResponse; data->m_skipServiceWorker = m_skipServiceWorker; data->m_shouldResetAppCache = m_shouldResetAppCache; data->m_requestorID = m_requestorID; data->m_requestorProcessID = m_requestorProcessID; data->m_appCacheHostID = m_appCacheHostID; data->m_requestContext = m_requestContext; data->m_frameType = m_frameType; data->m_fetchRequestMode = m_fetchRequestMode; data->m_fetchCredentialsMode = m_fetchCredentialsMode; data->m_fetchRedirectMode = m_fetchRedirectMode; data->m_loFiState = m_loFiState; data->m_referrerPolicy = m_referrerPolicy; data->m_didSetHTTPReferrer = m_didSetHTTPReferrer; data->m_checkForBrowserSideNavigation = m_checkForBrowserSideNavigation; data->m_uiStartTime = m_uiStartTime; data->m_isExternalRequest = m_isExternalRequest; data->m_inputPerfMetricReportPolicy = m_inputPerfMetricReportPolicy; data->m_followedRedirect = m_followedRedirect; return data.release(); }