#ifndef EXTENSIONS_BROWSER_API_TEST_UTILS_H_
#define EXTENSIONS_BROWSER_API_TEST_UTILS_H_
#include <memory>
#include <optional>
#include <string>
#include <variant>
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/types/expected.h"
#include "base/values.h"
#include "extensions/browser/extension_function.h"
namespace content {
class BrowserContext;
}
namespace extensions {
class ExtensionFunctionDispatcher;
namespace api_test_utils {
class SendResponseHelper {
public:
explicit SendResponseHelper(ExtensionFunction* function);
SendResponseHelper(const SendResponseHelper&) = delete;
SendResponseHelper& operator=(const SendResponseHelper&) = delete;
~SendResponseHelper();
bool has_response() { return response_.get() != nullptr; }
bool GetResponse();
void WaitForResponse();
private:
void OnResponse(ExtensionFunction::ResponseType response,
base::Value::List results,
const std::string& error,
mojom::ExtraResponseDataPtr);
base::RunLoop run_loop_;
std::unique_ptr<bool> response_;
};
enum class FunctionMode {
kNone,
kIncognito,
};
bool GetBoolean(const base::Value::Dict& val, const std::string& key);
int GetInteger(const base::Value::Dict& val, const std::string& key);
std::string GetString(const base::Value::Dict& val, const std::string& key);
base::Value::List GetList(const base::Value::Dict& val, const std::string& key);
base::Value::Dict GetDict(const base::Value::Dict& val, const std::string& key);
base::Value::Dict ToDict(std::optional<base::ValueView> val);
base::Value::List ToList(std::optional<base::ValueView> val);
using ArgsType = std::variant<std::string, base::Value::List>;
std::optional<base::Value> RunFunctionWithDelegateAndReturnSingleResult(
scoped_refptr<ExtensionFunction> function,
ArgsType args,
std::unique_ptr<ExtensionFunctionDispatcher> dispatcher,
FunctionMode mode);
std::optional<base::Value> RunFunctionAndReturnSingleResult(
scoped_refptr<ExtensionFunction> function,
ArgsType args,
content::BrowserContext* context,
FunctionMode mode = FunctionMode::kNone);
std::string RunFunctionAndReturnError(scoped_refptr<ExtensionFunction> function,
ArgsType args,
content::BrowserContext* context,
FunctionMode mode = FunctionMode::kNone);
base::expected<base::Value::List, std::string> RunFunctionAndReturnExpected(
scoped_refptr<ExtensionFunction> function,
ArgsType args,
content::BrowserContext* context,
FunctionMode mode = FunctionMode::kNone);
bool RunFunction(scoped_refptr<ExtensionFunction> function,
ArgsType args,
content::BrowserContext* context,
FunctionMode mode = FunctionMode::kNone);
bool RunFunction(scoped_refptr<ExtensionFunction> function,
ArgsType args,
std::unique_ptr<ExtensionFunctionDispatcher> dispatcher,
FunctionMode mode);
const Extension* GetSingleLoadedExtension(content::BrowserContext* context,
std::string& message);
}
}
#endif