allwright/
client_tab_accessibility.rs1use super::command::command_retry_options;
2use super::tab::ensure_tab_open;
3use super::types::{
4 AccessibilitySnapshotFormat, AccessibilitySnapshotMode, AccessibilitySnapshotOptions, Error,
5 Result, Tab,
6};
7use crate::proto::context_session_command::Command;
8use crate::proto::context_session_event::Event;
9use crate::proto::{AccessibilitySnapshotCommand, ContextSessionCommand};
10
11impl Tab {
12 pub async fn accessibility_snapshot(&self) -> Result<String> {
13 self.accessibility_snapshot_with_options(AccessibilitySnapshotOptions::default())
14 .await
15 }
16
17 pub async fn accessibility_snapshot_with_options(
18 &self,
19 options: AccessibilitySnapshotOptions,
20 ) -> Result<String> {
21 let mut state = self.inner.state.lock().await;
22 let handle = self.ensure_handle(&mut state).await?;
23 ensure_tab_open(handle, &self.inner.session_id)?;
24 handle
25 .command_tx
26 .send(ContextSessionCommand {
27 surface_session_id: self.inner.surface_session_id.clone(),
28 context_session_id: self.inner.session_id.clone(),
29 command: Some(Command::AccessibilitySnapshot(
30 AccessibilitySnapshotCommand {
31 format: match options.format {
32 AccessibilitySnapshotFormat::Json => "json",
33 AccessibilitySnapshotFormat::Yaml => "yaml",
34 }
35 .into(),
36 mode: match options.mode {
37 AccessibilitySnapshotMode::Default => "default",
38 AccessibilitySnapshotMode::Ai => "ai",
39 AccessibilitySnapshotMode::Autoexpect => "autoexpect",
40 AccessibilitySnapshotMode::Codegen => "codegen",
41 }
42 .into(),
43 retry_options: command_retry_options(options.timeout_ms),
44 },
45 )),
46 })
47 .await
48 .map_err(|_| Error::new("failed to send AccessibilitySnapshotCommand"))?;
49 loop {
50 let event = handle.events.message().await?.ok_or_else(|| {
51 Error::new("page session closed while capturing accessibility snapshot")
52 })?;
53 match event.event {
54 Some(Event::AccessibilitySnapshotCaptured(result)) => return Ok(result.snapshot),
55 Some(Event::Error(error)) => return Err(Error::new(error.message)),
56 Some(Event::Closed(_)) => {
57 handle.closed = true;
58 return Err(Error::new(
59 "page session closed while capturing accessibility snapshot",
60 ));
61 }
62 _ => {}
63 }
64 }
65 }
66}