web_extensions/tabs/
on_highlighted.rs

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