Skip to main content

browser_commander/core/
constants.rs

1//! Common constants used across the browser automation library.
2//!
3//! This module contains timing constants and Chrome arguments used for
4//! browser operations.
5
6use std::time::Duration;
7
8/// Chrome arguments Browser Commander used to add to every launch.
9///
10/// Since issue #103 no launch adds them by default: the browser starts with
11/// only `--user-data-dir` and `--remote-debugging-port`, like a hand-started
12/// Chrome. The same switches are available as the opt-in `legacy-defaults`
13/// launch restriction preset (see [`crate::browser::restrictions`]); the
14/// constant is kept, equal to that preset's switches, for compatibility.
15pub const CHROME_ARGS: &[&str] = &[
16    "--disable-session-crashed-bubble",
17    "--hide-crash-restore-bubble",
18    "--disable-infobars",
19    "--password-store=basic",
20    "--no-first-run",
21    "--no-default-browser-check",
22    "--disable-crash-restore",
23];
24
25/// Timing constants for browser operations.
26///
27/// These durations are used throughout the library to control
28/// wait times, timeouts, and animation durations.
29#[derive(Debug, Clone, Copy)]
30pub struct Timing {
31    /// Wait time for scroll animations to complete.
32    pub scroll_animation_wait: Duration,
33    /// Default wait after scrolling to element.
34    pub default_wait_after_scroll: Duration,
35    /// Timeout for quick visibility checks.
36    pub visibility_check_timeout: Duration,
37    /// Default timeout for most operations.
38    pub default_timeout: Duration,
39    /// Default timeout for navigation operations.
40    pub navigation_timeout: Duration,
41    /// Default timeout for action verification.
42    pub verification_timeout: Duration,
43    /// Interval between verification retries.
44    pub verification_retry_interval: Duration,
45}
46
47impl Default for Timing {
48    fn default() -> Self {
49        Self {
50            scroll_animation_wait: Duration::from_millis(300),
51            default_wait_after_scroll: Duration::from_millis(1000),
52            visibility_check_timeout: Duration::from_millis(100),
53            default_timeout: Duration::from_millis(5000),
54            navigation_timeout: Duration::from_millis(30000),
55            verification_timeout: Duration::from_millis(3000),
56            verification_retry_interval: Duration::from_millis(100),
57        }
58    }
59}
60
61/// Default timing configuration.
62pub static TIMING: std::sync::LazyLock<Timing> = std::sync::LazyLock::new(Timing::default);
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn chrome_args_is_not_empty() {
70        assert!(!CHROME_ARGS.is_empty());
71    }
72
73    #[test]
74    fn chrome_args_contains_expected_arguments() {
75        assert!(CHROME_ARGS.contains(&"--disable-infobars"));
76        assert!(CHROME_ARGS.contains(&"--password-store=basic"));
77        assert!(CHROME_ARGS.contains(&"--no-first-run"));
78        assert!(CHROME_ARGS.contains(&"--no-default-browser-check"));
79    }
80
81    #[test]
82    fn chrome_args_contains_crash_related_flags() {
83        assert!(CHROME_ARGS.contains(&"--disable-session-crashed-bubble"));
84        assert!(CHROME_ARGS.contains(&"--hide-crash-restore-bubble"));
85        assert!(CHROME_ARGS.contains(&"--disable-crash-restore"));
86    }
87
88    #[test]
89    fn chrome_args_has_at_least_5_arguments() {
90        assert!(CHROME_ARGS.len() >= 5);
91    }
92
93    #[test]
94    fn timing_default_values_are_reasonable() {
95        let timing = Timing::default();
96
97        // All timeouts should be positive
98        assert!(timing.scroll_animation_wait > Duration::ZERO);
99        assert!(timing.default_wait_after_scroll > Duration::ZERO);
100        assert!(timing.visibility_check_timeout > Duration::ZERO);
101        assert!(timing.default_timeout > Duration::ZERO);
102        assert!(timing.navigation_timeout > Duration::ZERO);
103        assert!(timing.verification_timeout > Duration::ZERO);
104        assert!(timing.verification_retry_interval > Duration::ZERO);
105
106        // Navigation timeout should be longer than default timeout
107        assert!(timing.navigation_timeout > timing.default_timeout);
108    }
109
110    #[test]
111    fn timing_scroll_animation_wait_is_300ms() {
112        let timing = Timing::default();
113        assert_eq!(timing.scroll_animation_wait, Duration::from_millis(300));
114    }
115
116    #[test]
117    fn timing_default_wait_after_scroll_is_1000ms() {
118        let timing = Timing::default();
119        assert_eq!(
120            timing.default_wait_after_scroll,
121            Duration::from_millis(1000)
122        );
123    }
124
125    #[test]
126    fn timing_visibility_check_timeout_is_100ms() {
127        let timing = Timing::default();
128        assert_eq!(timing.visibility_check_timeout, Duration::from_millis(100));
129    }
130
131    #[test]
132    fn timing_default_timeout_is_5000ms() {
133        let timing = Timing::default();
134        assert_eq!(timing.default_timeout, Duration::from_millis(5000));
135    }
136
137    #[test]
138    fn timing_navigation_timeout_is_30000ms() {
139        let timing = Timing::default();
140        assert_eq!(timing.navigation_timeout, Duration::from_millis(30000));
141    }
142}