web_extensions/tabs/
on_removed.rs

1use super::prelude::*;
2
3/// <https://developer.chrome.com/docs/extensions/reference/tabs/#event-onRemoved>
4pub fn on_removed() -> OnRemoved {
5    OnRemoved(tabs().on_removed())
6}
7
8/// <https://developer.chrome.com/docs/extensions/reference/tabs/#event-onRemoved>
9pub struct OnRemoved(sys::EventTarget);
10
11pub struct OnRemovedEventListener<'a>(EventListener<'a, dyn FnMut(i32, sys::TabRemoveInfo)>);
12
13impl OnRemovedEventListener<'_> {
14    pub fn forget(self) {
15        self.0.forget()
16    }
17}
18
19impl OnRemoved {
20    pub fn add_listener<L>(&self, mut listener: L) -> OnRemovedEventListener
21    where
22        L: FnMut(TabId, RemoveInfo) + 'static,
23    {
24        let listener = Closure::new(move |tab_id: i32, info: sys::TabRemoveInfo| {
25            listener(TabId::from(tab_id), RemoveInfo::from(info))
26        });
27        OnRemovedEventListener(EventListener::raw_new(&self.0, listener))
28    }
29}
30
31#[derive(Debug, Deserialize)]
32#[serde(rename_all = "camelCase")]
33pub struct RemoveInfo {
34    pub window_id: i32,
35    pub is_window_closing: bool,
36}
37
38impl From<sys::TabRemoveInfo> for RemoveInfo {
39    fn from(info: sys::TabRemoveInfo) -> Self {
40        Self {
41            window_id: info.window_id(),
42            is_window_closing: info.is_window_closing(),
43        }
44    }
45}