bool DocumentLoader::redirectReceived( Resource* resource, const ResourceRequest& request, const ResourceResponse& redirectResponse) { DCHECK_EQ(resource, m_mainResource); DCHECK(!redirectResponse.isNull()); m_request = request; // If the redirecting url is not allowed to display content from the target // origin, then block the redirect. const KURL& requestURL = m_request.url(); RefPtr<SecurityOrigin> redirectingOrigin = SecurityOrigin::create(redirectResponse.url()); if (!redirectingOrigin->canDisplay(requestURL)) { FrameLoader::reportLocalLoadFailed(m_frame, requestURL.getString()); m_fetcher->stopFetching(); return false; } if (!frameLoader()->shouldContinueForNavigationPolicy( m_request, SubstituteData(), this, CheckContentSecurityPolicy, m_navigationType, NavigationPolicyCurrentTab, replacesCurrentHistoryItem(), isClientRedirect(), nullptr)) { m_fetcher->stopFetching(); return false; } DCHECK(timing().fetchStart()); appendRedirect(requestURL); didRedirect(redirectResponse.url(), requestURL); frameLoader()->client()->dispatchDidReceiveServerRedirectForProvisionalLoad(); return true; }
void WebDataSourceImpl::updateNavigation( double redirectStartTime, double redirectEndTime, double fetchStartTime, const WebVector<WebURL>& redirectChain) { // Updates the redirection timing if there is at least one redirection // (between two URLs). if (redirectChain.size() >= 2) { for (size_t i = 0; i + 1 < redirectChain.size(); ++i) didRedirect(redirectChain[i], redirectChain[i + 1]); timing().setRedirectStart(redirectStartTime); timing().setRedirectEnd(redirectEndTime); } timing().setFetchStart(fetchStartTime); }