web_extensions/tabs/
on_zoom_change.rs

1use super::prelude::*;
2
3/// <https://developer.chrome.com/docs/extensions/reference/tabs/#event-onZoomChange>
4pub fn on_zoom_change() -> OnZoomChange {
5    OnZoomChange(tabs().on_zoom_change())
6}
7
8/// <https://developer.chrome.com/docs/extensions/reference/tabs/#event-onZoomChange>
9pub struct OnZoomChange(sys::EventTarget);
10
11pub struct OnZoomChangeEventListener<'a>(EventListener<'a, dyn FnMut(sys::TabZoomChangeInfo)>);
12
13impl OnZoomChangeEventListener<'_> {
14    pub fn forget(self) {
15        self.0.forget()
16    }
17}
18
19impl OnZoomChange {
20    pub fn add_listener<L>(&self, mut listener: L) -> OnZoomChangeEventListener
21    where
22        L: FnMut(ZoomChangeInfo) + 'static,
23    {
24        let listener =
25            Closure::new(move |info: sys::TabZoomChangeInfo| listener(ZoomChangeInfo::from(info)));
26        OnZoomChangeEventListener(EventListener::raw_new(&self.0, listener))
27    }
28}
29
30#[derive(Debug, Deserialize)]
31#[serde(rename_all = "camelCase")]
32pub struct ZoomChangeInfo {
33    // TODO: Add more fields from https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onZoomChange#ZoomChangeInfo
34    pub new_zoom_factor: f64,
35    pub old_zoom_factor: f64,
36    pub tab_id: i32,
37}
38
39impl From<sys::TabZoomChangeInfo> for ZoomChangeInfo {
40    fn from(info: sys::TabZoomChangeInfo) -> Self {
41        Self {
42            new_zoom_factor: info.new_zoom_factor(),
43            old_zoom_factor: info.old_zoom_factor(),
44            tab_id: info.tab_id(),
45        }
46    }
47}