Files
moli/moli-protocol/src/devtools_runtime.rs
T

2458 lines
77 KiB
Rust

//! Protocol-neutral DevTools runtime types.
//!
//! This module is the shared data-shape boundary for CDP, WebDriver Classic,
//! and WebDriver BiDi. It intentionally contains data shapes only; ownership
//! and behavior stay in the DevTools protocol owner layer.
use std::{fmt, str::FromStr, sync::Arc};
use moli_cookie_jar::{StoredCookiePartitionKey, StoredCookieQueryReport};
use moli_core::page::{
DomScrollIntoViewRect, SelectedFile, SubresourceResourceType, is_renderer_backend_node_id,
};
use moli_protocol_cdp::{CdpTargetKindWire, CdpTargetType};
use serde_json::{Value, json};
macro_rules! string_id {
($name:ident) => {
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct $name(String);
impl $name {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
pub fn as_str(&self) -> &str {
&self.0
}
pub fn into_string(self) -> String {
self.0
}
}
impl AsRef<str> for $name {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl From<String> for $name {
fn from(value: String) -> Self {
Self::new(value)
}
}
impl From<&str> for $name {
fn from(value: &str) -> Self {
Self::new(value)
}
}
impl FromStr for $name {
type Err = std::convert::Infallible;
fn from_str(value: &str) -> Result<Self, Self::Err> {
Ok(Self::new(value))
}
}
impl fmt::Display for $name {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
};
}
string_id!(DevToolsBrowserContextId);
string_id!(DevToolsTargetId);
string_id!(DevToolsFrameId);
string_id!(DevToolsSessionId);
string_id!(DevToolsNavigationId);
string_id!(DevToolsRequestId);
string_id!(DevToolsLoaderId);
string_id!(DevToolsRealmId);
string_id!(DevToolsRemoteHandleId);
string_id!(DevToolsPreloadScriptId);
string_id!(DevToolsNetworkInterceptId);
string_id!(DevToolsNetworkDataCollectorId);
string_id!(DevToolsFetchRequestId);
pub fn webdriver_bidi_navigation_id_from_loader_id(loader_id: &str) -> DevToolsNavigationId {
DevToolsNavigationId::from(format!("navigation-{loader_id}"))
}
const WEBDRIVER_BIDI_RENDERER_NODE_SHARED_ID_PREFIX: &str = "moli:bidi-renderer-node:";
pub fn webdriver_bidi_node_shared_id_for_backend_node_id(
backend_node_id: u32,
) -> DevToolsRemoteHandleId {
debug_assert!(is_renderer_backend_node_id(backend_node_id));
DevToolsRemoteHandleId::from(format!(
"{WEBDRIVER_BIDI_RENDERER_NODE_SHARED_ID_PREFIX}{backend_node_id}"
))
}
pub fn is_webdriver_bidi_node_shared_id(shared_id: &str) -> bool {
shared_id
.strip_prefix(WEBDRIVER_BIDI_RENDERER_NODE_SHARED_ID_PREFIX)
.and_then(|id| id.parse::<u32>().ok())
.is_some_and(is_renderer_backend_node_id)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn webdriver_bidi_node_shared_id_uses_renderer_backend_identity() {
let backend_node_id = moli_core::page::RENDERER_BACKEND_NODE_ID_START + 7;
let shared_id = webdriver_bidi_node_shared_id_for_backend_node_id(backend_node_id);
assert_eq!(
shared_id.as_str(),
format!("moli:bidi-renderer-node:{backend_node_id}")
);
assert!(is_webdriver_bidi_node_shared_id(shared_id.as_str()));
}
#[test]
fn legacy_webdriver_bidi_node_shared_id_shape_is_not_internal() {
assert!(!is_webdriver_bidi_node_shared_id("moli:bidi-node:_top:7"));
assert!(!is_webdriver_bidi_node_shared_id(
"moli:bidi-node:child-frame:11"
));
assert!(!is_webdriver_bidi_node_shared_id("not-a-bidi-node"));
}
#[test]
fn devtools_target_kind_maps_tab_cdp_wire_value() {
assert_eq!(
DevToolsTargetKind::from_cdp_type(Some("tab")),
DevToolsTargetKind::Tab
);
assert_eq!(DevToolsTargetKind::Tab.as_cdp_type(), "tab");
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsProtocol {
Cdp,
WebDriverClassic,
WebDriverBidi,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsTargetKind {
Browser,
Tab,
Page,
Frame,
Worker,
SharedWorker,
ServiceWorker,
Other,
}
impl DevToolsTargetKind {
pub fn from_cdp_type(target_type: Option<&str>) -> Self {
match CdpTargetType::from_wire_value(target_type) {
CdpTargetType::Browser => Self::Browser,
CdpTargetType::Tab => Self::Tab,
CdpTargetType::Page => Self::Page,
CdpTargetType::Frame => Self::Frame,
CdpTargetType::Worker => Self::Worker,
CdpTargetType::SharedWorker => Self::SharedWorker,
CdpTargetType::ServiceWorker => Self::ServiceWorker,
CdpTargetType::Other => Self::Other,
}
}
pub fn as_cdp_type(self) -> &'static str {
self.to_cdp_target_type().as_wire_value()
}
}
impl CdpTargetKindWire for DevToolsTargetKind {
fn to_cdp_target_type(self) -> CdpTargetType {
match self {
Self::Browser => CdpTargetType::Browser,
Self::Tab => CdpTargetType::Tab,
Self::Page => CdpTargetType::Page,
Self::Frame => CdpTargetType::Frame,
Self::Worker => CdpTargetType::Worker,
Self::SharedWorker => CdpTargetType::SharedWorker,
Self::ServiceWorker => CdpTargetType::ServiceWorker,
Self::Other => CdpTargetType::Other,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsNavigationWait {
None,
ResponseHead,
DocumentInstalled,
DomContentLoaded,
Load,
NetworkIdle,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCommandContext {
pub protocol: DevToolsProtocol,
pub session_id: Option<DevToolsSessionId>,
pub target_id: Option<DevToolsTargetId>,
pub browser_context_id: Option<DevToolsBrowserContextId>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DevToolsCommand {
Navigate(DevToolsNavigateCommand),
Reload(DevToolsReloadCommand),
GetNavigationHistory(DevToolsGetNavigationHistoryCommand),
TraverseHistory(DevToolsTraverseHistoryCommand),
GetRealms(DevToolsGetRealmsCommand),
EvaluateScript(DevToolsEvaluateScriptCommand),
CallFunction(DevToolsCallFunctionCommand),
TerminateExecution(DevToolsTerminateExecutionCommand),
ReleaseObjects(DevToolsReleaseObjectsCommand),
CreateTarget(DevToolsCreateTargetCommand),
CloseTarget(DevToolsCloseTargetCommand),
ActivateTarget(DevToolsActivateTargetCommand),
GetTargets(DevToolsGetTargetsCommand),
GetServiceWorkerLogs(DevToolsGetServiceWorkerLogsCommand),
GetClientWindows(DevToolsGetClientWindowsCommand),
SetClientWindowState(DevToolsSetClientWindowStateCommand),
CreateBrowserContext(DevToolsCreateBrowserContextCommand),
GetBrowserContexts(DevToolsGetBrowserContextsCommand),
RemoveBrowserContext(DevToolsRemoveBrowserContextCommand),
SetDownloadBehavior(DevToolsSetDownloadBehaviorCommand),
SetPermission(DevToolsSetPermissionCommand),
GetTargetInfo(DevToolsGetTargetInfoCommand),
GetFrameTree(DevToolsGetFrameTreeCommand),
GetFrameTrees(DevToolsGetFrameTreesCommand),
GetLayoutMetrics(DevToolsGetLayoutMetricsCommand),
GetJavaScriptDialog(DevToolsGetJavaScriptDialogCommand),
SetJavaScriptDialogPromptText(DevToolsSetJavaScriptDialogPromptTextCommand),
HandleJavaScriptDialog(DevToolsHandleJavaScriptDialogCommand),
CaptureScreenshot(DevToolsCaptureScreenshotCommand),
PrintToPdf(DevToolsPrintToPdfCommand),
SetViewport(DevToolsSetViewportCommand),
SetWindowState(DevToolsSetWindowStateCommand),
SetUserAgentOverride(DevToolsSetUserAgentOverrideCommand),
SetLocaleOverride(DevToolsSetLocaleOverrideCommand),
SetTimezoneOverride(DevToolsSetTimezoneOverrideCommand),
SetGeolocationOverride(DevToolsSetGeolocationOverrideCommand),
SetNetworkConditions(DevToolsSetNetworkConditionsCommand),
GetFrameOwner(DevToolsGetFrameOwnerCommand),
LocateNodes(DevToolsLocateNodesCommand),
GetDocument(DevToolsGetDocumentCommand),
RequestChildNodes(DevToolsRequestChildNodesCommand),
QuerySelector(DevToolsQuerySelectorCommand),
PerformSearch(DevToolsPerformSearchCommand),
GetSearchResults(DevToolsGetSearchResultsCommand),
DiscardSearchResults(DevToolsDiscardSearchResultsCommand),
GetNodeForLocation(DevToolsGetNodeForLocationCommand),
ResolveNode(DevToolsResolveNodeCommand),
GetAttributes(DevToolsGetAttributesCommand),
GetText(DevToolsGetTextCommand),
GetProperty(DevToolsGetPropertyCommand),
PushNodesByBackendIds(DevToolsPushNodesByBackendIdsCommand),
DescribeNode(DevToolsDescribeNodeCommand),
DomObjectReference(DevToolsDomObjectReferenceCommand),
SetFileInputFiles(DevToolsSetFileInputFilesCommand),
GetOuterHtml(DevToolsGetOuterHtmlCommand),
ScrollIntoViewIfNeeded(DevToolsScrollIntoViewIfNeededCommand),
DomGeometry(DevToolsDomGeometryCommand),
RemoveNode(DevToolsRemoveNodeCommand),
AddPreloadScript(DevToolsAddPreloadScriptCommand),
RemovePreloadScript(DevToolsRemovePreloadScriptCommand),
ElementClick(DevToolsElementClickCommand),
DispatchMouseEvent(DevToolsDispatchMouseEventCommand),
DispatchKeyEvent(DevToolsDispatchKeyEventCommand),
DispatchTouchEvent(DevToolsDispatchTouchEventCommand),
DispatchDragEvent(DevToolsDispatchDragEventCommand),
SynthesizeTapGesture(DevToolsSynthesizeTapGestureCommand),
GetCookies(DevToolsGetCookiesCommand),
DeleteCookies(DevToolsDeleteCookiesCommand),
SetCookies(DevToolsSetCookiesCommand),
AddNetworkIntercept(DevToolsAddNetworkInterceptCommand),
RemoveNetworkIntercept(DevToolsRemoveNetworkInterceptCommand),
AddNetworkDataCollector(DevToolsAddNetworkDataCollectorCommand),
RemoveNetworkDataCollector(DevToolsRemoveNetworkDataCollectorCommand),
DisownNetworkData(DevToolsDisownNetworkDataCommand),
SetCacheBehavior(DevToolsSetCacheBehaviorCommand),
SetExtraHeaders(DevToolsSetExtraHeadersCommand),
GetNetworkData(DevToolsGetNetworkDataCommand),
ContinueInterceptedRequest(DevToolsContinueInterceptedRequestCommand),
ContinueInterceptedResponse(DevToolsContinueInterceptedResponseCommand),
ContinueWithAuth(DevToolsContinueWithAuthCommand),
FailInterceptedRequest(DevToolsFailInterceptedRequestCommand),
FulfillInterceptedRequest(DevToolsFulfillInterceptedRequestCommand),
}
impl DevToolsCommand {
pub fn context(&self) -> &DevToolsCommandContext {
match self {
DevToolsCommand::Navigate(command) => &command.context,
DevToolsCommand::Reload(command) => &command.context,
DevToolsCommand::GetNavigationHistory(command) => &command.context,
DevToolsCommand::TraverseHistory(command) => &command.context,
DevToolsCommand::GetRealms(command) => &command.context,
DevToolsCommand::EvaluateScript(command) => &command.context,
DevToolsCommand::CallFunction(command) => &command.context,
DevToolsCommand::TerminateExecution(command) => &command.context,
DevToolsCommand::ReleaseObjects(command) => &command.context,
DevToolsCommand::CreateTarget(command) => &command.context,
DevToolsCommand::CloseTarget(command) => &command.context,
DevToolsCommand::ActivateTarget(command) => &command.context,
DevToolsCommand::GetTargets(command) => &command.context,
DevToolsCommand::GetServiceWorkerLogs(command) => &command.context,
DevToolsCommand::GetClientWindows(command) => &command.context,
DevToolsCommand::SetClientWindowState(command) => &command.context,
DevToolsCommand::CreateBrowserContext(command) => &command.context,
DevToolsCommand::GetBrowserContexts(command) => &command.context,
DevToolsCommand::RemoveBrowserContext(command) => &command.context,
DevToolsCommand::SetDownloadBehavior(command) => &command.context,
DevToolsCommand::SetPermission(command) => &command.context,
DevToolsCommand::GetTargetInfo(command) => &command.context,
DevToolsCommand::GetFrameTree(command) => &command.context,
DevToolsCommand::GetFrameTrees(command) => &command.context,
DevToolsCommand::GetLayoutMetrics(command) => &command.context,
DevToolsCommand::GetJavaScriptDialog(command) => &command.context,
DevToolsCommand::SetJavaScriptDialogPromptText(command) => &command.context,
DevToolsCommand::HandleJavaScriptDialog(command) => &command.context,
DevToolsCommand::CaptureScreenshot(command) => &command.context,
DevToolsCommand::PrintToPdf(command) => &command.context,
DevToolsCommand::SetViewport(command) => &command.context,
DevToolsCommand::SetWindowState(command) => &command.context,
DevToolsCommand::SetUserAgentOverride(command) => &command.context,
DevToolsCommand::SetLocaleOverride(command) => &command.context,
DevToolsCommand::SetTimezoneOverride(command) => &command.context,
DevToolsCommand::SetGeolocationOverride(command) => &command.context,
DevToolsCommand::SetNetworkConditions(command) => &command.context,
DevToolsCommand::GetFrameOwner(command) => &command.context,
DevToolsCommand::LocateNodes(command) => &command.context,
DevToolsCommand::GetDocument(command) => &command.context,
DevToolsCommand::RequestChildNodes(command) => &command.context,
DevToolsCommand::QuerySelector(command) => &command.context,
DevToolsCommand::PerformSearch(command) => &command.context,
DevToolsCommand::GetSearchResults(command) => &command.context,
DevToolsCommand::DiscardSearchResults(command) => &command.context,
DevToolsCommand::GetNodeForLocation(command) => &command.context,
DevToolsCommand::ResolveNode(command) => &command.context,
DevToolsCommand::GetAttributes(command) => &command.context,
DevToolsCommand::GetText(command) => &command.context,
DevToolsCommand::GetProperty(command) => &command.context,
DevToolsCommand::PushNodesByBackendIds(command) => &command.context,
DevToolsCommand::DescribeNode(command) => &command.context,
DevToolsCommand::DomObjectReference(command) => &command.context,
DevToolsCommand::SetFileInputFiles(command) => &command.context,
DevToolsCommand::GetOuterHtml(command) => &command.context,
DevToolsCommand::ScrollIntoViewIfNeeded(command) => &command.context,
DevToolsCommand::DomGeometry(command) => &command.context,
DevToolsCommand::RemoveNode(command) => &command.context,
DevToolsCommand::AddPreloadScript(command) => &command.context,
DevToolsCommand::RemovePreloadScript(command) => &command.context,
DevToolsCommand::ElementClick(command) => &command.context,
DevToolsCommand::DispatchMouseEvent(command) => &command.context,
DevToolsCommand::DispatchKeyEvent(command) => &command.context,
DevToolsCommand::DispatchTouchEvent(command) => &command.context,
DevToolsCommand::DispatchDragEvent(command) => &command.context,
DevToolsCommand::SynthesizeTapGesture(command) => &command.context,
DevToolsCommand::GetCookies(command) => &command.context,
DevToolsCommand::DeleteCookies(command) => &command.context,
DevToolsCommand::SetCookies(command) => &command.context,
DevToolsCommand::AddNetworkIntercept(command) => &command.context,
DevToolsCommand::RemoveNetworkIntercept(command) => &command.context,
DevToolsCommand::AddNetworkDataCollector(command) => &command.context,
DevToolsCommand::RemoveNetworkDataCollector(command) => &command.context,
DevToolsCommand::DisownNetworkData(command) => &command.context,
DevToolsCommand::SetCacheBehavior(command) => &command.context,
DevToolsCommand::SetExtraHeaders(command) => &command.context,
DevToolsCommand::GetNetworkData(command) => &command.context,
DevToolsCommand::ContinueInterceptedRequest(command) => &command.context,
DevToolsCommand::ContinueInterceptedResponse(command) => &command.context,
DevToolsCommand::ContinueWithAuth(command) => &command.context,
DevToolsCommand::FailInterceptedRequest(command) => &command.context,
DevToolsCommand::FulfillInterceptedRequest(command) => &command.context,
}
}
pub fn set_webdriver_bidi_file_prompt_handler_for_script_command(
&mut self,
handler: Option<&str>,
) {
let handler = handler.map(str::to_owned);
match self {
DevToolsCommand::EvaluateScript(command) => {
command.webdriver_bidi_file_prompt_handler = handler;
}
DevToolsCommand::CallFunction(command) => {
command.webdriver_bidi_file_prompt_handler = handler;
}
_ => {}
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsNavigateCommand {
pub context: DevToolsCommandContext,
pub url: String,
pub referrer: Option<String>,
pub wait: DevToolsNavigationWait,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsReloadCommand {
pub context: DevToolsCommandContext,
pub ignore_cache: bool,
pub script_to_evaluate_on_load: Option<String>,
pub wait: DevToolsNavigationWait,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetNavigationHistoryCommand {
pub context: DevToolsCommandContext,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsTraverseHistoryCommand {
pub context: DevToolsCommandContext,
pub destination: DevToolsHistoryTraversalDestination,
pub wait: DevToolsNavigationWait,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DevToolsHistoryTraversalDestination {
Entry { entry_id: i32, url: String },
Delta(i64),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetRealmsCommand {
pub context: DevToolsCommandContext,
pub realm_type: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsEvaluateScriptCommand {
pub context: DevToolsCommandContext,
pub realm_id: Option<DevToolsRealmId>,
pub world_name: Option<String>,
pub expression: String,
pub await_promise: bool,
pub user_gesture: bool,
pub webdriver_bidi_file_prompt_handler: Option<String>,
pub result_ownership: DevToolsResultOwnership,
pub preserve_remote_metadata: bool,
pub serialization_options: Option<DevToolsSerializationOptions>,
pub materialize_bidi_script_result: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsCallFunctionCommand {
pub context: DevToolsCommandContext,
pub realm_id: Option<DevToolsRealmId>,
pub world_name: Option<String>,
pub object_id: Option<DevToolsRemoteHandleId>,
pub this_parameter: Option<Value>,
pub function_declaration: String,
pub arguments: Vec<Value>,
pub await_promise: bool,
pub user_gesture: bool,
pub webdriver_bidi_file_prompt_handler: Option<String>,
pub result_ownership: DevToolsResultOwnership,
pub object_group: Option<String>,
pub preserve_remote_metadata: bool,
pub serialization_options: Option<DevToolsSerializationOptions>,
pub materialize_bidi_script_result: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsTerminateExecutionCommand {
pub context: DevToolsCommandContext,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSerializationOptions {
pub max_object_depth: Option<u64>,
pub max_dom_depth: Option<u64>,
pub include_shadow_tree: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsReleaseObjectsCommand {
pub context: DevToolsCommandContext,
pub realm_id: Option<DevToolsRealmId>,
pub world_name: Option<String>,
pub handles: Vec<DevToolsRemoteHandleId>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCreateTargetCommand {
pub context: DevToolsCommandContext,
pub url: String,
pub browser_context_id: Option<DevToolsBrowserContextId>,
pub activate: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCloseTargetCommand {
pub context: DevToolsCommandContext,
pub target_id: DevToolsTargetId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsActivateTargetCommand {
pub context: DevToolsCommandContext,
pub target_id: DevToolsTargetId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetTargetsCommand {
pub context: DevToolsCommandContext,
pub root: Option<DevToolsTargetId>,
pub max_depth: Option<u32>,
pub filter: Option<Vec<DevToolsTargetFilterEntry>>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsTargetFilterEntry {
pub exclude: bool,
pub target_type: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetServiceWorkerLogsCommand {
pub context: DevToolsCommandContext,
pub target_id: Option<DevToolsTargetId>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetClientWindowsCommand {
pub context: DevToolsCommandContext,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCreateBrowserContextCommand {
pub context: DevToolsCommandContext,
pub browser_context_id: Option<DevToolsBrowserContextId>,
pub accept_insecure_certs: Option<bool>,
pub proxy_server: Option<String>,
pub proxy_bypass_list: Option<String>,
pub proxy_autoconfig_url: Option<String>,
pub proxy_socks_version: Option<u8>,
pub persistent_partition_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetBrowserContextsCommand {
pub context: DevToolsCommandContext,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsRemoveBrowserContextCommand {
pub context: DevToolsCommandContext,
pub browser_context_id: DevToolsBrowserContextId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetDownloadBehaviorCommand {
pub context: DevToolsCommandContext,
pub behavior: Option<DevToolsDownloadBehaviorSetting>,
pub user_contexts: Option<Vec<DevToolsBrowserContextId>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsSetPermissionCommand {
pub context: DevToolsCommandContext,
pub permission: Value,
pub setting: String,
pub origin: String,
pub embedded_origin: Option<String>,
pub browser_context_id: Option<DevToolsBrowserContextId>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDownloadBehaviorSetting {
pub behavior: String,
pub download_path: Option<String>,
pub events_enabled: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetTargetInfoCommand {
pub context: DevToolsCommandContext,
pub target_id: Option<DevToolsTargetId>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetFrameTreeCommand {
pub context: DevToolsCommandContext,
pub max_depth: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetFrameTreesCommand {
pub context: DevToolsCommandContext,
pub max_depth: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetLayoutMetricsCommand {
pub context: DevToolsCommandContext,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetJavaScriptDialogCommand {
pub context: DevToolsCommandContext,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetJavaScriptDialogPromptTextCommand {
pub context: DevToolsCommandContext,
pub prompt_text: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsHandleJavaScriptDialogCommand {
pub context: DevToolsCommandContext,
pub accept: bool,
pub prompt_text: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsCaptureScreenshotCommand {
pub context: DevToolsCommandContext,
pub format: Option<String>,
pub quality: Option<u8>,
pub clip: Option<DevToolsCaptureScreenshotClip>,
pub capture_beyond_viewport: bool,
pub optimize_for_speed: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DevToolsCaptureScreenshotClip {
Box(DevToolsScreenshotClip),
Element(DevToolsScreenshotElementClip),
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsScreenshotClip {
pub x: f64,
pub y: f64,
pub width: f64,
pub height: f64,
pub scale: f64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsScreenshotElementClip {
pub shared_id: DevToolsRemoteHandleId,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsPrintToPdfCommand {
pub context: DevToolsCommandContext,
pub landscape: Option<bool>,
pub print_background: Option<bool>,
pub scale: Option<f64>,
pub paper_width: Option<f64>,
pub paper_height: Option<f64>,
pub margin_top: Option<f64>,
pub margin_bottom: Option<f64>,
pub margin_left: Option<f64>,
pub margin_right: Option<f64>,
pub page_ranges: Option<String>,
pub shrink_to_fit: Option<bool>,
pub transfer_mode: Option<DevToolsPrintToPdfTransferMode>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevToolsPrintToPdfTransferMode {
ReturnAsBase64,
ReturnAsStream,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsSetViewportCommand {
pub context: DevToolsCommandContext,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
pub viewport: DevToolsViewportSetting,
pub device_pixel_ratio: DevToolsDevicePixelRatioSetting,
pub screen_width: Option<u32>,
pub screen_height: Option<u32>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevToolsWindowState {
Normal,
Maximized,
Minimized,
Fullscreen,
}
impl DevToolsWindowState {
pub fn as_bidi_value(self) -> &'static str {
match self {
Self::Normal => "normal",
Self::Maximized => "maximized",
Self::Minimized => "minimized",
Self::Fullscreen => "fullscreen",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetWindowStateCommand {
pub context: DevToolsCommandContext,
pub state: DevToolsWindowState,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetClientWindowStateCommand {
pub context: DevToolsCommandContext,
pub client_window: DevToolsTargetId,
pub state: DevToolsWindowState,
pub width: Option<u32>,
pub height: Option<u32>,
pub x: Option<i32>,
pub y: Option<i32>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetUserAgentOverrideCommand {
pub context: DevToolsCommandContext,
pub target_ids: Vec<DevToolsTargetId>,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
pub user_agent: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetLocaleOverrideCommand {
pub context: DevToolsCommandContext,
pub target_ids: Vec<DevToolsTargetId>,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
pub locale: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetTimezoneOverrideCommand {
pub context: DevToolsCommandContext,
pub target_ids: Vec<DevToolsTargetId>,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
pub timezone: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct DevToolsGeolocationOverride {
pub latitude: f64,
pub longitude: f64,
pub accuracy: f64,
pub altitude: Option<f64>,
pub altitude_accuracy: Option<f64>,
pub heading: Option<f64>,
pub speed: Option<f64>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DevToolsGeolocationOverrideState {
Position(DevToolsGeolocationOverride),
PositionUnavailable,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsSetGeolocationOverrideCommand {
pub context: DevToolsCommandContext,
pub target_ids: Vec<DevToolsTargetId>,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
pub override_state: Option<DevToolsGeolocationOverrideState>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DevToolsNetworkConditions {
pub offline: bool,
}
impl DevToolsNetworkConditions {
pub fn offline() -> Self {
Self { offline: true }
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetNetworkConditionsCommand {
pub context: DevToolsCommandContext,
pub target_ids: Vec<DevToolsTargetId>,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
pub network_conditions: Option<DevToolsNetworkConditions>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevToolsViewportSetting {
Unchanged,
Default,
Dimensions { width: u32, height: u32 },
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DevToolsDevicePixelRatioSetting {
Unchanged,
Default,
Scale(f64),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetCookiesCommand {
pub context: DevToolsCommandContext,
pub browser_context_id: Option<DevToolsBrowserContextId>,
pub urls: Option<Vec<String>>,
pub filter: Option<DevToolsCookieFilter>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDeleteCookiesCommand {
pub context: DevToolsCommandContext,
pub browser_context_id: Option<DevToolsBrowserContextId>,
pub name: Option<String>,
pub url: Option<String>,
pub domain: Option<String>,
pub path: Option<String>,
pub partition_key: Option<StoredCookiePartitionKey>,
pub filter: Option<DevToolsCookieFilter>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsSetCookiesCommand {
pub context: DevToolsCommandContext,
pub browser_context_id: Option<DevToolsBrowserContextId>,
pub cookies: Vec<DevToolsCookieParam>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsCookieParam {
pub name: String,
pub value: String,
pub url: Option<String>,
pub domain: Option<String>,
pub path: Option<String>,
pub secure: Option<bool>,
pub http_only: bool,
pub same_site: Option<String>,
pub priority: Option<String>,
pub source_scheme: Option<String>,
pub source_port: Option<i32>,
pub partition_key: Option<Value>,
pub partition_key_opaque: Option<bool>,
pub expires: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCookieFilter {
pub name: Option<String>,
pub value: Option<String>,
pub domain: Option<String>,
pub path: Option<String>,
pub secure: Option<bool>,
pub http_only: Option<bool>,
pub same_site: Option<String>,
pub size: Option<u64>,
pub expires: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetFrameOwnerCommand {
pub context: DevToolsCommandContext,
pub frame_id: DevToolsFrameId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsLocateNodesCommand {
pub context: DevToolsCommandContext,
pub locator: DevToolsLocateNodesLocator,
pub max_node_count: Option<u64>,
pub start_nodes: Vec<Value>,
pub start_node_references: Vec<DevToolsDomNodeReference>,
pub serialization_options: Option<DevToolsSerializationOptions>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DevToolsLocateNodesLocator {
Css(String),
XPath(String),
TagName(String),
LinkText {
value: String,
match_type: DevToolsLocateNodesTextMatch,
},
Context(DevToolsFrameId),
InnerText {
value: String,
ignore_case: bool,
match_type: DevToolsLocateNodesTextMatch,
max_depth: u64,
},
Accessibility {
role: Option<String>,
name: Option<String>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevToolsLocateNodesTextMatch {
Full,
Partial,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetDocumentCommand {
pub context: DevToolsCommandContext,
pub depth: Option<i32>,
pub pierce: bool,
pub flattened: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum DevToolsDomNodeReference {
FrontendNodeId(u32),
BackendNodeId(u32),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsRequestChildNodesCommand {
pub context: DevToolsCommandContext,
pub reference: DevToolsDomNodeReference,
pub depth: i32,
pub pierce: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsQuerySelectorCommand {
pub context: DevToolsCommandContext,
pub root: Option<DevToolsDomNodeReference>,
pub selector: String,
pub multiple: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsPerformSearchCommand {
pub context: DevToolsCommandContext,
pub query: String,
pub include_user_agent_shadow_dom: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetSearchResultsCommand {
pub context: DevToolsCommandContext,
pub search_id: String,
pub from_index: usize,
pub to_index: usize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDiscardSearchResultsCommand {
pub context: DevToolsCommandContext,
pub search_id: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsGetNodeForLocationCommand {
pub context: DevToolsCommandContext,
pub x: f64,
pub y: f64,
pub include_user_agent_shadow_dom: bool,
pub ignore_pointer_events_none: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetNodeForLocationResult {
pub backend_node_id: u32,
pub frame_id: DevToolsFrameId,
pub node_id: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsResolveNodeCommand {
pub context: DevToolsCommandContext,
pub reference: DevToolsDomNodeReference,
pub execution_context_id: Option<i64>,
pub object_group: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetAttributesCommand {
pub context: DevToolsCommandContext,
pub reference: DevToolsDomNodeReference,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetTextCommand {
pub context: DevToolsCommandContext,
pub reference: DevToolsDomNodeReference,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetPropertyCommand {
pub context: DevToolsCommandContext,
pub reference: DevToolsDomNodeReference,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsPushNodesByBackendIdsCommand {
pub context: DevToolsCommandContext,
pub backend_node_ids: Vec<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsPushNodesByBackendIdsResult {
pub node_ids: Vec<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDescribeNodeCommand {
pub context: DevToolsCommandContext,
pub reference: Option<DevToolsDomNodeReference>,
pub depth: i32,
pub pierce: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DevToolsDomObjectReferenceOperation {
RequestNode,
GetOuterHtml { include_shadow_dom: bool },
GetBoxModel,
GetContentQuads,
ScrollIntoViewIfNeeded { rect: Option<DomScrollIntoViewRect> },
DescribeNode { depth: i32, pierce: bool },
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsElementClickCommand {
pub context: DevToolsCommandContext,
pub operation: DevToolsElementClickOperation,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DevToolsElementClickOperation {
Prepare { object_id: DevToolsRemoteHandleId },
Dispatch(moli_core::page::RendererPreparedPointerClick),
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsDomObjectReferenceCommand {
pub context: DevToolsCommandContext,
pub object_id: DevToolsRemoteHandleId,
pub operation: DevToolsDomObjectReferenceOperation,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsSetFileInputFilesCommand {
pub context: DevToolsCommandContext,
pub object_id: DevToolsRemoteHandleId,
pub files: Vec<SelectedFile>,
pub append: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetOuterHtmlCommand {
pub context: DevToolsCommandContext,
pub reference: Option<DevToolsDomNodeReference>,
pub include_shadow_dom: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsScrollIntoViewIfNeededCommand {
pub context: DevToolsCommandContext,
pub reference: Option<DevToolsDomNodeReference>,
pub rect: Option<DomScrollIntoViewRect>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevToolsDomGeometryOperation {
GetBoxModel,
GetContentQuads,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDomGeometryCommand {
pub context: DevToolsCommandContext,
pub reference: DevToolsDomNodeReference,
pub operation: DevToolsDomGeometryOperation,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsRemoveNodeCommand {
pub context: DevToolsCommandContext,
pub reference: DevToolsDomNodeReference,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsAddPreloadScriptCommand {
pub context: DevToolsCommandContext,
pub source: DevToolsPreloadScriptSource,
pub world_name: Option<String>,
pub target_ids: Option<Vec<DevToolsTargetId>>,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
pub run_immediately: bool,
pub include_command_line_api: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DevToolsPreloadScriptSource {
RawScript(String),
FunctionDeclaration {
function_declaration: String,
arguments: Vec<Value>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsRemovePreloadScriptCommand {
pub context: DevToolsCommandContext,
pub script_id: DevToolsPreloadScriptId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsMouseEventType {
Pressed,
Released,
Moved,
Wheel,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsPointerType {
Mouse,
Pen,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsDispatchMouseEventCommand {
pub context: DevToolsCommandContext,
pub event_type: DevToolsMouseEventType,
pub pointer_type: DevToolsPointerType,
pub x: f64,
pub y: f64,
pub button: i32,
pub buttons: Option<i32>,
pub click_count: i32,
pub delta_x: f64,
pub delta_y: f64,
pub force: f64,
pub tangential_pressure: f64,
pub tilt_x: f64,
pub tilt_y: f64,
pub twist: f64,
pub modifiers: u8,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsKeyEventType {
KeyDown,
KeyUp,
KeyPress,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDispatchKeyEventCommand {
pub context: DevToolsCommandContext,
pub event_type: DevToolsKeyEventType,
pub key: String,
pub code: String,
pub text: String,
pub modifiers: u8,
pub auto_repeat: bool,
pub should_insert_text: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsTouchEventType {
Start,
Move,
End,
Cancel,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct DevToolsTouchPoint {
pub id: i32,
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsDispatchTouchEventCommand {
pub context: DevToolsCommandContext,
pub event_type: DevToolsTouchEventType,
pub touch_points: Vec<DevToolsTouchPoint>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsDragEventType {
Enter,
Over,
Drop,
Cancel,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDragDataItem {
pub mime_type: String,
pub data: String,
pub title: Option<String>,
pub base_url: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDragData {
pub items: Vec<DevToolsDragDataItem>,
pub files: Vec<String>,
pub drag_operations_mask: i32,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsDispatchDragEventCommand {
pub context: DevToolsCommandContext,
pub event_type: DevToolsDragEventType,
pub x: f64,
pub y: f64,
pub data: DevToolsDragData,
pub modifiers: u8,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsSynthesizeTapGestureCommand {
pub context: DevToolsCommandContext,
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsResultOwnership {
ByValue,
Root,
None,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevToolsNetworkInterceptPhase {
BeforeRequestSent,
ResponseStarted,
AuthRequired,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsNetworkInterceptPattern {
pub url_pattern: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsAddNetworkInterceptCommand {
pub context: DevToolsCommandContext,
pub intercept_id: DevToolsNetworkInterceptId,
pub phases: Vec<DevToolsNetworkInterceptPhase>,
pub url_patterns: Vec<DevToolsNetworkInterceptPattern>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsRemoveNetworkInterceptCommand {
pub context: DevToolsCommandContext,
pub intercept_id: DevToolsNetworkInterceptId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetCacheBehaviorCommand {
pub context: DevToolsCommandContext,
pub target_ids: Vec<DevToolsTargetId>,
pub cache_disabled: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetExtraHeadersCommand {
pub context: DevToolsCommandContext,
pub target_ids: Vec<DevToolsTargetId>,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
pub headers: moli_fetch::RequestHeaders,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsNetworkDataType {
Request,
Response,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsAddNetworkDataCollectorCommand {
pub context: DevToolsCommandContext,
pub collector_id: DevToolsNetworkDataCollectorId,
pub data_types: Vec<DevToolsNetworkDataType>,
pub max_encoded_data_size: u64,
pub target_ids: Vec<DevToolsTargetId>,
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsRemoveNetworkDataCollectorCommand {
pub context: DevToolsCommandContext,
pub collector_id: DevToolsNetworkDataCollectorId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDisownNetworkDataCommand {
pub context: DevToolsCommandContext,
pub request_id: DevToolsRequestId,
pub data_type: DevToolsNetworkDataType,
pub collector_id: DevToolsNetworkDataCollectorId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetNetworkDataCommand {
pub context: DevToolsCommandContext,
pub request_id: DevToolsRequestId,
pub data_type: DevToolsNetworkDataType,
pub collector: Option<DevToolsNetworkDataCollectorId>,
pub disown: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsContinueInterceptedRequestCommand {
pub context: DevToolsCommandContext,
pub request_id: DevToolsRequestId,
pub url: Option<String>,
pub method: Option<String>,
pub post_data: Option<String>,
pub headers: Option<moli_fetch::RequestHeaders>,
pub intercept_response: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsContinueInterceptedResponseCommand {
pub context: DevToolsCommandContext,
pub request_id: DevToolsRequestId,
pub response_code: Option<u16>,
pub response_headers: Option<Vec<(String, Vec<u8>)>>,
pub response_phrase: Option<String>,
pub auth_credentials: Option<DevToolsAuthCredentials>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsAuthCredentials {
pub username: String,
pub password: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevToolsAuthChallengeAction {
Default,
Cancel,
ProvideCredentials,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsContinueWithAuthCommand {
pub context: DevToolsCommandContext,
pub request_id: DevToolsRequestId,
pub action: DevToolsAuthChallengeAction,
pub username: Option<String>,
pub password: Option<String>,
}
/// A protocol-requested failure. Cancellation is a cause, not a display string.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DevToolsRequestFailure {
Aborted,
Failed(String),
}
impl std::fmt::Display for DevToolsRequestFailure {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Aborted => formatter.write_str("Aborted"),
Self::Failed(message) => formatter.write_str(message),
}
}
}
impl std::error::Error for DevToolsRequestFailure {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsFailInterceptedRequestCommand {
pub context: DevToolsCommandContext,
pub request_id: DevToolsRequestId,
pub failure: DevToolsRequestFailure,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsFulfillInterceptedRequestCommand {
pub context: DevToolsCommandContext,
pub request_id: DevToolsRequestId,
pub response_code: u16,
pub response_headers: Vec<(String, Vec<u8>)>,
pub body: Option<Vec<u8>>,
pub response_phrase: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DevToolsCommandResult {
ElementClickPreparation(
Result<
moli_core::page::RendererElementClickTarget,
moli_core::page::RendererElementClickError,
>,
),
ElementClickDispatch(Result<(), moli_core::page::RendererElementClickError>),
Empty,
Navigate(DevToolsNavigateResult),
TraverseHistory(DevToolsTraverseHistoryResult),
GetNavigationHistory(DevToolsGetNavigationHistoryResult),
GetFrameTree(DevToolsGetFrameTreeResult),
GetFrameTrees(DevToolsGetFrameTreesResult),
CreateTarget(DevToolsCreateTargetResult),
CloseTarget(DevToolsCloseTargetResult),
GetTargets(DevToolsGetTargetsResult),
ServiceWorkerLogs(DevToolsGetServiceWorkerLogsResult),
ClientWindows(DevToolsGetClientWindowsResult),
ClientWindow(DevToolsSetClientWindowStateResult),
CreateBrowserContext(DevToolsCreateBrowserContextResult),
GetBrowserContexts(DevToolsGetBrowserContextsResult),
GetTargetInfo(DevToolsGetTargetInfoResult),
GetCookies(DevToolsGetCookiesResult),
DeleteCookies(DevToolsDeleteCookiesResult),
SetCookies(DevToolsSetCookiesResult),
AddPreloadScript(DevToolsAddPreloadScriptResult),
AddNetworkIntercept(DevToolsAddNetworkInterceptResult),
AddNetworkDataCollector(DevToolsAddNetworkDataCollectorResult),
NetworkData(DevToolsNetworkDataResult),
Realms(DevToolsGetRealmsResult),
Script(Box<DevToolsScriptResult>),
LocateNodes(DevToolsLocateNodesResult),
DescribeNode(DevToolsDescribeNodeResult),
GetFrameOwner(DevToolsGetFrameOwnerResult),
QuerySelector(DevToolsQuerySelectorResult),
ResolveNode(DevToolsResolveNodeResult),
GetAttributes(DevToolsGetAttributesResult),
GetText(DevToolsGetTextResult),
GetProperty(DevToolsGetPropertyResult),
PushNodesByBackendIds(DevToolsPushNodesByBackendIdsResult),
GetOuterHtml(DevToolsGetOuterHtmlResult),
GetNodeForLocation(DevToolsGetNodeForLocationResult),
DomGeometry(DevToolsDomGeometryResult),
LayoutMetrics(DevToolsLayoutMetricsResult),
JavaScriptDialog(DevToolsJavaScriptDialogResult),
CaptureScreenshot(DevToolsCaptureScreenshotResult),
}
/// Protocol-neutral result of rasterizing one page viewport.
///
/// The renderer and core layers retain owned encoded bytes. Protocol-specific
/// transports decide how those bytes are projected (CDP uses standard base64).
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCaptureScreenshotResult {
pub mime_type: String,
pub width: u32,
pub height: u32,
pub bytes: Arc<[u8]>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsNavigateResult {
pub navigation_id: Option<DevToolsNavigationId>,
pub frame_id: Option<DevToolsFrameId>,
pub loader_id: Option<DevToolsLoaderId>,
pub url: String,
pub error_text: Option<String>,
pub is_download: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsTraverseHistoryResult {
pub same_document: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsNavigationHistoryEntry {
pub id: i32,
pub url: String,
pub user_typed_url: String,
pub title: String,
pub transition_type: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetNavigationHistoryResult {
pub current_index: usize,
pub entries: Vec<DevToolsNavigationHistoryEntry>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsJavaScriptDialogResult {
pub dialog_type: String,
pub message: String,
pub default_prompt: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCreateTargetResult {
pub target_id: DevToolsTargetId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCloseTargetResult {
pub success: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetTargetsResult {
pub targets: Vec<DevToolsTargetInfo>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsGetServiceWorkerLogsResult {
pub entries: Vec<RuntimeConsoleEvent>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsClientWindowInfo {
pub client_window: DevToolsTargetId,
pub active: bool,
pub state: DevToolsWindowState,
pub width: u32,
pub height: u32,
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetClientWindowsResult {
pub client_windows: Vec<DevToolsClientWindowInfo>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsSetClientWindowStateResult {
pub client_window: DevToolsClientWindowInfo,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsCreateBrowserContextResult {
pub browser_context_id: DevToolsBrowserContextId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetBrowserContextsResult {
pub browser_context_ids: Vec<DevToolsBrowserContextId>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetTargetInfoResult {
pub target_info: DevToolsTargetInfo,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsGetFrameTreeResult {
pub frame_tree: Value,
pub target_info: Option<DevToolsTargetInfo>,
pub max_depth: Option<u32>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsGetFrameTreesResult {
pub frame_trees: Vec<DevToolsGetFrameTreeResult>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsTargetInfo {
pub target_id: Option<DevToolsTargetId>,
pub kind: DevToolsTargetKind,
pub title: String,
pub url: String,
pub attached: bool,
pub opener_id: Option<DevToolsTargetId>,
pub opener_frame_id: Option<DevToolsFrameId>,
/// Whether the target's Window can script its opener.
///
/// This is deliberately independent from `opener_id`. Chromium retains
/// the DevTools creator relationship for an implicit-noopener
/// `target=_blank` target while reporting `canAccessOpener: false`.
pub can_access_opener: bool,
pub browser_context_id: Option<DevToolsBrowserContextId>,
pub moli_popup_id: Option<u64>,
}
impl DevToolsTargetInfo {
pub(crate) fn into_cdp_value(self) -> Value {
let mut payload = json!({
"type": self.kind.as_cdp_type(),
"title": self.title,
"url": self.url,
"attached": self.attached,
"canAccessOpener": self.can_access_opener,
});
if let Some(target_id) = self.target_id {
payload["targetId"] = json!(target_id.into_string());
}
if let Some(opener_id) = self.opener_id {
payload["openerId"] = json!(opener_id.into_string());
}
if let Some(opener_frame_id) = self.opener_frame_id {
payload["openerFrameId"] = json!(opener_frame_id.into_string());
}
if let Some(browser_context_id) = self.browser_context_id {
payload["browserContextId"] = json!(browser_context_id.into_string());
}
payload
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsGetCookiesResult {
pub cookies: Vec<Value>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDeleteCookiesResult {
pub partition_key: Value,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsSetCookiesResult {
pub success: bool,
pub cookie_reports: Vec<Value>,
pub partition_key: Value,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsQuerySelectorResult {
pub node_ids: Vec<u32>,
pub multiple: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsResolveNodeResult {
pub object: Value,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsLocateNodesResult {
pub nodes: Vec<DevToolsRemoteValue>,
pub node_ids: Vec<u32>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsDescribeNodeResult {
pub node: Value,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetFrameOwnerResult {
pub node_id: u32,
pub backend_node_id: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsDomAttribute {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetAttributesResult {
pub attributes: Vec<DevToolsDomAttribute>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetTextResult {
pub text: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsGetPropertyResult {
pub value: Value,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsGetOuterHtmlResult {
pub outer_html: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsDomQuad {
pub points: Vec<f64>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsDomBoxModel {
pub content: DevToolsDomQuad,
pub padding: DevToolsDomQuad,
pub border: DevToolsDomQuad,
pub margin: DevToolsDomQuad,
pub width: i32,
pub height: i32,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsDomGeometryResult {
pub box_model: Option<DevToolsDomBoxModel>,
pub quads: Vec<DevToolsDomQuad>,
pub width: Option<i32>,
pub height: Option<i32>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsLayoutMetricsResult {
pub layout_viewport_width: u32,
pub layout_viewport_height: u32,
pub page_x: f64,
pub page_y: f64,
pub content_width: f64,
pub content_height: f64,
pub device_pixel_ratio: f64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsAddPreloadScriptResult {
pub script_id: DevToolsPreloadScriptId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsAddNetworkInterceptResult {
pub intercept_id: DevToolsNetworkInterceptId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsAddNetworkDataCollectorResult {
pub collector_id: DevToolsNetworkDataCollectorId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DevToolsNetworkDataBytesType {
String,
Base64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsNetworkDataResult {
pub bytes_type: DevToolsNetworkDataBytesType,
pub value: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsGetRealmsResult {
pub realms: Vec<RuntimeExecutionContextEvent>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DevToolsScriptResult {
Value(DevToolsRemoteValue),
Exception(DevToolsScriptException),
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsRemoteValue {
pub value: Value,
pub handle: Option<DevToolsRemoteHandleId>,
pub shared_id: Option<DevToolsRemoteHandleId>,
pub node_id: Option<u32>,
pub backend_node_id: Option<u32>,
pub window_context: Option<Box<DevToolsTargetId>>,
pub realm: Option<DevToolsRealmId>,
pub remote_type: Option<String>,
pub remote_subtype: Option<String>,
pub unserializable_value: Option<String>,
pub description: Option<String>,
pub class_name: Option<String>,
pub deep_serialized_value: Option<Value>,
pub node_value: Option<Value>,
}
impl DevToolsRemoteValue {
pub fn from_json_value(value: Value) -> Self {
Self {
value,
handle: None,
shared_id: None,
node_id: None,
backend_node_id: None,
window_context: None,
realm: None,
remote_type: None,
remote_subtype: None,
unserializable_value: None,
description: None,
class_name: None,
deep_serialized_value: None,
node_value: None,
}
}
pub(crate) fn from_cdp_remote_object(
remote: &Value,
retain_handle: bool,
realm: Option<DevToolsRealmId>,
) -> Self {
let object_id = remote.get("objectId").and_then(Value::as_str);
Self {
value: cdp_remote_object_value(remote),
handle: retain_handle
.then(|| object_id.map(DevToolsRemoteHandleId::from))
.flatten(),
shared_id: object_id.map(DevToolsRemoteHandleId::from),
node_id: None,
backend_node_id: None,
window_context: None,
realm,
remote_type: remote
.get("type")
.and_then(Value::as_str)
.map(str::to_owned),
remote_subtype: remote
.get("subtype")
.and_then(Value::as_str)
.map(str::to_owned),
unserializable_value: remote
.get("unserializableValue")
.and_then(Value::as_str)
.map(str::to_owned),
description: remote
.get("description")
.and_then(Value::as_str)
.map(str::to_owned),
class_name: remote
.get("className")
.and_then(Value::as_str)
.map(str::to_owned),
deep_serialized_value: remote.get("deepSerializedValue").cloned(),
node_value: None,
}
}
}
fn cdp_remote_object_value(remote: &Value) -> Value {
if let Some(value) = remote.get("value") {
return value.clone();
}
if remote
.get("subtype")
.and_then(Value::as_str)
.is_some_and(|subtype| subtype == "null")
{
return Value::Null;
}
if let Some(unserializable) = remote.get("unserializableValue").and_then(Value::as_str) {
return Value::String(unserializable.to_owned());
}
match remote.get("type").and_then(Value::as_str) {
Some("undefined") => Value::Null,
Some("boolean") => Value::Bool(false),
Some("number") => json!(0),
Some("string") => Value::String(String::new()),
Some("object") | Some("function") => json!({}),
_ => Value::Null,
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsBidiChannelProperties {
pub channel: String,
pub ownership: DevToolsResultOwnership,
pub serialization_options: Option<DevToolsSerializationOptions>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsStackTrace {
pub call_frames: Vec<DevToolsStackCallFrame>,
}
impl DevToolsStackTrace {
pub fn from_cdp_value(value: &Value) -> Option<Self> {
let call_frames = value
.get("callFrames")
.and_then(Value::as_array)?
.iter()
.map(|frame| DevToolsStackCallFrame {
function_name: frame
.get("functionName")
.and_then(Value::as_str)
.unwrap_or_default()
.to_owned(),
script_id: frame
.get("scriptId")
.and_then(Value::as_str)
.map(str::to_owned),
url: frame
.get("url")
.and_then(Value::as_str)
.unwrap_or_default()
.to_owned(),
line_number: frame
.get("lineNumber")
.and_then(Value::as_u64)
.unwrap_or_default(),
column_number: frame
.get("columnNumber")
.and_then(Value::as_u64)
.unwrap_or_default(),
})
.collect();
Some(Self { call_frames })
}
pub fn to_cdp_value(&self) -> Value {
json!({
"callFrames": self
.call_frames
.iter()
.map(DevToolsStackCallFrame::to_cdp_value)
.collect::<Vec<_>>()
})
}
pub fn into_cdp_value(self) -> Value {
json!({
"callFrames": self
.call_frames
.into_iter()
.map(DevToolsStackCallFrame::into_cdp_value)
.collect::<Vec<_>>()
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsStackCallFrame {
pub function_name: String,
pub script_id: Option<String>,
pub url: String,
pub line_number: u64,
pub column_number: u64,
}
impl DevToolsStackCallFrame {
pub fn to_cdp_value(&self) -> Value {
json!({
"functionName": self.function_name,
"scriptId": self.script_id.as_deref().unwrap_or_default(),
"url": self.url,
"lineNumber": self.line_number,
"columnNumber": self.column_number,
})
}
pub fn into_cdp_value(self) -> Value {
json!({
"functionName": self.function_name,
"scriptId": self.script_id.unwrap_or_default(),
"url": self.url,
"lineNumber": self.line_number,
"columnNumber": self.column_number,
})
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct DevToolsScriptException {
pub exception_id: Option<u64>,
pub script_id: Option<String>,
pub text: String,
pub value: Option<DevToolsRemoteValue>,
pub realm: Option<DevToolsRealmId>,
pub line_number: Option<u64>,
pub column_number: Option<u64>,
pub stack_trace: Option<DevToolsStackTrace>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DevToolsErrorKind {
InvalidArgument,
InvalidSelector,
NoSuchAlert,
NoSuchHandle,
NoSuchHistoryEntry,
NoSuchNode,
NoSuchNetworkCollector,
NoSuchNetworkData,
NoSuchRequest,
NoSuchScript,
NoSuchTarget,
NoSuchSession,
NavigationChangingDocument,
Timeout,
UnableToCaptureScreen,
UnableToSetFileInput,
Unsupported,
Internal,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DevToolsError {
pub kind: DevToolsErrorKind,
pub message: String,
}
impl DevToolsError {
pub fn new(kind: DevToolsErrorKind, message: impl Into<String>) -> Self {
Self {
kind,
message: message.into(),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum AutomationEvent {
TargetCreated(TargetLifecycleEvent),
TargetDestroyed(TargetLifecycleEvent),
TargetAttached(TargetAttachmentEvent),
TargetDetached(TargetDetachmentEvent),
NavigationFrame(NavigationFrameEvent),
NavigationStarted(NavigationLifecycleEvent),
DomContentLoaded(NavigationLifecycleEvent),
Load(NavigationLifecycleEvent),
PageLifecycle(PageLifecycleEvent),
SameDocumentNavigation(SameDocumentNavigationEvent),
LogEntryAdded(LogEntryEvent),
RuntimeConsoleApiCalled(RuntimeConsoleEvent),
RuntimeExecutionContextCreated(RuntimeExecutionContextEvent),
RuntimeExecutionContextDestroyed(RuntimeExecutionContextEvent),
RuntimeExecutionContextsCleared(RuntimeExecutionContextsClearedEvent),
UserPromptClosed(UserPromptClosedEvent),
PageJavaScriptDialogOpening(PageJavaScriptDialogOpeningEvent),
PageFileChooserOpened(PageFileChooserOpenedEvent),
BrowserDownloadWillBegin(BrowserDownloadWillBeginEvent),
BrowserDownloadProgress(BrowserDownloadProgressEvent),
DomSetChildNodes(DomSetChildNodesEvent),
ScriptMessage(ScriptMessageEvent),
ScriptException(ScriptExceptionEvent),
NetworkBeforeRequestSent(NetworkRequestEvent),
NetworkResponseStarted(NetworkRequestEvent),
NetworkResponseCompleted(NetworkRequestEvent),
NetworkFetchError(NetworkRequestEvent),
NetworkAuthRequired(NetworkRequestEvent),
RequestPaused(NetworkRequestEvent),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PageJavaScriptDialogOpeningEvent {
pub frame_id: Option<DevToolsFrameId>,
pub url: String,
pub message: String,
pub dialog_type: String,
pub has_browser_handler: bool,
pub default_prompt: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PageFileChooserOpenedEvent {
pub frame_id: DevToolsFrameId,
pub mode: String,
pub backend_node_id: u32,
pub element_shared_id: Option<DevToolsRemoteHandleId>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BrowserDownloadWillBeginEvent {
pub frame_id: DevToolsFrameId,
pub guid: String,
pub url: String,
pub suggested_filename: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BrowserDownloadProgressEvent {
pub guid: String,
pub state: String,
pub received_bytes: u64,
pub total_bytes: u64,
pub file_path: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DomSetChildNodesEvent {
pub parent_node_id: u32,
pub nodes: Vec<Value>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct UserPromptClosedEvent {
pub target_id: Option<DevToolsTargetId>,
pub frame_id: DevToolsFrameId,
pub prompt_type: String,
pub accepted: bool,
pub user_text: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TargetLifecycleEvent {
pub target_id: DevToolsTargetId,
pub browser_context_id: Option<DevToolsBrowserContextId>,
pub kind: DevToolsTargetKind,
pub url: String,
pub target_info: Option<DevToolsTargetInfo>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct TargetAttachmentEvent {
pub target_id: DevToolsTargetId,
pub session_id: DevToolsSessionId,
pub parent_session_id: Option<DevToolsSessionId>,
pub target_info: DevToolsTargetInfo,
pub waiting_for_debugger: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TargetDetachmentEvent {
pub target_id: DevToolsTargetId,
pub session_id: DevToolsSessionId,
pub parent_session_id: Option<DevToolsSessionId>,
pub reason: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NavigationFrameEventKind {
Scheduled,
Requested,
StartedNavigating,
StartedLoading,
ClearedScheduled,
Navigated,
DocumentUpdated,
StoppedLoading,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NavigationFrameEvent {
pub target_id: DevToolsTargetId,
pub frame_id: DevToolsFrameId,
pub parent_frame_id: Option<DevToolsFrameId>,
pub loader_id: Option<DevToolsLoaderId>,
pub url: String,
pub kind: NavigationFrameEventKind,
pub frame_name: Option<String>,
pub security_origin: Option<String>,
pub secure_context_type: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct NavigationLifecycleEvent {
pub target_id: DevToolsTargetId,
pub frame_id: DevToolsFrameId,
pub navigation_id: Option<DevToolsNavigationId>,
pub loader_id: Option<DevToolsLoaderId>,
pub url: String,
pub timestamp: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PageLifecycleEvent {
pub target_id: DevToolsTargetId,
pub frame_id: DevToolsFrameId,
pub loader_id: DevToolsLoaderId,
pub name: String,
pub timestamp: f64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SameDocumentNavigationEvent {
pub target_id: DevToolsTargetId,
pub frame_id: DevToolsFrameId,
pub url: String,
pub navigation_type: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct LogEntryEvent {
pub target_id: Option<DevToolsTargetId>,
pub source: String,
pub level: String,
pub text: String,
pub url: Option<String>,
pub timestamp: Option<f64>,
pub network_request_id: Option<String>,
pub args: Vec<DevToolsRemoteValue>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RuntimeConsoleEvent {
pub target_id: Option<DevToolsTargetId>,
pub console_type: String,
pub text: String,
pub args: Vec<Value>,
pub stack: Option<String>,
pub stack_trace: Option<DevToolsStackTrace>,
pub execution_context_id: Option<i64>,
pub timestamp: Option<f64>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RuntimeExecutionContextEvent {
pub target_id: Option<DevToolsTargetId>,
pub context_id: Option<i64>,
pub realm_id: Option<DevToolsRealmId>,
pub frame_id: Option<DevToolsFrameId>,
pub origin: Option<String>,
pub name: Option<String>,
pub is_default: Option<bool>,
pub context_type: Option<String>,
pub grant_universal_access: Option<bool>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RuntimeExecutionContextsClearedEvent {
pub target_id: Option<DevToolsTargetId>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ScriptMessageEvent {
pub target_id: Option<DevToolsTargetId>,
pub realm_id: Option<DevToolsRealmId>,
pub channel: String,
pub data: DevToolsRemoteValue,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ScriptExceptionEvent {
pub target_id: Option<DevToolsTargetId>,
pub url: Option<String>,
pub execution_context_id: Option<i64>,
pub exception_index: Option<usize>,
pub timestamp: Option<f64>,
pub exception: Box<DevToolsScriptException>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct NetworkRedirectResponseEvent {
pub url: String,
pub status: u16,
pub status_text: Option<String>,
pub response_headers: Vec<(String, Vec<u8>)>,
pub encoded_data_length: usize,
pub from_cache: bool,
pub response_protocol: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NetworkAuthChallengeEvent {
pub origin: String,
pub source: String,
pub scheme: String,
pub realm: String,
}
/// The resource classification carried by protocol-neutral network events.
///
/// Renderer and fetch internals keep their more precise loader-facing enums.
/// This enum represents the observable DevTools classification and is only
/// converted to a CDP token when an event is serialized at the protocol edge.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevToolsNetworkResourceType {
Document,
Stylesheet,
Image,
Media,
Font,
Script,
TextTrack,
Xhr,
Fetch,
Prefetch,
EventSource,
WebSocket,
Manifest,
SignedExchange,
Ping,
CspViolationReport,
Preflight,
FedCm,
Other,
}
impl DevToolsNetworkResourceType {
pub const fn as_cdp_type(self) -> &'static str {
match self {
Self::Document => "Document",
Self::Stylesheet => "Stylesheet",
Self::Image => "Image",
Self::Media => "Media",
Self::Font => "Font",
Self::Script => "Script",
Self::TextTrack => "TextTrack",
Self::Xhr => "XHR",
Self::Fetch => "Fetch",
Self::Prefetch => "Prefetch",
Self::EventSource => "EventSource",
Self::WebSocket => "WebSocket",
Self::Manifest => "Manifest",
Self::SignedExchange => "SignedExchange",
Self::Ping => "Ping",
Self::CspViolationReport => "CSPViolationReport",
Self::Preflight => "Preflight",
Self::FedCm => "FedCM",
Self::Other => "Other",
}
}
pub fn from_cdp_type(value: &str) -> Option<Self> {
Some(match value {
"Document" => Self::Document,
"Stylesheet" => Self::Stylesheet,
"Image" => Self::Image,
"Media" => Self::Media,
"Font" => Self::Font,
"Script" => Self::Script,
"TextTrack" => Self::TextTrack,
"XHR" => Self::Xhr,
"Fetch" => Self::Fetch,
"Prefetch" => Self::Prefetch,
"EventSource" => Self::EventSource,
"WebSocket" => Self::WebSocket,
"Manifest" => Self::Manifest,
"SignedExchange" => Self::SignedExchange,
"Ping" => Self::Ping,
"CSPViolationReport" => Self::CspViolationReport,
"Preflight" => Self::Preflight,
"FedCM" => Self::FedCm,
"Other" => Self::Other,
_ => return None,
})
}
pub fn from_fetch_interception_type(value: SubresourceResourceType) -> Self {
match value {
SubresourceResourceType::Fetch
| SubresourceResourceType::EventSource
| SubresourceResourceType::Xhr => Self::Xhr,
_ => value.into(),
}
}
}
impl From<SubresourceResourceType> for DevToolsNetworkResourceType {
fn from(value: SubresourceResourceType) -> Self {
match value {
SubresourceResourceType::Script => Self::Script,
SubresourceResourceType::Stylesheet => Self::Stylesheet,
SubresourceResourceType::Image => Self::Image,
SubresourceResourceType::Font => Self::Font,
SubresourceResourceType::Audio
| SubresourceResourceType::Video
| SubresourceResourceType::Media => Self::Media,
SubresourceResourceType::TextTrack => Self::TextTrack,
SubresourceResourceType::Fetch => Self::Fetch,
SubresourceResourceType::EventSource => Self::EventSource,
SubresourceResourceType::Xhr => Self::Xhr,
SubresourceResourceType::Ping => Self::Ping,
SubresourceResourceType::CspReport => Self::CspViolationReport,
SubresourceResourceType::Dictionary => Self::Other,
SubresourceResourceType::Manifest => Self::Manifest,
SubresourceResourceType::WebSocket => Self::WebSocket,
}
}
}
#[cfg(test)]
mod network_resource_type_tests {
use super::{DevToolsNetworkResourceType, SubresourceResourceType};
#[test]
fn devtools_network_resource_types_round_trip_cdp_tokens() {
for (resource_type, token) in [
(DevToolsNetworkResourceType::Document, "Document"),
(DevToolsNetworkResourceType::Stylesheet, "Stylesheet"),
(DevToolsNetworkResourceType::Image, "Image"),
(DevToolsNetworkResourceType::Media, "Media"),
(DevToolsNetworkResourceType::Font, "Font"),
(DevToolsNetworkResourceType::Script, "Script"),
(DevToolsNetworkResourceType::TextTrack, "TextTrack"),
(DevToolsNetworkResourceType::Xhr, "XHR"),
(DevToolsNetworkResourceType::Fetch, "Fetch"),
(DevToolsNetworkResourceType::Prefetch, "Prefetch"),
(DevToolsNetworkResourceType::EventSource, "EventSource"),
(DevToolsNetworkResourceType::WebSocket, "WebSocket"),
(DevToolsNetworkResourceType::Manifest, "Manifest"),
(
DevToolsNetworkResourceType::SignedExchange,
"SignedExchange",
),
(DevToolsNetworkResourceType::Ping, "Ping"),
(
DevToolsNetworkResourceType::CspViolationReport,
"CSPViolationReport",
),
(DevToolsNetworkResourceType::Preflight, "Preflight"),
(DevToolsNetworkResourceType::FedCm, "FedCM"),
(DevToolsNetworkResourceType::Other, "Other"),
] {
assert_eq!(resource_type.as_cdp_type(), token);
assert_eq!(
DevToolsNetworkResourceType::from_cdp_type(token),
Some(resource_type)
);
}
assert_eq!(
DevToolsNetworkResourceType::from_cdp_type("FutureResourceType"),
None
);
}
#[test]
fn subresource_resource_types_convert_without_stringly_typed_intermediate_state() {
assert_eq!(
DevToolsNetworkResourceType::from(SubresourceResourceType::Audio),
DevToolsNetworkResourceType::Media
);
assert_eq!(
DevToolsNetworkResourceType::from(SubresourceResourceType::Dictionary),
DevToolsNetworkResourceType::Other
);
for resource_type in [
SubresourceResourceType::Fetch,
SubresourceResourceType::EventSource,
SubresourceResourceType::Xhr,
] {
assert_eq!(
DevToolsNetworkResourceType::from_fetch_interception_type(resource_type),
DevToolsNetworkResourceType::Xhr
);
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct NetworkRequestEvent {
pub target_id: DevToolsTargetId,
pub frame_id: Option<DevToolsFrameId>,
pub request_id: DevToolsRequestId,
pub loader_id: Option<DevToolsLoaderId>,
pub network_id: Option<DevToolsRequestId>,
pub url: String,
pub document_url: Option<String>,
pub method: Option<String>,
pub request_headers: Vec<(String, String)>,
pub request_body: Option<String>,
pub request_initiator_type: Option<String>,
pub bidi_request_initiator_type: Option<String>,
pub redirect_response: Option<NetworkRedirectResponseEvent>,
pub redirect_has_extra_info: bool,
pub request_cookie_report: Option<StoredCookieQueryReport>,
pub resource_type: Option<DevToolsNetworkResourceType>,
pub timestamp: Option<f64>,
pub wall_time: Option<f64>,
pub status: Option<u16>,
pub status_text: Option<String>,
pub response_headers: Vec<(String, Vec<u8>)>,
pub response_mime_type: Option<String>,
pub response_protocol: Option<String>,
pub encoded_data_length: Option<usize>,
pub from_cache: bool,
pub has_extra_info: bool,
pub error_text: Option<String>,
pub loading_failed_canceled: bool,
pub blocked_intercepts: Vec<DevToolsNetworkInterceptId>,
pub fetch_request_id: Option<DevToolsFetchRequestId>,
pub auth_challenge: Option<NetworkAuthChallengeEvent>,
}