#include "content/browser/devtools/devtools_session.h"
#include <utility>
#include <vector>
#include "base/containers/contains.h"
#include "base/containers/flat_set.h"
#include "base/debug/stack_trace.h"
#include "base/functional/bind.h"
#include "base/trace_event/trace_event.h"
#include "content/browser/devtools/devtools_manager.h"
#include "content/browser/devtools/protocol/devtools_domain_handler.h"
#include "content/browser/devtools/protocol/protocol.h"
#include "content/browser/devtools/render_frame_devtools_agent_host.h"
#include "content/public/browser/devtools_external_agent_proxy_delegate.h"
#include "content/public/browser/devtools_manager_delegate.h"
#include "third_party/inspector_protocol/crdtp/cbor.h"
#include "third_party/inspector_protocol/crdtp/dispatch.h"
#include "third_party/inspector_protocol/crdtp/json.h"
namespace content {
namespace {
bool ShouldSendOnIO(crdtp::span<uint8_t> method) { … }
bool ShouldSuspendDuringNavigation(crdtp::span<uint8_t> method) { … }
bool TerminateOnCrossProcessNavigation(crdtp::span<uint8_t> method) { … }
const char kResumeMethod[] = …;
const char kSessionId[] = …;
const char kTargetClosedMessage[] = …;
const char kTargetCrashedMessage[] = …;
}
DevToolsSession::PendingMessage::PendingMessage(PendingMessage&&) = default;
DevToolsSession::PendingMessage::PendingMessage(int call_id,
crdtp::span<uint8_t> method,
crdtp::span<uint8_t> payload)
: … { … }
DevToolsSession::PendingMessage::~PendingMessage() = default;
DevToolsSession::DevToolsSession(DevToolsAgentHostClient* client, Mode mode)
: … { … }
DevToolsSession::DevToolsSession(DevToolsAgentHostClient* client,
const std::string& session_id,
DevToolsSession* parent,
Mode mode)
: … { … }
DevToolsSession::~DevToolsSession() { … }
void DevToolsSession::SetAgentHost(DevToolsAgentHostImpl* agent_host) { … }
void DevToolsSession::SetRuntimeResumeCallback(
base::OnceClosure runtime_resume) { … }
bool DevToolsSession::IsWaitingForDebuggerOnStart() const { … }
void DevToolsSession::Dispose() { … }
DevToolsSession* DevToolsSession::GetRootSession() { … }
void DevToolsSession::AddHandler(
std::unique_ptr<protocol::DevToolsDomainHandler> handler) { … }
void DevToolsSession::SetBrowserOnly(bool browser_only) { … }
void DevToolsSession::TurnIntoExternalProxy(
DevToolsExternalAgentProxyDelegate* proxy_delegate) { … }
void DevToolsSession::AttachToAgent(blink::mojom::DevToolsAgent* agent,
bool force_using_io_session) { … }
void DevToolsSession::MojoConnectionDestroyed() { … }
void DevToolsSession::DispatchProtocolMessage(
base::span<const uint8_t> message) { … }
void DevToolsSession::DispatchProtocolMessageInternal(
crdtp::Dispatchable dispatchable,
base::span<const uint8_t> message) { … }
void DevToolsSession::HandleCommand(base::span<const uint8_t> message) { … }
void DevToolsSession::HandleCommandInternal(crdtp::Dispatchable dispatchable,
base::span<const uint8_t> message) { … }
void DevToolsSession::FallThrough(int call_id,
crdtp::span<uint8_t> method,
crdtp::span<uint8_t> message) { … }
void DevToolsSession::DispatchProtocolMessageToClient(
std::vector<uint8_t> message) { … }
content::DevToolsAgentHost* DevToolsSession::GetAgentHost() { … }
content::DevToolsAgentHostClient* DevToolsSession::GetClient() { … }
void DevToolsSession::DispatchToAgent(const PendingMessage& message) { … }
void DevToolsSession::SuspendSendingMessagesToAgent() { … }
void DevToolsSession::ResumeSendingMessagesToAgent() { … }
void DevToolsSession::ClearPendingMessages(bool did_crash) { … }
void DevToolsSession::SendProtocolResponse(
int call_id,
std::unique_ptr<protocol::Serializable> message) { … }
void DevToolsSession::SendProtocolNotification(
std::unique_ptr<protocol::Serializable> message) { … }
void DevToolsSession::FlushProtocolNotifications() { … }
static void DispatchProtocolResponseOrNotification(
DevToolsAgentHostClient* client,
DevToolsAgentHostImpl* agent_host,
blink::mojom::DevToolsMessagePtr message) { … }
void DevToolsSession::DispatchProtocolResponse(
blink::mojom::DevToolsMessagePtr message,
int call_id,
blink::mojom::DevToolsSessionStatePtr updates) { … }
void DevToolsSession::DispatchProtocolNotification(
blink::mojom::DevToolsMessagePtr message,
blink::mojom::DevToolsSessionStatePtr updates) { … }
void DevToolsSession::DispatchOnClientHost(base::span<const uint8_t> message) { … }
void DevToolsSession::ConnectionClosed() { … }
void DevToolsSession::ApplySessionStateUpdates(
blink::mojom::DevToolsSessionStatePtr updates) { … }
DevToolsSession* DevToolsSession::AttachChildSession(
const std::string& session_id,
DevToolsAgentHostImpl* agent_host,
DevToolsAgentHostClient* client,
Mode mode,
base::OnceClosure resume_callback) { … }
void DevToolsSession::DetachChildSession(const std::string& session_id) { … }
bool DevToolsSession::HasChildSession(const std::string& session_id) { … }
void DevToolsSession::AddObserver(ChildObserver* obs) { … }
void DevToolsSession::RemoveObserver(ChildObserver* obs) { … }
}