web_extensions/tabs/
tab.rs

1use super::{prelude::*, Status};
2
3/// <https://developer.chrome.com/docs/extensions/reference/tabs/#type-Tab>
4#[derive(Debug, PartialEq, Eq, Deserialize)]
5#[serde(rename_all = "camelCase")]
6pub struct Tab {
7    pub active: bool,
8    pub audible: Option<bool>,
9    pub auto_discardable: bool,
10    pub discarded: bool,
11    pub fav_icon_url: Option<String>,
12    pub group_id: i32,
13    pub height: Option<u32>,
14    pub highlighted: bool,
15    pub id: Option<TabId>,
16    pub incognito: bool,
17    pub index: u32,
18    // TODO: muted_info
19    pub opener_tab_id: Option<TabId>,
20    pub pending_url: Option<String>,
21    pub pinned: bool,
22    pub session_id: Option<String>,
23    pub status: Option<Status>,
24    pub title: Option<String>,
25    pub url: Option<String>,
26    pub width: Option<u32>,
27    pub window_id: i32,
28}
29
30impl From<sys::Tab> for Tab {
31    fn from(info: sys::Tab) -> Self {
32        let status = info.status().map(|s| Status::try_from(s).expect("status"));
33        let id = info.id().map(TabId::from);
34        let opener_tab_id = info.opener_tab_id().map(TabId::from);
35        Self {
36            id,
37            opener_tab_id,
38            status,
39            active: info.active(),
40            audible: info.audible(),
41            auto_discardable: info.auto_discardable(),
42            discarded: info.discarded(),
43            fav_icon_url: info.fav_icon_url(),
44            group_id: info.group_id(),
45            height: info.height(),
46            highlighted: info.highlighted(),
47            incognito: info.incognito(),
48            index: info.index(),
49            pending_url: info.pending_url(),
50            pinned: info.pinned(),
51            session_id: info.session_id(),
52            title: info.title(),
53            url: info.url(),
54            width: info.width(),
55            window_id: info.window_id(),
56        }
57    }
58}