blob: 6bb318e0afb29f1b9ac0a9f5ee995c78d2aabf86 [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 "third_party/blink/renderer/platform/testing/weburl_loader_mock.h"
#include <utility>
#include "net/cookies/site_for_cookies.h"
#include "services/network/public/cpp/resource_request.h"
#include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h"
#include "third_party/blink/public/platform/url_conversion.h"
#include "third_party/blink/public/platform/web_data.h"
#include "third_party/blink/public/platform/web_security_origin.h"
#include "third_party/blink/public/platform/web_url_error.h"
#include "third_party/blink/public/platform/web_url_loader_client.h"
#include "third_party/blink/public/platform/web_url_request_extra_data.h"
#include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h"
#include "third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.h"
#include "third_party/blink/renderer/platform/wtf/shared_buffer.h"
namespace blink {
WebURLLoaderMock::WebURLLoaderMock(WebURLLoaderMockFactoryImpl* factory)
: factory_(factory) {}
WebURLLoaderMock::~WebURLLoaderMock() {
Cancel();
}
void WebURLLoaderMock::ServeAsynchronousRequest(
WebURLLoaderTestDelegate* delegate,
const WebURLResponse& response,
const WebData& data,
const base::Optional<WebURLError>& error) {
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 = std::make_unique<WebURLLoaderTestDelegate>();
delegate = default_delegate.get();
}
if (error) {
delegate->DidFail(client_, *error, data.size(), 0, 0);
return;
}
// didReceiveResponse() and didReceiveData() might end up getting ::cancel()
// to be called which will make the ResourceLoader to delete |this|.
base::WeakPtr<WebURLLoaderMock> self = weak_factory_.GetWeakPtr();
delegate->DidReceiveResponse(client_, response);
if (!self)
return;
data.ForEachSegment([this, &delegate, &self](const char* segment,
size_t segment_size,
size_t segment_offset) {
delegate->DidReceiveData(client_, segment, segment_size);
// DidReceiveData() may clear the |self| weak ptr. We stop iterating
// when that happens.
return self;
});
if (!self)
return;
delegate->DidFinishLoading(client_, base::TimeTicks(), data.size(),
data.size(), data.size());
}
WebURL WebURLLoaderMock::ServeRedirect(
const WebString& method,
const WebURLResponse& redirect_response) {
KURL redirect_url(redirect_response.HttpHeaderField("Location"));
base::WeakPtr<WebURLLoaderMock> self = weak_factory_.GetWeakPtr();
bool report_raw_headers = false;
bool follow = client_->WillFollowRedirect(
redirect_url, net::SiteForCookies::FromUrl(redirect_url), WebString(),
network::mojom::ReferrerPolicy::kDefault, method, redirect_response,
report_raw_headers, nullptr /* removed_headers */);
// |this| might be deleted in willFollowRedirect().
if (!self)
return redirect_url;
if (!follow)
Cancel();
return redirect_url;
}
void WebURLLoaderMock::LoadSynchronously(
std::unique_ptr<network::ResourceRequest> request,
scoped_refptr<WebURLRequestExtraData> url_request_extra_data,
int requestor_id,
bool pass_response_pipe_to_client,
bool no_mime_sniffing,
base::TimeDelta timeout_interval,
WebURLLoaderClient* client,
WebURLResponse& response,
base::Optional<WebURLError>& error,
WebData& data,
int64_t& encoded_data_length,
int64_t& encoded_body_length,
blink::WebBlobInfo& downloaded_blob,
std::unique_ptr<blink::ResourceLoadInfoNotifierWrapper>
resource_load_info_notifier_wrapper) {
DCHECK(factory_->IsMockedURL(WebURL(KURL(request->url)))) << request->url;
factory_->LoadSynchronously(std::move(request), &response, &error, &data,
&encoded_data_length);
}
void WebURLLoaderMock::LoadAsynchronously(
std::unique_ptr<network::ResourceRequest> request,
scoped_refptr<WebURLRequestExtraData> url_request_extra_data,
int requestor_id,
bool no_mime_sniffing,
std::unique_ptr<blink::ResourceLoadInfoNotifierWrapper>
resource_load_info_notifier_wrapper,
WebURLLoaderClient* client) {
DCHECK(client);
DCHECK(factory_->IsMockedURL(WebURL(KURL(request->url)))) << request->url;
client_ = client;
factory_->LoadAsynchronouly(std::move(request), this);
}
void WebURLLoaderMock::Cancel() {
client_ = nullptr;
factory_->CancelLoad(this);
}
void WebURLLoaderMock::SetDefersLoading(DeferType deferred) {
is_deferred_ = (deferred != DeferType::kNotDeferred);
// Ignores setDefersLoading(false) safely.
if (!is_deferred_)
return;
// setDefersLoading(true) is not implemented.
NOTIMPLEMENTED();
}
void WebURLLoaderMock::DidChangePriority(WebURLRequest::Priority new_priority,
int intra_priority_value) {}
scoped_refptr<base::SingleThreadTaskRunner>
WebURLLoaderMock::GetTaskRunnerForBodyLoader() {
return base::MakeRefCounted<scheduler::FakeTaskRunner>();
}
base::WeakPtr<WebURLLoaderMock> WebURLLoaderMock::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
} // namespace blink