blob: 15c3e4f5264d9f90094b0f9859b692299cabfd29 [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 "content/public/test/test_web_ui.h"
#include <utility>
#include "base/callback.h"
#include "base/memory/ptr_util.h"
#include "base/notreached.h"
#include "base/strings/string_piece.h"
#include "content/public/browser/web_ui_controller.h"
#include "content/public/browser/web_ui_message_handler.h"
namespace content {
TestWebUI::TestWebUI() = default;
TestWebUI::~TestWebUI() {
ClearTrackedCalls();
}
void TestWebUI::ClearTrackedCalls() {
call_data_.clear();
}
void TestWebUI::HandleReceivedMessage(const std::string& handler_name,
const base::ListValue* args) {
const auto callbacks_map_it = message_callbacks_.find(handler_name);
if (callbacks_map_it != message_callbacks_.end()) {
// Create a copy of the callbacks before running them. Without this, it
// could be possible for the callback's handler to register a new message
// handler during iteration of the vector, resulting in undefined behavior.
std::vector<MessageCallback> callbacks_to_run = callbacks_map_it->second;
for (auto& callback : callbacks_to_run)
callback.Run(args->GetList());
return;
}
const auto deprecated_callbacks_map_it =
deprecated_message_callbacks_.find(handler_name);
if (deprecated_callbacks_map_it != deprecated_message_callbacks_.end()) {
// Create a copy of the callbacks before running them. Without this, it
// could be possible for the callback's handler to register a new message
// handler during iteration of the vector, resulting in undefined behavior.
std::vector<DeprecatedMessageCallback> callbacks_to_run =
deprecated_callbacks_map_it->second;
for (auto& callback : callbacks_to_run)
callback.Run(args);
}
}
WebContents* TestWebUI::GetWebContents() {
return web_contents_;
}
WebUIController* TestWebUI::GetController() {
return controller_.get();
}
void TestWebUI::SetController(std::unique_ptr<WebUIController> controller) {
controller_ = std::move(controller);
}
float TestWebUI::GetDeviceScaleFactor() {
return 1.0f;
}
const std::u16string& TestWebUI::GetOverriddenTitle() {
return temp_string_;
}
int TestWebUI::GetBindings() {
return bindings_;
}
void TestWebUI::SetBindings(int bindings) {
bindings_ = bindings;
}
const std::vector<std::string>& TestWebUI::GetRequestableSchemes() {
NOTIMPLEMENTED();
return std::move(std::vector<std::string>());
}
void TestWebUI::AddRequestableScheme(const char* scheme) {
NOTIMPLEMENTED();
return;
}
void TestWebUI::AddMessageHandler(
std::unique_ptr<WebUIMessageHandler> handler) {
handler->set_web_ui(this);
handler->RegisterMessages();
handlers_.push_back(std::move(handler));
}
void TestWebUI::RegisterMessageCallback(base::StringPiece message,
MessageCallback callback) {
message_callbacks_[std::string(message)].push_back(std::move(callback));
}
void TestWebUI::RegisterDeprecatedMessageCallback(
base::StringPiece message,
const DeprecatedMessageCallback& callback) {
deprecated_message_callbacks_[std::string(message)].push_back(callback);
}
bool TestWebUI::CanCallJavascript() {
return true;
}
void TestWebUI::CallJavascriptFunctionUnsafe(const std::string& function_name) {
call_data_.push_back(base::WrapUnique(new CallData(function_name)));
OnJavascriptCall(*call_data_.back());
}
void TestWebUI::CallJavascriptFunctionUnsafe(const std::string& function_name,
const base::Value& arg1) {
call_data_.push_back(base::WrapUnique(new CallData(function_name)));
call_data_.back()->TakeAsArg1(base::Value::ToUniquePtrValue(arg1.Clone()));
OnJavascriptCall(*call_data_.back());
}
void TestWebUI::CallJavascriptFunctionUnsafe(const std::string& function_name,
const base::Value& arg1,
const base::Value& arg2) {
call_data_.push_back(base::WrapUnique(new CallData(function_name)));
call_data_.back()->TakeAsArg1(base::Value::ToUniquePtrValue(arg1.Clone()));
call_data_.back()->TakeAsArg2(base::Value::ToUniquePtrValue(arg2.Clone()));
OnJavascriptCall(*call_data_.back());
}
void TestWebUI::CallJavascriptFunctionUnsafe(const std::string& function_name,
const base::Value& arg1,
const base::Value& arg2,
const base::Value& arg3) {
call_data_.push_back(base::WrapUnique(new CallData(function_name)));
call_data_.back()->TakeAsArg1(base::Value::ToUniquePtrValue(arg1.Clone()));
call_data_.back()->TakeAsArg2(base::Value::ToUniquePtrValue(arg2.Clone()));
call_data_.back()->TakeAsArg3(base::Value::ToUniquePtrValue(arg3.Clone()));
OnJavascriptCall(*call_data_.back());
}
void TestWebUI::CallJavascriptFunctionUnsafe(const std::string& function_name,
const base::Value& arg1,
const base::Value& arg2,
const base::Value& arg3,
const base::Value& arg4) {
call_data_.push_back(base::WrapUnique(new CallData(function_name)));
call_data_.back()->TakeAsArg1(base::Value::ToUniquePtrValue(arg1.Clone()));
call_data_.back()->TakeAsArg2(base::Value::ToUniquePtrValue(arg2.Clone()));
call_data_.back()->TakeAsArg3(base::Value::ToUniquePtrValue(arg3.Clone()));
call_data_.back()->TakeAsArg4(base::Value::ToUniquePtrValue(arg4.Clone()));
OnJavascriptCall(*call_data_.back());
}
void TestWebUI::CallJavascriptFunctionUnsafe(
const std::string& function_name,
const std::vector<const base::Value*>& args) {
NOTREACHED();
}
void TestWebUI::OnJavascriptCall(const CallData& call_data) {
for (JavascriptCallObserver& observer : javascript_call_observers_)
observer.OnJavascriptFunctionCalled(call_data);
}
std::vector<std::unique_ptr<WebUIMessageHandler>>*
TestWebUI::GetHandlersForTesting() {
return &handlers_;
}
TestWebUI::CallData::CallData(const std::string& function_name)
: function_name_(function_name) {
}
TestWebUI::CallData::~CallData() {
}
void TestWebUI::CallData::TakeAsArg1(std::unique_ptr<base::Value> arg) {
arg1_ = std::move(arg);
}
void TestWebUI::CallData::TakeAsArg2(std::unique_ptr<base::Value> arg) {
arg2_ = std::move(arg);
}
void TestWebUI::CallData::TakeAsArg3(std::unique_ptr<base::Value> arg) {
arg3_ = std::move(arg);
}
void TestWebUI::CallData::TakeAsArg4(std::unique_ptr<base::Value> arg) {
arg4_ = std::move(arg);
}
} // namespace content