blob: ab04c773cd777815ed4a1ac88e18cc12a8597214 [file] [log] [blame]
// Copyright 2015 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/core/testing/sim/sim_network.h"
#include <memory>
#include <utility>
#include "third_party/blink/public/platform/web_url_error.h"
#include "third_party/blink/public/platform/web_url_loader.h"
#include "third_party/blink/public/platform/web_url_loader_client.h"
#include "third_party/blink/public/platform/web_url_loader_mock_factory.h"
#include "third_party/blink/public/platform/web_url_response.h"
#include "third_party/blink/public/web/web_navigation_params.h"
#include "third_party/blink/renderer/core/loader/document_loader.h"
#include "third_party/blink/renderer/core/testing/sim/sim_request.h"
#include "third_party/blink/renderer/platform/loader/static_data_navigation_body_loader.h"
#include "third_party/blink/renderer/platform/testing/url_test_helpers.h"
namespace blink {
static SimNetwork* g_network = nullptr;
SimNetwork::SimNetwork() : current_request_(nullptr) {
url_test_helpers::SetLoaderDelegate(this);
DCHECK(!g_network);
g_network = this;
}
SimNetwork::~SimNetwork() {
url_test_helpers::SetLoaderDelegate(nullptr);
// TODO(crbug.com/751425): We should use the mock functionality
// via |SimTest::web_frame_client_| and/or |SimTest::web_view_helper_|.
url_test_helpers::UnregisterAllURLsAndClearMemoryCache();
g_network = nullptr;
}
SimNetwork& SimNetwork::Current() {
DCHECK(g_network);
return *g_network;
}
void SimNetwork::ServePendingRequests() {
// TODO(crbug.com/751425): We should use the mock functionality
// via |SimTest::web_frame_client_| and/or |SimTest::web_view_helper_|.
url_test_helpers::ServeAsynchronousRequests();
}
void SimNetwork::DidReceiveResponse(WebURLLoaderClient* client,
const WebURLResponse& response) {
auto it = requests_.find(response.CurrentRequestUrl().GetString());
if (it == requests_.end()) {
client->DidReceiveResponse(response);
return;
}
DCHECK(it->value);
current_request_ = it->value;
current_request_->DidReceiveResponse(client, response);
}
void SimNetwork::DidReceiveData(WebURLLoaderClient* client,
const char* data,
int data_length) {
if (!current_request_)
client->DidReceiveData(data, data_length);
}
void SimNetwork::DidFail(WebURLLoaderClient* client,
const WebURLError& error,
int64_t total_encoded_data_length,
int64_t total_encoded_body_length,
int64_t total_decoded_body_length) {
if (!current_request_) {
client->DidFail(error, base::TimeTicks::Now(), total_encoded_data_length,
total_encoded_body_length, total_decoded_body_length);
return;
}
current_request_->DidFail(error);
}
void SimNetwork::DidFinishLoading(WebURLLoaderClient* client,
base::TimeTicks finish_time,
int64_t total_encoded_data_length,
int64_t total_encoded_body_length,
int64_t total_decoded_body_length) {
if (!current_request_) {
client->DidFinishLoading(finish_time, total_encoded_data_length,
total_encoded_body_length,
total_decoded_body_length, false);
return;
}
current_request_ = nullptr;
}
void SimNetwork::AddRequest(SimRequestBase& request) {
DCHECK(!requests_.Contains(request.url_.GetString()));
requests_.insert(request.url_.GetString(), &request);
WebURLResponse response(request.url_);
response.SetMimeType(request.mime_type_);
response.AddHttpHeaderField("Content-Type", request.mime_type_);
if (request.redirect_url_.IsEmpty()) {
response.SetHttpStatusCode(request.response_http_status_);
} else {
response.SetHttpStatusCode(302);
response.AddHttpHeaderField("Location", request.redirect_url_);
}
for (const auto& http_header : request.response_http_headers_)
response.AddHttpHeaderField(http_header.key, http_header.value);
// TODO(crbug.com/751425): We should use the mock functionality
// via |SimTest::web_frame_client_| and/or |SimTest::web_view_helper_|.
url_test_helpers::RegisterMockedURLLoadWithCustomResponse(request.url_, "",
response);
}
void SimNetwork::RemoveRequest(SimRequestBase& request) {
requests_.erase(request.url_);
// TODO(crbug.com/751425): We should use the mock functionality
// via |SimTest::web_frame_client_| and/or |SimTest::web_view_helper_|.
url_test_helpers::RegisterMockedURLUnregister(request.url_);
}
bool SimNetwork::FillNavigationParamsResponse(WebNavigationParams* params) {
auto it = requests_.find(params->url.GetString());
SimRequestBase* request = it->value;
params->response = WebURLResponse(params->url);
params->response.SetMimeType(request->mime_type_);
params->response.AddHttpHeaderField("Content-Type", request->mime_type_);
params->response.SetHttpStatusCode(request->response_http_status_);
for (const auto& http_header : request->response_http_headers_)
params->response.AddHttpHeaderField(http_header.key, http_header.value);
auto body_loader = std::make_unique<StaticDataNavigationBodyLoader>();
request->UsedForNavigation(body_loader.get());
params->body_loader = std::move(body_loader);
params->referrer = request->referrer_;
return true;
}
} // namespace blink