blob: 5465bc84a4fc1ceaa0f6e802c120b0dc971cc382 [file] [log] [blame]
// Copyright 2018 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.
#ifndef CONTENT_PUBLIC_TEST_TEST_DEVTOOLS_PROTOCOL_CLIENT_H_
#define CONTENT_PUBLIC_TEST_TEST_DEVTOOLS_PROTOCOL_CLIENT_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/callback.h"
#include "base/values.h"
#include "content/public/browser/devtools_agent_host.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace content {
class TestDevToolsProtocolClient : public DevToolsAgentHostClient {
public:
typedef base::RepeatingCallback<bool(const base::Value::Dict&)>
NotificationMatcher;
TestDevToolsProtocolClient();
~TestDevToolsProtocolClient() override;
protected:
const base::Value::Dict* SendCommand(std::string method,
base::Value::Dict params,
bool wait = true) {
return SendSessionCommand(method, std::move(params), std::string(), wait);
}
const base::Value::Dict* SendCommandSync(std::string method) {
return SendCommand(std::move(method), base::Value::Dict(), true);
}
const base::Value::Dict* SendCommandSync(std::string method,
base::Value::Dict params) {
return SendCommand(std::move(method), std::move(params), true);
}
const base::Value::Dict* SendCommandAsync(std::string method) {
return SendCommand(std::move(method), base::Value::Dict(), false);
}
const base::Value::Dict* SendCommandAsync(std::string method,
base::Value::Dict params) {
return SendCommand(std::move(method), std::move(params), false);
}
// DEPRECATED! Use the overload above.
const base::Value::Dict* SendCommand(
std::string method,
std::unique_ptr<base::DictionaryValue> params,
bool wait = true) {
base::Value::Dict params_dict;
if (params) {
params_dict = std::move(
base::Value::FromUniquePtrValue(std::move(params)).GetDict());
}
return SendSessionCommand(std::move(method), std::move(params_dict),
std::string(), wait);
}
const base::Value::Dict* SendSessionCommand(const std::string method,
base::Value::Dict params,
const std::string session_id,
bool wait);
void AttachToWebContents(WebContents* web_contents);
void AttachToBrowserTarget();
void DetachProtocolClient() {
if (agent_host_) {
agent_host_->DetachClient(this);
agent_host_ = nullptr;
}
}
bool HasExistingNotification() const { return !notifications_.empty(); }
bool HasExistingNotification(const std::string& notification) const;
base::Value::Dict WaitForNotification(const std::string& notification,
bool allow_existing);
base::Value::Dict WaitForNotification(const std::string& notification) {
return WaitForNotification(notification, false);
}
// Waits for a notification whose params, when passed to |matcher|, returns
// true. Existing notifications are allowed.
base::Value::Dict WaitForMatchingNotification(
const std::string& notification,
const NotificationMatcher& matcher);
void ClearNotifications() { notifications_.clear(); }
void set_agent_host_can_close() { agent_host_can_close_ = true; }
void SetAllowUnsafeOperations(bool allow) {
allow_unsafe_operations_ = allow;
}
void SetIsTrusted(bool is_trusted) { is_trusted_ = is_trusted; }
void SetNavigationInitiatorOrigin(
const url::Origin& navigation_initiator_origin) {
navigation_initiator_origin_ = navigation_initiator_origin;
}
void SetMayReadLocalFiles(bool may_read_local_files) {
may_read_local_files_ = may_read_local_files;
}
const base::Value::Dict* result() const;
const base::Value::Dict* error() const;
int received_responses_count() const { return received_responses_count_; }
scoped_refptr<DevToolsAgentHost> agent_host_;
private:
void WaitForResponse();
void RunLoopUpdatingQuitClosure();
void DispatchProtocolMessage(DevToolsAgentHost* agent_host,
base::span<const uint8_t> message) override;
void AgentHostClosed(DevToolsAgentHost* agent_host) override;
absl::optional<url::Origin> GetNavigationInitiatorOrigin() override;
bool AllowUnsafeOperations() override;
bool IsTrusted() override;
bool MayReadLocalFiles() override;
int last_sent_id_ = 0;
int waiting_for_command_result_id_ = 0;
std::string waiting_for_notification_;
NotificationMatcher waiting_for_notification_matcher_;
int received_responses_count_ = 0;
base::Value::Dict response_;
base::Value::Dict received_notification_params_;
std::vector<base::Value::Dict> notifications_;
bool in_dispatch_ = false;
bool agent_host_can_close_ = false;
base::OnceClosure run_loop_quit_closure_;
bool allow_unsafe_operations_ = true;
bool is_trusted_ = true;
absl::optional<url::Origin> navigation_initiator_origin_;
bool may_read_local_files_ = true;
};
} // namespace content
#endif // CONTENT_PUBLIC_TEST_TEST_DEVTOOLS_PROTOCOL_CLIENT_H_