1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
use std::io;
use std::time::Instant;
use async_tungstenite::tungstenite;
use base64::DecodeError;
use futures::channel::mpsc::SendError;
use futures::channel::oneshot::Canceled;
use thiserror::Error;
use chromiumoxide_cdp::cdp::browser_protocol::page::FrameId;
use crate::handler::frame::NavigationError;
use chromiumoxide_cdp::cdp::js_protocol::runtime::ExceptionDetails;
pub type Result<T, E = CdpError> = std::result::Result<T, E>;
#[derive(Debug, Error)]
pub enum CdpError {
#[error("{0}")]
Ws(#[from] tungstenite::Error),
#[error("{0}")]
Io(#[from] io::Error),
#[error("{0}")]
Serde(#[from] serde_json::Error),
#[error("{0}")]
Chrome(#[from] chromiumoxide_types::Error),
#[error("Received no response from the chromium instance.")]
NoResponse,
#[error("{0}")]
ChannelSendError(#[from] ChannelError),
#[error("Request timed out.")]
Timeout,
#[error("FrameId {0:?} not found.")]
FrameNotFound(FrameId),
#[error("{0}")]
ChromeMessage(String),
#[error("{0}")]
DecodeError(#[from] DecodeError),
#[error("{0}")]
ScrollingFailed(String),
#[error("Requested value not found.")]
NotFound,
#[error("{0:?}")]
JavascriptException(Box<ExceptionDetails>),
}
impl CdpError {
pub fn msg(msg: impl Into<String>) -> Self {
CdpError::ChromeMessage(msg.into())
}
}
#[derive(Debug, Error)]
pub enum ChannelError {
#[error("{0}")]
Send(#[from] SendError),
#[error("{0}")]
Canceled(#[from] Canceled),
}
impl From<Canceled> for CdpError {
fn from(err: Canceled) -> Self {
ChannelError::from(err).into()
}
}
impl From<SendError> for CdpError {
fn from(err: SendError) -> Self {
ChannelError::from(err).into()
}
}
impl From<NavigationError> for CdpError {
fn from(err: NavigationError) -> Self {
match err {
NavigationError::Timeout { .. } => CdpError::Timeout,
NavigationError::FrameNotFound { frame, .. } => CdpError::FrameNotFound(frame),
}
}
}
#[derive(Debug, Clone)]
pub struct DeadlineExceeded {
pub deadline: Instant,
pub now: Instant,
}
impl DeadlineExceeded {
pub fn new(now: Instant, deadline: Instant) -> Self {
assert!(now > deadline);
Self { now, deadline }
}
}