web_extensions/tabs/
on_detached.rs

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