Skip to main content

cbf_chrome/data/
tab_open.rs

1//! Chromium-facing tab-open hint and result types, mapping between Chromium tab semantics and generic browsing context open semantics.
2
3use super::{
4    browsing_context_open::{ChromeBrowsingContextOpenHint, ChromeBrowsingContextOpenResult},
5    ids::TabId,
6};
7
8/// Chromium-facing hint describing how opener requested a tab.
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum TabOpenHint {
11    Unknown,
12    CurrentTab,
13    NewForegroundTab,
14    NewBackgroundTab,
15    NewWindow,
16    Popup,
17}
18
19impl TabOpenHint {
20    /// Convert into generic-layer hint only for non-window-open cases.
21    pub const fn to_browsing_context_open_hint(self) -> Option<ChromeBrowsingContextOpenHint> {
22        match self {
23            TabOpenHint::Unknown => Some(ChromeBrowsingContextOpenHint::Unknown),
24            TabOpenHint::CurrentTab => Some(ChromeBrowsingContextOpenHint::CurrentContext),
25            TabOpenHint::NewForegroundTab => {
26                Some(ChromeBrowsingContextOpenHint::NewForegroundContext)
27            }
28            TabOpenHint::NewBackgroundTab => {
29                Some(ChromeBrowsingContextOpenHint::NewBackgroundContext)
30            }
31            TabOpenHint::NewWindow | TabOpenHint::Popup => None,
32        }
33    }
34}
35
36impl From<ChromeBrowsingContextOpenHint> for TabOpenHint {
37    fn from(value: ChromeBrowsingContextOpenHint) -> Self {
38        match value {
39            ChromeBrowsingContextOpenHint::Unknown => Self::Unknown,
40            ChromeBrowsingContextOpenHint::CurrentContext => Self::CurrentTab,
41            ChromeBrowsingContextOpenHint::NewForegroundContext => Self::NewForegroundTab,
42            ChromeBrowsingContextOpenHint::NewBackgroundContext => Self::NewBackgroundTab,
43        }
44    }
45}
46
47/// Chromium-facing result emitted after backend applies tab-open response.
48#[derive(Debug, Clone, Copy, PartialEq, Eq)]
49pub enum TabOpenResult {
50    OpenedNewTab { tab_id: TabId },
51    OpenedExistingTab { tab_id: TabId },
52    Denied,
53    Aborted,
54}
55
56impl From<TabOpenResult> for ChromeBrowsingContextOpenResult {
57    fn from(value: TabOpenResult) -> Self {
58        match value {
59            TabOpenResult::OpenedNewTab { tab_id } => Self::OpenedNewContext { tab_id },
60            TabOpenResult::OpenedExistingTab { tab_id } => Self::OpenedExistingContext { tab_id },
61            TabOpenResult::Denied => Self::Denied,
62            TabOpenResult::Aborted => Self::Aborted,
63        }
64    }
65}
66
67impl From<ChromeBrowsingContextOpenResult> for TabOpenResult {
68    fn from(value: ChromeBrowsingContextOpenResult) -> Self {
69        match value {
70            ChromeBrowsingContextOpenResult::OpenedNewContext { tab_id } => {
71                Self::OpenedNewTab { tab_id }
72            }
73            ChromeBrowsingContextOpenResult::OpenedExistingContext { tab_id } => {
74                Self::OpenedExistingTab { tab_id }
75            }
76            ChromeBrowsingContextOpenResult::Denied => Self::Denied,
77            ChromeBrowsingContextOpenResult::Aborted => Self::Aborted,
78        }
79    }
80}
81
82#[cfg(test)]
83mod tests {
84    use crate::data::{
85        browsing_context_open::{ChromeBrowsingContextOpenHint, ChromeBrowsingContextOpenResult},
86        ids::TabId,
87    };
88
89    use super::{TabOpenHint, TabOpenResult};
90
91    #[test]
92    fn tab_open_hint_round_trip() {
93        assert_eq!(
94            TabOpenHint::from(ChromeBrowsingContextOpenHint::CurrentContext),
95            TabOpenHint::CurrentTab
96        );
97        assert_eq!(
98            TabOpenHint::NewBackgroundTab.to_browsing_context_open_hint(),
99            Some(ChromeBrowsingContextOpenHint::NewBackgroundContext)
100        );
101        assert_eq!(TabOpenHint::Popup.to_browsing_context_open_hint(), None);
102    }
103
104    #[test]
105    fn tab_open_result_round_trip() {
106        let raw = TabOpenResult::OpenedExistingTab {
107            tab_id: TabId::new(42),
108        };
109        let chrome_result = ChromeBrowsingContextOpenResult::from(raw);
110        let round_trip = TabOpenResult::from(chrome_result);
111
112        assert_eq!(round_trip, raw);
113    }
114}