blob: 6bc52775d2886554f43adce9d86be58e8f2b77ba [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/worker_host/mock_shared_worker.h"
#include "mojo/public/cpp/test_support/test_utils.h"
#include "services/network/public/mojom/content_security_policy.mojom-forward.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/loader/url_loader_factory_bundle.h"
#include "third_party/blink/public/mojom/worker/shared_worker_info.mojom.h"
#include "url/gurl.h"
namespace content {
namespace {
template <typename T>
bool CheckEquality(const T& expected, const T& actual) {
EXPECT_EQ(expected, actual);
return expected == actual;
}
} // namespace
MockSharedWorker::MockSharedWorker(
mojo::PendingReceiver<blink::mojom::SharedWorker> receiver)
: receiver_(this, std::move(receiver)) {}
MockSharedWorker::~MockSharedWorker() = default;
bool MockSharedWorker::CheckReceivedConnect(int* connection_request_id,
blink::MessagePortChannel* port) {
if (connect_received_.empty())
return false;
if (connection_request_id)
*connection_request_id = connect_received_.front().first;
if (port)
*port = connect_received_.front().second;
connect_received_.pop();
return true;
}
bool MockSharedWorker::CheckNotReceivedConnect() {
return connect_received_.empty();
}
bool MockSharedWorker::CheckReceivedTerminate() {
if (!terminate_received_)
return false;
terminate_received_ = false;
return true;
}
void MockSharedWorker::Disconnect() {
receiver_.reset();
}
void MockSharedWorker::Connect(int connection_request_id,
blink::MessagePortDescriptor port) {
connect_received_.emplace(connection_request_id,
blink::MessagePortChannel(std::move(port)));
}
void MockSharedWorker::Terminate() {
// Allow duplicate events.
terminate_received_ = true;
}
MockSharedWorkerFactory::MockSharedWorkerFactory(
mojo::PendingReceiver<blink::mojom::SharedWorkerFactory> receiver)
: receiver_(this, std::move(receiver)) {}
MockSharedWorkerFactory::~MockSharedWorkerFactory() = default;
bool MockSharedWorkerFactory::CheckReceivedCreateSharedWorker(
const GURL& expected_url,
const std::string& expected_name,
const std::vector<network::mojom::ContentSecurityPolicyPtr>&
expected_content_security_policies,
mojo::Remote<blink::mojom::SharedWorkerHost>* host,
mojo::PendingReceiver<blink::mojom::SharedWorker>* receiver) {
std::unique_ptr<CreateParams> create_params = std::move(create_params_);
if (!create_params)
return false;
if (!CheckEquality(expected_url, create_params->info->url))
return false;
if (!CheckEquality(expected_name, create_params->info->options->name))
return false;
if (!CheckEquality(expected_content_security_policies,
create_params->info->content_security_policies)) {
return false;
}
if (!CheckEquality(ukm::SourceIdType::WORKER_ID,
ukm::GetSourceIdType(create_params->ukm_source_id))) {
return false;
}
host->Bind(std::move(create_params->host));
*receiver = std::move(create_params->receiver);
return true;
}
void MockSharedWorkerFactory::Disconnect() {
receiver_.reset();
}
void MockSharedWorkerFactory::CreateSharedWorker(
blink::mojom::SharedWorkerInfoPtr info,
const blink::SharedWorkerToken& token,
const blink::StorageKey& constructor_key,
const url::Origin& renderer_origin,
bool is_constructor_secure_context,
const std::string& user_agent,
const blink::UserAgentMetadata& ua_metadata,
bool pause_on_start,
const base::UnguessableToken& devtools_worker_token,
const blink::RendererPreferences& renderer_preferences,
mojo::PendingReceiver<blink::mojom::RendererPreferenceWatcher>
preference_watcher_receiver,
mojo::PendingRemote<blink::mojom::WorkerContentSettingsProxy>
content_settings,
blink::mojom::ServiceWorkerContainerInfoForClientPtr
service_worker_container_info,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::PendingURLLoaderFactoryBundle>
subresource_loader_factories,
blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
blink::mojom::PolicyContainerPtr policy_container,
mojo::PendingRemote<blink::mojom::SharedWorkerHost> host,
mojo::PendingReceiver<blink::mojom::SharedWorker> receiver,
mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
browser_interface_broker,
ukm::SourceId ukm_source_id,
bool require_cross_site_request_for_cookies,
mojo::PendingReceiver<blink::mojom::ReportingObserver>
coep_reporting_observer,
mojo::PendingReceiver<blink::mojom::ReportingObserver>
dip_reporting_observer) {
DCHECK(!create_params_);
create_params_ = std::make_unique<CreateParams>();
create_params_->info = std::move(info);
create_params_->pause_on_start = pause_on_start;
create_params_->content_settings = std::move(content_settings);
create_params_->host = std::move(host);
create_params_->receiver = std::move(receiver);
create_params_->ukm_source_id = ukm_source_id;
create_params_->require_cross_site_request_for_cookies =
require_cross_site_request_for_cookies;
}
MockSharedWorkerFactory::CreateParams::CreateParams() = default;
MockSharedWorkerFactory::CreateParams::~CreateParams() = default;
MockSharedWorkerClient::MockSharedWorkerClient() = default;
MockSharedWorkerClient::~MockSharedWorkerClient() = default;
void MockSharedWorkerClient::Bind(
mojo::PendingReceiver<blink::mojom::SharedWorkerClient> receiver) {
receiver_.Bind(std::move(receiver));
}
void MockSharedWorkerClient::Close() {
receiver_.reset();
}
bool MockSharedWorkerClient::CheckReceivedOnCreated() {
if (!on_created_received_)
return false;
on_created_received_ = false;
return true;
}
bool MockSharedWorkerClient::CheckReceivedOnConnected(
std::set<blink::mojom::WebFeature> expected_used_features) {
if (!on_connected_received_)
return false;
on_connected_received_ = false;
if (!CheckEquality(expected_used_features, on_connected_features_))
return false;
return true;
}
bool MockSharedWorkerClient::CheckReceivedOnFeatureUsed(
blink::mojom::WebFeature expected_feature) {
if (!on_feature_used_received_)
return false;
on_feature_used_received_ = false;
if (!CheckEquality(expected_feature, on_feature_used_feature_))
return false;
return true;
}
bool MockSharedWorkerClient::CheckNotReceivedOnFeatureUsed() {
return !on_feature_used_received_;
}
bool MockSharedWorkerClient::CheckReceivedOnScriptLoadFailed() {
if (!on_script_load_failed_)
return false;
on_script_load_failed_ = false;
return true;
}
void MockSharedWorkerClient::ResetReceiver() {
receiver_.reset();
}
void MockSharedWorkerClient::OnCreated(
blink::mojom::SharedWorkerCreationContextType creation_context_type) {
DCHECK(!on_created_received_);
on_created_received_ = true;
}
void MockSharedWorkerClient::OnConnected(
const std::vector<blink::mojom::WebFeature>& features_used) {
DCHECK(!on_connected_received_);
on_connected_received_ = true;
for (auto feature : features_used)
on_connected_features_.insert(feature);
}
void MockSharedWorkerClient::OnScriptLoadFailed(
const std::string& error_message) {
DCHECK(!on_script_load_failed_);
on_script_load_failed_ = true;
}
void MockSharedWorkerClient::OnFeatureUsed(blink::mojom::WebFeature feature) {
DCHECK(!on_feature_used_received_);
on_feature_used_received_ = true;
on_feature_used_feature_ = feature;
}
} // namespace content