Skip to main content

allwright/
client_tab_accessibility.rs

1use 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}