| 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 ae12c4b569dfa5d45793539a6282f0cc06b540fb..86aef8465bb1cceb8d75a3123e94c0e45200e346 100644
|
| --- a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
|
| +++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
|
| @@ -122,7 +122,14 @@ void ResourceLoader::cancel() {
|
| m_resource->lastResourceRequest().url()));
|
| }
|
|
|
| -void ResourceLoader::willFollowRedirect(
|
| +void ResourceLoader::cancelForRedirectAccessCheckError(const KURL& newURL) {
|
| + m_resource->willNotFollowRedirect();
|
| +
|
| + if (m_loader)
|
| + didFail(nullptr, ResourceError::cancelledDueToAccessCheckError(newURL));
|
| +}
|
| +
|
| +bool ResourceLoader::willFollowRedirect(
|
| WebURLLoader*,
|
| WebURLRequest& passedNewRequest,
|
| const WebURLResponse& passedRedirectResponse) {
|
| @@ -135,15 +142,31 @@ void ResourceLoader::willFollowRedirect(
|
| newRequest.setRedirectStatus(
|
| ResourceRequest::RedirectStatus::FollowedRedirect);
|
|
|
| - if (m_fetcher->willFollowRedirect(m_resource.get(), newRequest,
|
| - redirectResponse)) {
|
| - 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)) {
|
| + 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*,
|
|
|