| 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 5085721e81f06b478dd8247f3a6191cd55106163..2d5de6f7b089dc1c2dfe086538866f3dd1b9afb1 100644
|
| --- a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
|
| +++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
|
| @@ -123,22 +123,44 @@ void ResourceLoader::cancel()
|
| didFail(nullptr, ResourceError::cancelledError(m_resource->lastResourceRequest().url()));
|
| }
|
|
|
| -void ResourceLoader::willFollowRedirect(WebURLLoader*, WebURLRequest& passedNewRequest, const WebURLResponse& passedRedirectResponse, int64_t encodedDataLength)
|
| +void ResourceLoader::cancelForRedirectAccessCheckError(const KURL& newURL)
|
| {
|
| - ASSERT(!passedNewRequest.isNull());
|
| - ASSERT(!passedRedirectResponse.isNull());
|
| + m_resource->willNotFollowRedirect();
|
|
|
| + if (m_loader)
|
| + didFail(nullptr, ResourceError::cancelledDueToAccessCheckError(newURL));
|
| +}
|
| +
|
| +bool ResourceLoader::willFollowRedirect(WebURLLoader*, WebURLRequest& passedNewRequest, const WebURLResponse& passedRedirectResponse, int64_t encodedDataLength)
|
| +{
|
| ResourceRequest& newRequest(passedNewRequest.toMutableResourceRequest());
|
| const ResourceResponse& redirectResponse(passedRedirectResponse.toResourceResponse());
|
| newRequest.setRedirectStatus(ResourceRequest::RedirectStatus::FollowedRedirect);
|
|
|
| - if (m_fetcher->willFollowRedirect(m_resource.get(), newRequest, redirectResponse, encodedDataLength)) {
|
| - m_resource->willFollowRedirect(newRequest, redirectResponse);
|
| - } else {
|
| - m_resource->willNotFollowRedirect();
|
| - if (m_loader)
|
| - didFail(nullptr, ResourceError::cancelledDueToAccessCheckError(newRequest.url()));
|
| + const KURL originalURL = newRequest.url();
|
| +
|
| + if (!m_fetcher->willFollowRedirect(m_resource.get(), newRequest, redirectResponse, encodedDataLength)) {
|
| + cancelForRedirectAccessCheckError(newRequest.url());
|
| + return false;
|
| }
|
| +
|
| + // ResourceFetcher::willFollowRedirect() may rewrite the URL to
|
| + // something else not for rejecting redirect but for other reasons.
|
| + // E.g. WebFrameTestClient::willSendRequest() and
|
| + // RenderFrameImpl::willSendRequest(). We should reflect the
|
| + // rewriting but currently we cannot. So, return false to make the
|
| + // redirect fail.
|
| + if (newRequest.url() != originalURL) {
|
| + cancelForRedirectAccessCheckError(newRequest.url());
|
| + return false;
|
| + }
|
| +
|
| + if (!m_resource->willFollowRedirect(newRequest, redirectResponse)) {
|
| + cancelForRedirectAccessCheckError(newRequest.url());
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| }
|
|
|
| void ResourceLoader::didReceiveCachedMetadata(WebURLLoader*, const char* data, int length)
|
|
|