blob: 11d55d77e99b9bfe45730b7dd6e45e80a539f760 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "platform/testing/weburl_loader_mock.h"
#include "platform/testing/weburl_loader_mock_factory_impl.h"
#include "public/platform/URLConversion.h"
#include "public/platform/WebData.h"
#include "public/platform/WebURLError.h"
#include "public/platform/WebURLLoaderClient.h"
namespace blink {
namespace {
void assertFallbackLoaderAvailability(const WebURL& url,
const WebURLLoader* default_loader) {
DCHECK(KURL(url).protocolIsData()) << "shouldn't be falling back: "
<< url.string().utf8();
DCHECK(default_loader) << "default_loader wasn't set: "
<< url.string().utf8();
}
} // namespace
WebURLLoaderMock::WebURLLoaderMock(WebURLLoaderMockFactoryImpl* factory,
WebURLLoader* default_loader)
: factory_(factory),
default_loader_(WTF::wrapUnique(default_loader)),
weak_factory_(this) {}
WebURLLoaderMock::~WebURLLoaderMock() {
cancel();
}
void WebURLLoaderMock::ServeAsynchronousRequest(
WebURLLoaderTestDelegate* delegate,
const WebURLResponse& response,
const WebData& data,
const WebURLError& error) {
DCHECK(!using_default_loader_);
if (!client_)
return;
// If no delegate is provided then create an empty one. The default behavior
// will just proxy to the client.
std::unique_ptr<WebURLLoaderTestDelegate> default_delegate;
if (!delegate) {
default_delegate = WTF::wrapUnique(new WebURLLoaderTestDelegate());
delegate = default_delegate.get();
}
// didReceiveResponse() and didReceiveData() might end up getting ::cancel()
// to be called which will make the ResourceLoader to delete |this|.
WeakPtr<WebURLLoaderMock> self = weak_factory_.createWeakPtr();
delegate->didReceiveResponse(client_, response);
if (!self)
return;
if (error.reason) {
delegate->didFail(client_, error, data.size(), 0);
return;
}
delegate->didReceiveData(client_, data.data(), data.size());
if (!self)
return;
delegate->didFinishLoading(client_, 0, data.size(), data.size());
}
WebURLRequest WebURLLoaderMock::ServeRedirect(
const WebURLRequest& request,
const WebURLResponse& redirectResponse) {
KURL redirectURL(
ParsedURLString, redirectResponse.httpHeaderField("Location"));
WebURLRequest newRequest(redirectURL);
newRequest.setFirstPartyForCookies(redirectURL);
newRequest.setDownloadToFile(request.downloadToFile());
newRequest.setUseStreamOnResponse(request.useStreamOnResponse());
newRequest.setRequestContext(request.getRequestContext());
newRequest.setFrameType(request.getFrameType());
newRequest.setServiceWorkerMode(request.getServiceWorkerMode());
newRequest.setShouldResetAppCache(request.shouldResetAppCache());
newRequest.setFetchRequestMode(request.getFetchRequestMode());
newRequest.setFetchCredentialsMode(request.getFetchCredentialsMode());
newRequest.setHTTPMethod(request.httpMethod());
newRequest.setHTTPBody(request.httpBody());
WeakPtr<WebURLLoaderMock> self = weak_factory_.createWeakPtr();
bool follow = client_->willFollowRedirect(newRequest, redirectResponse);
if (!follow)
newRequest = WebURLRequest();
// |this| might be deleted in willFollowRedirect().
if (!self)
return newRequest;
if (!follow)
cancel();
return newRequest;
}
void WebURLLoaderMock::loadSynchronously(const WebURLRequest& request,
WebURLResponse& response,
WebURLError& error,
WebData& data,
int64_t& encoded_data_length,
int64_t& encoded_body_length) {
if (factory_->IsMockedURL(request.url())) {
factory_->LoadSynchronously(request, &response, &error, &data,
&encoded_data_length);
return;
}
assertFallbackLoaderAvailability(request.url(), default_loader_.get());
using_default_loader_ = true;
default_loader_->loadSynchronously(request, response, error, data,
encoded_data_length, encoded_body_length);
}
void WebURLLoaderMock::loadAsynchronously(const WebURLRequest& request,
WebURLLoaderClient* client) {
DCHECK(client);
if (factory_->IsMockedURL(request.url())) {
client_ = client;
factory_->LoadAsynchronouly(request, this);
return;
}
assertFallbackLoaderAvailability(request.url(), default_loader_.get());
using_default_loader_ = true;
default_loader_->loadAsynchronously(request, client);
}
void WebURLLoaderMock::cancel() {
if (using_default_loader_) {
default_loader_->cancel();
return;
}
client_ = nullptr;
factory_->CancelLoad(this);
}
void WebURLLoaderMock::setDefersLoading(bool deferred) {
is_deferred_ = deferred;
if (using_default_loader_) {
default_loader_->setDefersLoading(deferred);
return;
}
// Ignores setDefersLoading(false) safely.
if (!deferred)
return;
// setDefersLoading(true) is not implemented.
NOTIMPLEMENTED();
}
void WebURLLoaderMock::setLoadingTaskRunner(
base::SingleThreadTaskRunner* runner) {
// In principle this is NOTIMPLEMENTED(), but if we put that here it floods
// the console during webkit unit tests, so we leave the function empty.
DCHECK(runner);
}
WeakPtr<WebURLLoaderMock> WebURLLoaderMock::GetWeakPtr() {
return weak_factory_.createWeakPtr();
}
} // namespace blink